Почему Gunicorn разбирает WSGI напрямую?

Когда мы используем gunicorn за nginx, нам всегда нужно proxy_pass запрос к gunicorn. Но у Nginx есть модуль wsgi, который позволяет ему отправлять запрос wsgi (uwsgi_pass) на сервер приложений wsgi, и похоже, что gunicorn не может принимать запрос wsgi напрямую, он просто принимает HTTP-запрос и переводит его в wsgi и вызывает приложение wsgi.

Поддерживает ли Gunicorn прямой прием запросов WSGI?

Если нет, что я могу сделать, если у Nginx есть некоторые параметры wsgi env, которые необходимо отправить на сервер приложений wsgi?


person Matthewgao    schedule 21.07.2015    source источник


Ответы (1)


Протокол wsgi не существует.

Спецификация WSGI определяет программный API для Python, а не протокол сокетов.

Вы не понимаете, что такое протокол сокетов под названием uwsgi. Это полностью отличается от протокола HTTP, который принимает Gunicorn.

Единственное, что вы можете использовать за nginx, который понимает протокол uwsgi, - это пакет uWSGI.

Ваш выбор - использовать обычное HTTP-проксирование и gunicorn, или проксирование uwsgi и uWSGI.

person Graham Dumpleton    schedule 21.07.2015
comment
Итак, что касается WSGI, он все еще основан на протоколе HTTP, верно? - person Matthewgao; 21.07.2015
comment
Что я могу сделать, если я хочу передать некоторые самоопределяемые параметры в Gunicorn? - person Matthewgao; 21.07.2015
comment
Нет, интерфейс WSGI API строго не привязан к HTTP. Пакет uWSGI служит мостом между протоколом uwsgi и интерфейсом API WSGI. Если вы хотите передать параметры процесса в ваше приложение WSGI, работающее под управлением Gunicorn, используйте переменные среды. Для чего нужны параметры? - person Graham Dumpleton; 21.07.2015
comment
Это идентификатор подключения, который принадлежит внутреннему серверу с частным протоколом, у меня есть модуль Nginx для подключения к этому серверу, поэтому я должен доставить его в приложение wsgi, потому что ему нужно взаимодействовать с этим сервером, используя этот connectionID. - person Matthewgao; 21.07.2015
comment
Посмотрите, позволяет ли nginx передавать идентификатор соединения через специальный HTTP-заголовок X-Connection-ID. Независимо от того, проксируете ли вы через HTTP или протокол uwsgi, если вы можете каким-то образом установить заголовок, когда запрос проксируется, серверная часть должна его видеть. - person Graham Dumpleton; 22.07.2015
comment
Да, я так думаю, спасибо, Грэм! - person Matthewgao; 22.07.2015