CherryPy за POST-запросами обратного прокси-сервера Nginx поврежден / усечен - PullRequest
8 голосов
/ 16 февраля 2010

Я разместил свое приложение, используя Cherrypy 3.1.2, за Nginx, настроенным как обратный прокси-сервер. Все работает правильно для запросов GET, но все запросы POST возвращают HTTP 400 - неправильно сформированный заголовок.

Я проследил в исходный код CherryPy WSGI-Server, чтобы увидеть код обработки запроса, и обнаружил, что если для запросов GET первая строка запроса правильно выглядит, например, как:

GET /home HTTP/1.0

для запросов POST это выглядит как:

<HTTP headers truncated at front>

POST /home HTTP/1.0

Таким образом, вместо правильно сформированного запроса, содержащего строку запроса GET / POST, за которой следуют заголовки HTTP, для запросов POST мое приложение получает от Nginx:

  1. Первые строки заголовка HTTP, усеченные от начала до некоторого количества байтов
  2. Затем пустая строка, указывающая конец od заголовков HTTP
  3. ТОГДА «POST / home HTTP / 1.0», который явно ожидался в качестве первой строки запроса.
  4. РЕДАКТИРОВАТЬ: Это конец запроса, так что нет никаких данных тела, которые должны следовать заголовки HTTP POST.

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

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

Так что я сейчас застрял.

Моя конфигурация: Windows XP Prof, 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 или другое?

NEW: Я обнаружил, что он работает правильно, но только для запросов POST, имеющих нулевую длину содержимого тела (пустое поле без каких-либо полей для проверки).
И проверил, что количество байтов, усеченных в начале, равно Content-length + некоторое небольшое число const (вероятно, 2).

1 Ответ

1 голос
/ 10 июня 2010

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

ignore_invalid_headers   on;
sendfile                 on;

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

...