Python Flask приложение включится через ISPConfig3 секунды с Nginx - Часть 1: Минимальное приложение
ISPConfig это отличная панель управления хостингом, но она не поддерживает Python приложения из комплекта поставки. В этом сообщении показано, как это сделать с помощью Docker.
Это сообщение показывает, как запустить Flask приложение на ISPConfig3. Почему? У меня VPS в интернете работает и ISPConfig3. Он работает со статическими сайтами и сайтами. Но теперь я также хочу запустить свои Flask питонские приложения здесь. Таким образом, я могу использовать управление доменом, к которому привык, и мне не нужен дополнительный сервер для Python приложений.
Это решение используется для запуска Flask приложения, печати "Hello world", и является первым доказательством концепции, показывающей возможность развертывания Flasp приложения на ISPConfig3.
Моя локальная машина:
- Убунту 18.04.1.
- Python3.6.7
- nginx 1.14.0
- Docker 18.09.0
- Docker-Состав 1.23.2
Мой VPS:
- Debian 9 (Растягивание)
- ISPConfig3 3.1.13
- Nginx 1.10.3
- докер 18.09.0
- Docker-Состав 1.23.2
Постарайтесь, чтобы версии на обеих машинах были одинаковыми. Иногда Docker разработчики не могут поддерживать обратную совместимость.
Содержание:
- Шаг 1: Создание и запуск на локальной машине мира Flask приложений с помощью сервера разработки.
- Шаг 2: Запустите Helloworld на локальной машине, используя производственный сервер. Gunicorn
- Шаг 3: Запустите Helloworld на локальной машине, используя команду Docker
- Шаг 4: На локальной машине обслуживать dockarized Helloworld с обратным proxy nginx-сервером.
- Шаг 5: На ISPConfigтрёх машинах разверните dockarized Helloworld.
- Резюме
- Примечания
Шаг 1: Создание и запуск на локальной машине мира Flask приложений с помощью сервера разработки.
1.1. Создание виртуальной среды и активация
См. инструкции в Интернете. Сделай что-нибудь вроде:
> mkdir flask_docker
> cd flask_docker
> mkdir python3
> cd python3
> mkdir venvs
> python3 -m venv venvs/helloworld
> source venvs/helloworld/bin/activate
> cd venvs/helloworld
> pwd
.../flask_docker/python3/venvs/helloworld
1.2. Проверьте каталог Helloworld
Ты бы видел что-то вроде..:
.
|-- bin
|-- include
|-- lib
|-- lib64 -> lib
|-- __pycache__
|-- share
`-- pyvenv.cfg
All commands below are from this directory.
1.3. Установить Flask
Печатай:
> колба для установки трубопровода
1.4. Создание простого Flask приложения hello.py
С помощью редактора создайте Flask приложение helloworld.py:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "<h1>Hello world!</h1>"
if __name__ == '__main__':
app.run()
1.5. Запустите его с помощью сервера разработки.
> В
вашем браузере типа: localhost:5000 Вы
должны увидеть: Привет, Мир Остановить разработку сервера с помощью Ctrl-C.
Шаг 2: Запустите Helloworld на локальной машине, используя производственный сервер. Gunicorn
2.1. Установка промышленного сервера гуникорн
установить трубку с гуникорном.
2.2. Создать файл объекта приложения wsgi.py для гуникорна:
Создайте wsgi.py следующим образом:
from helloworld import app
if __name__ == "__main__":
app.run()
Мы просто импортируем приложение с сайта helloworld.py.
2.3. Запустите его с помощью сервера Гюнкорн.
> gunicorn --bind 0.0.0.0:8000 wsgi:app В
вашем браузере тип: localhost:80000 Вы
должны увидеть: Привет, Мир Остановить сервера гюнкорн с помощью Ctrl-C.
Шаг 3: Запустите Helloworld на локальной машине, используя команду Docker
3.1. Установка Docker и компоновка
См. инструкции на сайтах docker.com, digitalocean.com и т.д.
Если вы не можете выдавать команды без sudo, добавьте себя в Docker группу:
Шаги после установки для Linux
https://docs.docker.com/install/linux/linux-postinstall/
3.2. Храните необходимое программное обеспечение в файле requirements.txt.
> Если в файле requirements.txt есть строка 'pkg-ресурсы==0.0.0', удалите ее.
Это ошибка в некоторых системах.
Мои требования.txt файл выглядит следующим образом:
Click==7.0
Flask==1.0.2
gunicorn==19.9.0
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.0
Werkzeug==0.14.1
3.3. Создать Dockerфайл
DockerФайл выглядит вот так:
FROM python:3.6-alpine
RUN adduser -D helloworlduser
RUN mkdir -p /home/flask_app/helloworld
WORKDIR /home/flask_app/helloworld
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY helloworld.py wsgi.py boot.sh ./
RUN chmod +x boot.sh
ENV FLASK_APP helloworld.py
RUN chown -R helloworlduser:helloworlduser ./
USER helloworlduser
EXPOSE 5000
ENTRYPOINT ["./boot.sh"]
Сценарий запуска boot.sh:
#!/bin/sh
# called by Dockerfile
# go to directory where wsgi.py is
cd /home/flask_app/helloworld
# start gunicorn
exec gunicorn -b :5000 --access-logfile - --error-logfile - wsgi:app
Теперь каталог выглядит следующим образом:
.
|-- bin
|-- include
|-- lib
|-- lib64 -> lib
|-- __pycache__
|-- share
|-- boot.sh
|-- docker-compose.yml
|-- Dockerfile
|-- Dockerfile_web
|-- helloworld.py
|-- image_helloworld.tar
|-- pyvenv.cfg
|-- requirements.txt
`-- wsgi.py
3.4. Построить изображение контейнера
> Докер построить -t Helloworld:last.
Выходные данные заканчиваются примерно так:
...
Successfully built d3e8bc220161
Successfully tagged helloworld:latest
Вы можете проверить, был ли создан контейнер:
> изображения докеров
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest d3e8bc220161 2 minutes ago 84.8MB
python 3.6-alpine 1837080c5e87 5 weeks ago 74.4MB
3.5. Запустите изображение контейнера
Сначала запустите контейнер в качестве приложения на переднем плане, т.е. без опции -d:
> Докер работает - Мир подружек -p 8001:5000 -rm helloworld:last
Если что-то не так, например, в boot.sh, вы можете исправить это и переделать контейнер заново:
> Докер построить -t Helloworld:last.
Вы также можете войти в контейнер, чтобы посмотреть, что происходит, например, действительно ли файлы находятся там:
> Запуск доккера - это точка входа /бин/ш --rm Helloworld:последние новости
Если все в порядке, вы можете запустить контейнер в бэкгрунфе с помощью опции -d:
> Докер работает --именно Helloworld -d -p 8001:5000 -rm Helloworld:last
В вашем браузере: localhost:80001
Видел бы ты: Привет, Мир
Убедитесь, что контейнер работает:
> Докер Пс
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
37f06d44cd30 helloworld:latest "./boot.sh" 4 seconds ago Up 4 seconds 0.0.0.0:8001->5000/tcp helloworld
Проверь журналы:
> {"a6}Докер записывает в журнал "Мир подруги".
[2019-02-02 14:52:57 +0000] [1] [INFO] Starting gunicorn 19.9.0
[2019-02-02 14:52:57 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2019-02-02 14:52:57 +0000] [1] [INFO] Using worker: sync
[2019-02-02 14:52:57 +0000] [9] [INFO] Booting worker with pid: 9
Чтобы остановить контейнер:
> Докер убивает мир подруги.
Убедитесь, что контейнер перестал работать:
> Докер Пс
Шаг 4: На локальной машине обслуживать dockarized Helloworld с реверсивным сервером.
4.1. Установка на локальную машину
Если он еще не установлен:
> sudo apt install nginx
4.2. Настроить Nginx
Мы будем обслуживать сайт helloworld.net в порту 8080, настроив его как Nginx обратный, т.е. он направляет клиентские запросы на наш сервер, работающий по протоколу .
Создайте файл /etc/nginx/sites-available/helloworld.conf:
server {
listen 8080;
server_name helloworld.net;
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 1M;
}
}
Создание символической ссылки в /etc/nginx/sites включено:
> Sudo ln -s /etc/nginx/sites-vailable/helloworld.conf /etc/nginx/sites Enabled/helloworld.conf
Перезапуск :
> sudo systemctl перезагрузите nginx
Если что-то пойдет не так, посмотрите на состояние:
> sudo systemctl status nginx.service
4.3. Добавить Helloworld.net в файл hosts
> Судо-нано / и т.д./Хозяева
Добавьте строчку:
127.0.0.1 Helloworld.net
Проверьте, работает ли он, он должен ответить 127.0.0.0.1 на ping:
> Пинг Helloworld.net
PING helloworld.net (127.0.0.1) 56(84) bytes of data.
64 bytes from helloworld.net (127.0.0.1): icmp_seq=1 ttl=64 time=0.023 ms
64 bytes from helloworld.net (127.0.0.1): icmp_seq=2 ttl=64 time=0.042 ms
В хроме (хроме) вы можете проверить и очистить dns, введя адресную строку:
хром:// Нетто-интерфейсы/#dns
4.4. Запустите контейнер и зайдите на ваш сайт
В вашем браузере: helloworld.net:8080
Если вы еще не запустили изображение контейнера док-станции Helloworld, отобразится окно браузера:
502 Плохой шлюз
Заводи контейнер:
> Докер работает --именно Helloworld -d -p 8001:5000 -rm Helloworld:last
В вашем браузере вы должны увидеть: Привет, Мир
Шаг 5: На ISPConfig3 VPS разверните систему dockarized Helloworld.
Теперь у нас есть изображение Docker контейнера, которое работает на нашей локальной машине. Для запуска на ISPConfig3-х наших машинах у нас есть несколько вариантов. Здесь мы используем: скопируйте Docker изображение на другой хост.
5.1. Установка Docker и компоновка на VPS
Следуйте инструкциям по установке.
5.2. Скопируйте файл и изображение доккера на ISPConfig3 машины
Найдите наше изображение:
> изображения докеров
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest bee00f1c8607 21 hours ago 84.8MB
Сохраните изображение доккера в виде смоляного файла:
> Сохранить докер -o ./image_helloworld.tar Helloworld
С помощью программы передачи файлов скопируйте файл и изображение на устройство ISPConfig.
На ISPConfig3-х машинах перейдите в каталог, где находятся файлы, и добавьте наш образ в каталог :
> Загрузка докеров -i image_helloworld.tar
Это может занять некоторое время. Проверьте, доступно ли изображение:
> изображения докеров
REPOSITORY TAG IMAGE ID CREATED SIZE
helloworld latest bee00f1c8607 21 hours ago 84.8MB
5.3. Настройте ваш сайт в ISPConfig3-х строчках
Предполагается, что у вас уже есть доменное имя, указывающее на вашу машину, вы добавили домен и добавили сайт. В этом случае при вводе текста в браузере:
<домен>
ты увидишь что-то вроде..:
Welcome to your website!
Войти на ISPConfig3.
Иди: Сайты->Ваш сайт
На вкладке Домен:
- CGI снимите флажок
- Слева PHP: отключен
Нажмите Сохранить.
На вкладке Параметры
Добавьте следующее в директивы nginx:
location / {
proxy_pass http://127.0.0.1:8001;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 1M;
}
Нажмите Сохранить.
Если ваш сайт работал раньше, то теперь должно быть видно:
ERRROR 502 - Плохой шлюз!
5.4. Запустите контейнер
> Докер работает - Мир подружек -p 8001:5000 -rm helloworld:last
Теперь, после ввода текста в браузере:
<домен>
ты увидишь: Привет, Мир
Отлично!
Остановите Docker Flask приложение:
> Докер убивает мир подруги.
Убедись, что его нет:
> Докер Пс
Резюме
Мы создали простое приложение и развернули его на ISPConfig3-х машинах.
В следующем сообщении мы будем использовать более продвинутый пример:
- Подавать несколько страниц
- Подавать статические файлы
- Подключиться к ISPConfig3 базам данных
Примечания
1. Вы Gunicorn всегда можете использовать для разработки
Включение Flask интерактивного отладчика в разработке с помощью Gunicorn
https://nickjanetakis.com/blog/enabling-the-flask-interactive-debugger-in-development-with-gunicorn
Ссылки / кредиты
Deploy flask app with nginx using gunicorn and supervisor
https://medium.com/ymedialabs-innovation/deploy-flask-app-with-nginx-using-gunicorn-and-supervisor-d7a93aa07c18
Embedding Python In Apache2 With mod_python (Debian/Ubuntu, Fedora/CentOS, Mandriva, OpenSUSE)
https://www.howtoforge.com/embedding-python-in-apache2-with-mod_python-debian-ubuntu-fedora-centos-mandriva-opensuse
How to Configure NGINX for a Flask Web Application
https://www.patricksoftwareblog.com/how-to-configure-nginx-for-a-flask-web-application/" target="_blank">How to Configure NGINX for a Flask
How to copy Docker images from one host to another without using a repository
https://stackoverflow.com/questions/23935141/how-to-copy-docker-images-from-one-host-to-another-without-using-a-repository
How to deploy a django application on a linux (Debian/Ubuntu) production server running ISPConfig 3
http://blog.yawd.eu/2011/how-to-deploy-django-app-linux-server-ispconfig/
How To Serve Flask Applications with Gunicorn and Nginx on Ubuntu 18.04
https://www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-18-04
The Flask Mega-Tutorial Part XIX: Deployment on Docker Containers
https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xix-deployment-on-docker-containers
Недавний
Большинство просмотренных
- Используя Python pyOpenSSL для проверки SSL-сертификатов, загруженных с хоста
- Использование PyInstaller и Cython для создания исполняемого файла Python
- Уменьшение времени отклика на запросы на странице Flask SQLAlchemy веб-сайта
- Подключение к службе на хосте Docker из контейнера Docker
- SQLAlchemy: Использование Cascade Deletes для удаления связанных объектов
- Использование UUID вместо Integer Autoincrement Primary Keys с SQLAlchemy и MariaDb