Я разместил свое приложение, используя 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:
- Первые строки заголовка HTTP, усеченные от начала до некоторого количества байтов
- Затем пустая строка, указывающая конец od заголовков HTTP
- ТОГДА «POST / home HTTP / 1.0», который явно ожидался в качестве первой строки запроса.
- РЕДАКТИРОВАТЬ: Это конец запроса, так что нет никаких данных тела, которые должны следовать заголовки 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).