CherryPy позади обратного прокси Nginx запросы POST повреждается/усеченным

Я поместил свое использование приложения Cherrypy 3.1.2 позади Nginx, настроенного как обратный прокси. Все работает правильно для, ПОЛУЧАЮТ запросы, но весь HTTP 400 возврата запросов POST - Уродливый заголовок.

Я проследил в исходный код WSGI-сервера CherryPy для наблюдения обрабатывающего запрос кода и узнал, что, если для ДОБИРАЮТСЯ, запрашивает, чтобы первая строка запроса правильно читала как, например:

GET /home HTTP/1.0

поскольку POST запрашивает, чтобы он был похож:

<HTTP headers truncated at front>

POST /home HTTP/1.0

Таким образом вместо правильно сформированного запроса, содержащего, ПОЛУЧАЮТ/POST строку запроса, сопровождаемую HTTP-заголовками, поскольку POST запрашивает, чтобы мое приложение получило от Nginx:

  1. Первые строки HTTP-заголовка, усеченные от запуска некоторым числом байтов
  2. Затем пустая строка, указывающая на конец, отравляется большой дозой наркотика HTTP-заголовки
  3. ЗАТЕМ "POST / размещает HTTP/1.0", который ясно ожидался как первая строка запроса.
  4. Править: Это - конец запроса, таким образом, нет также НИКАКИХ данных тела, которые должны следовать за HTTP заголовки POST.

Кроме того, число байтов усечения от p.1, кажется, зависит от сколько данных POST, там находится на форме, например, чем больше символов я ввожу в / домашние поля FORM, тем удалено больше символов в HTTP-заголовки.

По-видимому, Nginx так или иначе повреждает заголовок, когда он передает его вышестоящему серверу (мое приложение).
НО: когда я только для теста сделал перенаправление Nginx к некоторым внешним веб-сайтам (использующий запросы POST также) - все идет прекрасное.

Таким образом, я теперь довольно застреваю.

Моя конфигурация: Windows XP Профессор, Python/2.5.1, CherryPy/3.1.2, Nginx/0.8.32
Браузеры: FireFox 2.0, IE 7.0
Мое приложение (работающий автономный) обычно работает и протестированное в соответствии со многими конфигурациями.

Я использую довольно основную конфигурацию Nginx как:

upstream backend {
    server localhost:8088 weight=1;
}
server {
    listen 80;
    server_name  localhost;

    location / {
        #proxy_read_timeout 300;

        proxy_pass http://backend;
        #proxy_redirect default;
    }
}

Хотя попробовано много других примеров и конфигураций proxy_pass найдены в сети.

Какие-либо идеи, где искать проблему? Конфигурация Nginx, мое приложение CherryPy или в другом месте?

НОВЫЙ: Я нашел, что это работает правильно, но только для запросов POST, имеющих нулевую длину содержимого тела (сделал пустое без любых полей для тестирования этого).
И проверенный, что количество байтов, усеченных с начала, равно Довольной длине + некоторое маленькое количество константы (вероятно, 2).

8
задан Adam Kania 16 February 2010 в 17:49
поделиться

1 ответ

вы можете попробовать параметры:

ignore_invalid_headers   on;
sendfile                 on;

в блоке http ... также можете попробовать отключить пакеты поддержки активности и убедиться, что вы регистрируете доступ / ошибки для отладки.

1
ответ дан 6 December 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: