Назад | Перейти на главную страницу

Nginx с Dokku и Flask

Большая картинка

У меня есть сайт Flask, который ранее успешно работал на Ubuntu на Linode. Я загрузил его с помощью Yeoman, и в результате мне не нужно было выяснять разницу между nginx, wsgi / Werkzeug и gunicorn.

Однако теперь, когда я пытаюсь перенести его на свою первую каплю Digitalocean, это кусает меня в зад, используя их предварительно настроенный образ диска Ubuntu 16.04 с Dokku 0.7.2. Я впервые использую Docker или Dokku или контейнеризацию в целом.

Dokku не выдавал ошибки при развертывании моего приложения Flask - он сказал мне, что приложение работает на IP-адресе моей капли, а затем :17520. (Я использую не доменное имя, а только IP-адрес.)

Определение проблемы

Мой сайт не отвечает на HTTP-запросы, несмотря на то, что Докку сказал, что это удалось. Chrome сообщает: «Этот сайт недоступен».

Решения, которые я уже пробовал

Dokku потребовалось несколько попыток, чтобы развернуть мое приложение без ошибок, потому что мне нужно было добавить некоторые файлы в корень моего локального репозитория и попробовать отправить его снова.

Procfile

Сначала мне понадобился Procfile, содержащий однострочную сеть: python run.py где run.py является:

from app import app app.run(host = '0.0.0.0', debug = True)

Игнорирование моего инструментария разработчика Node.js

Затем мне нужно было запретить Dokku видеть мой инструмент разработки Node.js и пытаться развернуть его как приложение Node.js. Я добавил .slugignore содержащий единственную строку package.json, и .buildpacks содержащий единственную строку https://github.com/heroku/heroku-buildpack-python и снова нажал на git push dokku.

Gunicorn

Йомен не включил gunicorn когда я загружал это приложение - только nginx и wsgi / Werkzeug. Я заметил все используемые примеры Python Procfile gunicorn в качестве HTTP-сервера, поэтому я добавил gunicorn==0.17.2 к моему requirements.txt. I changedProcfiletoweb: gunicorn app: app`. Dokku не выдает ошибку при установке этой версии, но ответа на HTTP-запросы все равно нет.

Журналы

Журнал Докку

Когда я вхожу в свою каплю и запускаю команду dokku log [my_app_name], он говорит:

2017-01-17T17:11:04.733185275Z app[web.1]: * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 2017-01-17T17:11:04.734938531Z app[web.1]: * Restarting with stat 2017-01-17T17:11:05.024834922Z app[web.1]: * Debugger is active! 2017-01-17T17:11:05.029750092Z app[web.1]: * Debugger pin code: 208-261-801 Поэтому я также попытался добавить: 5000 к IP-адресу. И, конечно же, на всякий случай попробовал и порт 80. По-прежнему не повезло.

После того, как я установил gunicorn, журнал читал:

2017-01-18T17:09:38.303046670Z app[web.1]: 2017-01-18 17:09:38 [8] [INFO] Starting gunicorn 0.17.2 2017-01-18T17:09:38.303864158Z app[web.1]: 2017-01-18 17:09:38 [8] [INFO] Listening at: http://0.0.0.0:5000 (8) 2017-01-18T17:09:38.304140278Z app[web.1]: 2017-01-18 17:09:38 [8] [INFO] Using worker: sync 2017-01-18T17:09:38.310057688Z app[web.1]: 2017-01-18 17:09:38 [148] [INFO] Booting worker with pid: 148

Events.log

Все еще вошел в свою каплю, я зашел в var / log / dokku и открыл файл events.log, заканчивая этим: Jan 17 16:27:55 [my-app-name] dokku-installer.py[7291]: 127.0.0.1 - - [17/Jan/2017 16:27:55] "GET /favicon.ico HTTP/1.0" 200 - Jan 17 16:28:27 [my-app-name] dokku-installer.py[7291]: 127.0.0.1 - - [17/Jan/2017 16:28:27] "HEAD / HTTP/1.0" 200 - Jan 17 16:29:49 [my-app-name] dokku-installer.py[7291]: SHA256: [then the SHA] Jan 17 16:29:50 [my-app-name] dokku-installer.py[7291]: 127.0.0.1 - - [17/Jan/2017 16:29:50] "POST /setup HTTP/1.0" 200 - Jan 17 16:29:50 [my-app-name] dokku-installer.py[7291]: Stopping nginx (via systemctl): nginx.service. Jan 17 16:29:51 [my-app-name] dokku-installer.py[7291]: Starting nginx (via systemctl): nginx.service. Jan 17 16:29:51 [my-app-name] dokku-installer.py[7291]: /bin/sh: 1: stop: not found

Какая у вас конфигурация nginx и журналы nginx? Этот экземпляр nginx изначально работает на хосте и управляется с помощью systemd?

Что значит netstat -tulpn на сервере говорите?

Вы видите, что порт 5000 из контейнера перенаправлен на порт на главном компьютере? (чек docker ps для этой информации)