Настройка прокси-сервера Flask gunicorn?

#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
  

тестовые примеры

  1. curl http://localhost / >>> возвращает домашнюю страницу nginx
  2. curl http://localhost/Hello >>> возвращает 404 Не найдено
  3. curl http://localhost:8000 / >>> возвращает домашнюю страницу nginx
  4. curl http://localhost:8000/Hello >>> возвращает 502 плохих шлюза
  5. 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 локального хоста: отказано в подключении