Что происходит, когда я устанавливаю app.wsgi_app = ProxyFix(app.wsgi_app) при запуске приложения Flask на пушке?

Я создал базовое веб-приложение с помощью Flask и смог запустить его с виртуальной машины, используя собственный http-сервер. Я быстро понял, что при такой настройке запросы блокируются (я не мог выполнять одновременные запросы на ресурсы; любой новый запрос будет ждать завершения предыдущих запросов), и решил попробовать запустить приложение gunicorn для решения этой проблемы. Я следовал документации, в частности, с этой строкой:

gunicorn -w 4 -b 127.0.0.1:4000 myproject:app 

Однако он не смог загрузиться, сделав только это, и пожаловался, что нет приложения WSGI. Покопавшись в Интернете, я обнаружил, что несколько человек разместили примеры, включая следующие:

from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)

Я добавил это, и это решило мою проблему. Я сбит с толку, потому что это, по-видимому, предназначено для решения проблемы, связанной с HTTP-прокси, но будет ли добавление gunicorn навязывать HTTP-прокси? Или я всегда был за прокси, и это просто не имело значения для встроенного сервера Flask?

Кроме того, документация Werkzeug по Fixers предупреждает: "Не используйте это промежуточное ПО в настройках без прокси-сервера". из соображений безопасности». Учитывая, что исправление было явно необходимо, могу ли я предположить, что я настроил прокси?


person Ashley Temple    schedule 14.12.2013    source источник
comment
+1 - хороший вопрос. Вопрос к вам: были ли эти две строки единственными элементами, которые вы изменили перед повторным развертыванием?   -  person Sean Vieira    schedule 14.12.2013
comment
Ага. Сначала я попробовал еще пару вещей, но удалил все, что связано с другими попытками, когда они не смогли решить проблему.   -  person Ashley Temple    schedule 15.12.2013
comment
Вы получаете сообщения об ошибках от Gunicorn? ProxyFix просто изменяет некоторые переменные среды, поэтому вы получаете правильные данные через прокси. Также какую версию Flask и Werkzeug вы используете?   -  person Joe Doherty    schedule 16.12.2013
comment
Я удивлен, что gunicorn не загружается без этого. Единственные проблемы, которые этот фиксер должен решить, связаны с обратным проксированием, т.е. когда вы получаете 127.0.0.1 в качестве адреса клиента, потому что запрос к gunicorn исходит от nginx. Если вам интересно, что на самом деле делает фиксер, я думаю, источник достаточно ясен: github.com/mitsuhiko/werkzeug/blob/master/werkzeug/contrib/   -  person Markus Unterwaditzer    schedule 30.12.2013
comment
Вероятно, вам следует проверить файл журнала gunicorn, чтобы увидеть, есть ли более подробное сообщение об ошибке. Кроме того, если вы указываете на объект wsgi_app, используя путь к модулю в каком-либо файле конфигурации, вы должны убедиться, что в модуле есть ссылка на wsgi_app как на объект верхнего уровня. В вашем примере похоже, что wsgi_app является атрибутом какого-то другого объекта в модуле, что может не позволить получить к нему доступ через путь к модулю, то есть «my_project.wsgi_module.app.wsgi_app», вероятно, не будет работать, но « my_project.wsgi_module.app' будет. Может проблема не в этом, но посмотреть стоит.   -  person David Sanders    schedule 14.02.2014
comment
Вы на самом деле заходите в свое веб-приложение по адресу localhost:4000? Обычно gunicorn запускается за другим веб-сервером, например Apache или nginx, в режиме обратного прокси. Я до сих пор не уверен, зачем вам нужен ProxyFix, чтобы даже запустить пушкикорн.   -  person sjy    schedule 04.03.2014


Ответы (2)


Вам нужно показать код, который определяет ваше приложение Flask «приложение».

Где определяется «приложение»? Вы импортируете его из другого файла?

Вот моя попытка воспроизвести проблему:

$ cat myproject.py
from flask import Flask

app = Flask(__name__)

@app.route("/")
def index():
    return "ok"

$ bin/gunicorn -w 4 -b 127.0.0.1:4000 myproject:app &
[1] 27435

2014-03-04 12:18:36 [27435] [INFO] Starting gunicorn 18.0
2014-03-04 12:18:36 [27435] [INFO] Listening at: http://127.0.0.1:4000 (27435)
2014-03-04 12:18:36 [27435] [INFO] Using worker: sync
2014-03-04 12:18:36 [27441] [INFO] Booting worker with pid: 27441
2014-03-04 12:18:36 [27442] [INFO] Booting worker with pid: 27442
2014-03-04 12:18:36 [27445] [INFO] Booting worker with pid: 27445
2014-03-04 12:18:36 [27448] [INFO] Booting worker with pid: 27448

$ curl http://127.0.0.1:4000/
ok

Как видите, работает нормально. Вам определенно не нужен ProxyFix в этом случае.

person Steven Kryskalla    schedule 06.03.2014

Немного поздно для вечеринки, но здесь это то, что говорится в документации о ProxyFix.

Перефразируя: при развертывании вашего сервера с помощью gunicorn за HTTP-прокси вам потребуется переписать некоторые заголовки, чтобы приложение могло работать. И Werkzeug поставляется с исправлением, которое решит некоторые из распространенных настроек.

person tgdn    schedule 27.05.2019