#python #nginx #flask #gunicorn
#python #nginx #flask #gunicorn
Вопрос:
Я пытаюсь соединить Flask, gunicorn и nginx вместе, но в итоге получается 400 ошибочных запросов и 500 ошибок. Надеюсь, что кто-нибудь может помочь.
nginx conf
server {
listen 8000;
server_name 127.0.0.1;
location /Hello {
uwsgi_pass 127.0.0.1:8081;
}
}
wsgi.py фрагмент текста:
from app import app
app.run(host="127.0.0.1", port=8081)
app.py
app = Flask(__name__)
app.secret_key = "Not A Secret Anymore By Now"
@app.route('/Hello')
def hello():
return("Hello")
#if __name__ == "__main__":
# app.run(host='0.0.0.0', port=8000)
запустите cmd
export FLASK_APP=app
export FLASK_ENV=development
gunicorn --bind 0.0.0.0:8081 wsgi:app
тестовые примеры
- curl http://localhost / >>> возвращает домашнюю страницу nginx
- curl http://localhost/Hello >>> возвращает 404 Не найдено
- curl http://localhost:8000 / >>> возвращает домашнюю страницу nginx
- curl http://localhost:8000/Hello >>> возвращает 502 плохих шлюза
- curl http://localhost:8081 >>> отказано в обратном соединении
Я пытаюсь заставить тестовые примеры работать, но не понимаю, почему появляются ошибки (перезапуск nginx).
Спасибо.
Комментарии:
1. Обновлено, def hello возвращал «Привет»;
2. При использовании uwsgi_pass 127.0.0.1:8081; сбой curl localhost:8000.
3. При использовании prox_pass 127.0.0.1:8081; curl localhost:8000 возвращает страницу Nginx
Ответ №1:
Здесь есть несколько проблем…
Ваша функция просмотра завершается без оператора return, что, вероятно, является причиной первой ошибки 500. Лучше использовать:
@app.route('/Hello')
def hello():
print("Hello")
return 'success'
Кроме того, поскольку вы столкнулись uwsgi.py
с emtpy, там нет объекта приложения для импорта. Лучше всего указать команду gunicorn на действительный объект приложения:
gunicorn --bind 0.0.0.0:8081 app:app
Также блок расположения nginx ожидает, что запрос будет отправлен http://example.com/Hello/Hello
. Так что лучше сделайте блок location следующим образом. (Также убедитесь, что порт тот же, который вы указали для --bind
флага gunicorn).
location / {
proxy_pass http://127.0.0.1:8081;
}
Здесь я также использовал proxy_pass
документы по развертыванию gunicorn (с nginx).
Теперь запрос должен работать:
# Direct to app server...
curl -i http://localhost:8081/Hello
HTTP/1.1 200 OK
Server: gunicorn/20.0.4
# ...
success
а также:
# Via nginx:
curl -i http://localhost/Hello
HTTP/1.1 200 OK
Server: nginx
...
success
Помните, что запуск gunicorn на всех интерфейсах (0.0.0.0) означает, что внешние запросы могут напрямую поступать на сервер приложений (минуя nginx), если нет брандмауэра для предотвращения этого. Может быть, стоит вместо этого привязать gunicorn к локальному интерфейсу : --bind 127.0.0.1:8081
.
Также будьте осторожны в целом, есть много способов сделать ошибки безопасности при настройке подобных вещей самостоятельно. Удачи.
Комментарии:
1. локон -i localhost / Привет curl: (7) Не удалось подключиться к порту 80 локального хоста: отказано в подключении
2. url localhost:8081 curl: (7) Не удалось подключиться к порту 8081 локального хоста: отказано в подключении