Flask — развертывание с помощью Gunicorn, Nginx и Supervisor, журнал ошибок Supervisor

Я развернул приложение Flask с помощью Gunicorn + Nginx + Supervisor. Это не работает. Поиск в Интернете обнаружил несколько сообщений о подобных проблемах, но ни одно из них не содержало объяснения, соответствующего нашим обстоятельствам, или исправления, которое решило проблему. Здесь сказано отключить демонизацию пушки. Если я прав, это не мой случай.

Похоже, что-то запускает службу, которая слушает уже 8000 порт. Supervisor отправляет ошибки в файл журнала каждую секунду.

Что может мне помочь?

Ошибка из Supervisor app-stderr.log:

[2015-02-19 18:56:19 +0300] [964] [INFO] Starting gunicorn 19.2.1
[2015-02-19 18:56:19 +0300] [964] [INFO] Listening at: http://127.0.0.1:8000 (964)
[2015-02-19 18:56:19 +0300] [964] [INFO] Using worker: sync
[2015-02-19 18:56:19 +0300] [1078] [INFO] Booting worker with pid: 1078
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
[2015-02-19 18:56:20 +0300] [1081] [INFO] Starting gunicorn 19.2.1
[2015-02-19 18:56:20 +0300] [1081] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:20 +0300] [1081] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:21 +0300] [1081] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:21 +0300] [1081] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:22 +0300] [1081] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:22 +0300] [1081] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:23 +0300] [1081] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:23 +0300] [1081] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:24 +0300] [1081] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:24 +0300] [1081] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:25 +0300] [1081] [ERROR] Can't connect to ('localhost', 8000)
[2015-02-19 18:56:25 +0300] [1078] [INFO] Worker exiting (pid: 1078)
[2015-02-19 18:56:25 +0300] [1122] [INFO] Booting worker with pid: 1122
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
[2015-02-19 18:56:27 +0300] [1148] [INFO] Starting gunicorn 19.2.1
[2015-02-19 18:56:27 +0300] [1148] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:27 +0300] [1148] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:28 +0300] [1148] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:28 +0300] [1148] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:29 +0300] [1148] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:29 +0300] [1148] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:30 +0300] [1148] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:30 +0300] [1148] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:31 +0300] [1148] [ERROR] Connection in use: ('localhost', 8000)
[2015-02-19 18:56:31 +0300] [1148] [ERROR] Retrying in 1 second.
[2015-02-19 18:56:32 +0300] [1148] [ERROR] Can't connect to ('localhost', 8000)
[2015-02-19 18:56:32 +0300] [1122] [INFO] Worker exiting (pid: 1122)
[2015-02-19 18:56:32 +0300] [1206] [INFO] Booting worker with pid: 1206
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat
[2015-02-19 18:56:32 +0300] [1211] [INFO] Starting gunicorn 19.2.1
[2015-02-19 18:56:32 +0300] [1211] [ERROR] Connection in use: ('localhost', 8000)

Мой supervisor.conf:

[program:app]
command = /home/www/app/flask/bin/gunicorn app:app -b localhost:8000 --preload
directory = /home/www/app
user = webhost

Netstat -тулпин

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      930/nginx
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      855/sshd
tcp        0      0 127.0.0.1:8000          0.0.0.0:*               LISTEN      1392/python3
tcp6       0      0 :::22                   :::*                    LISTEN      855/sshd

И PS aux | питон

root       954  0.1  2.4  60564 12440 ?        Ss   18:56   0:01 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
webhost   1392  0.0  3.2  67148 16512 ?        S    19:00   0:00 /home/www/app/flask/bin/python3 /home/www/app/flask/bin/gunicorn app:app -b localhost:8000
webhost   2124  5.2  4.2  86072 21344 ?        S    19:12   0:00 /home/www/app/flask/bin/python3 /home/www/app/flask/bin/gunicorn app:app -b localhost:8000
webhost   2126  5.2  3.2  67148 16488 ?        S    19:12   0:00 /home/www/app/flask/bin/python3 /home/www/app/flask/bin/gunicorn app:app -b localhost:8000
webhost   2130  0.0  0.1  11744   920 pts/0    S+   19:13   0:00 grep --color=auto python

УПД. конфиг супервизора выше

nginx.conf

server {
    location / {
        proxy_pass http://127.0.0.1:8000;
    }
    location /static {
        alias  /home/www/myapp/app/static/;
    }
}

Структура файла

myapp
  |
  |-app-
  |    |
  |    __init__.py  
  |
  run.py
  |
  config.py

__init__.py

from flask import Flask

app = Flask(__name__)
app.config.from_object('config')

from app import views

запустить.py

#!flask/bin/python
from app import app
app.run()

config.py

# For valid forms
CSRF_ENABLED = True
SECRET_KEY = 'never-guess'

person Alwx    schedule 19.02.2015    source источник
comment
Можете ли вы предоставить настройки инициализации вашего приложения, nginx conf, supervisor conf?   -  person Ibrahim    schedule 19.02.2015
comment
@Ибрагим Обновлено. Конфигурацию супервизора я уже опубликовал.   -  person Alwx    schedule 19.02.2015
comment
Нужен ваш app/__init__.py источник приложения для создания. Даю вам несколько советов, что может происходить. В настройках пушки вы указали порт 8000 для запуска приложения, но приложение работает на 5000. Это порт по умолчанию для запуска приложения flask.   -  person Ibrahim    schedule 19.02.2015
comment
@Ibrahim Еще несколько советов, пожалуйста. Нужен ваш app/__init__.py источник приложения для создания. Что это значит? На мой взгляд - Супервайзер запускает Gunicorn. Gunicorn запускает run.py. И run.py создает _init_.py   -  person Alwx    schedule 19.02.2015


Ответы (2)


У меня была та же проблема, и, адаптировав ответ Alwx, мое решение состояло в том, чтобы запускать приложение только в том случае, если модуль вызывается как основной (run.py):

from my_app import create_app

app = create_app()
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080, debug=True)

Затем я запускаю его с помощью gunicorn:

gunicorn run:app

И я все еще могу запустить его, как и раньше, всего лишь python run.py

person jbasko    schedule 07.11.2015

Я разобрался. Благодаря @Ibrahim я запустил приложение через gunicorn в run.py

#!flask/bin/python
from app import app
app.run()

Итак, gunicorn создал процесс и app.run() тоже. И они противоречат друг другу. Просто удалил эту строку.

person Alwx    schedule 19.02.2015
comment
Да, вот что я хотел сказать. - person Ibrahim; 20.02.2015