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

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

Я создал базовое веб-приложение с помощью 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, но добавит ли пулеметчик HTTP-прокси? Или я всегда был за прокси-сервером, и это просто не имело значения для встроенного сервера Flask?

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

4b9b3361

Ответ 1

Вам нужно показать код, определяющий приложение "Приложение" к фляге.

Где указано "приложение"? Вы импортируете его из другого файла?

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

$ 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.

Ответ 2

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

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