Большая картина
У меня есть сайт Flask, который раньше успешно работал на Ubuntu на Linode. Я загрузил его с помощью Yeoman, и в результате мне не пришлось разбираться в разнице между nginx, wsgi/Werkzeug и gunicorn.
Однако, это кусает меня за задницу сейчас, когда я пытаюсь перенести его на свой первый дроплет Digitalocean, используя их предварительно настроенный образ диска Ubuntu 16.04 с Dokku 0.7.2. Это мой первый опыт с Docker или Dokku, или контейнеризацией в целом.
Dokku не выдал ошибку при развертывании моего приложения Flask — он сообщил мне, что приложение запущено на IP-адресе моего дроплета, за которым следует :17520
. (Я не использую доменное имя, а только IP-адрес.)
Определение проблемы
Мой сайт не отвечает на HTTP-запросы, несмотря на то, что Dokku утверждает, что успешно развернулся. Chrome сообщает: «Этот сайт не может быть доступен».
Решения, которые я уже пробовал
Dokku потребовалось несколько попыток, чтобы развернуть мое приложение без ошибок, поскольку мне нужно было добавить некоторые файлы в корень моего локального репозитория и попытаться отправить его снова.
Профайл
Сначала мне понадобился Procfile, содержащий одну строку web:, python run.py
где run.py
находится:
from app import app app.run(host = '0.0.0.0', debug = True)
Игнорирование моего инструментария Node.js Dev
Далее мне нужно было запретить Dokku видеть мой инструментарий разработки Node.js и пытаться развернуть его как приложение Node.js. Поэтому я добавил .slugignore
содержащий одну строку package.json
, и .buildpacks
содержащий одну строку https://github.com/heroku/heroku-buildpack-python
и снова отправил в git push dokku
.
Гуникорн
Yeoman не включил, gunicorn
когда я загрузил это приложение, только nginx и wsgi/Werkzeug. Я заметил, что все примеры Python Procfile используются gunicorn
как HTTP-сервер, поэтому я добавил gunicorn==0.17.2
в свой requirements.txt. I changed
Procfile to
web: 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
События.журнал
Все еще находясь в своем сервере, я перешел в 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
решение1
Каковы ваши настройки nginx и логи nginx? Этот экземпляр nginx запущен изначально на хосте и управляется с помощью systemd?
Что netstat -tulpn
написано на сервере?
Видите ли вы порт 5000 из контейнера, перенаправленный на порт на хост-компьютере? (проверьте docker ps
эту информацию)