angle-uparrow-clockwisearrow-counterclockwisearrow-down-uparrow-leftatcalendarcard-listchatcheckenvelopefolderhouseinfo-circlepencilpeoplepersonperson-fillperson-plusphoneplusquestion-circlesearchtagtrashx

Python Flask приложение включится через ISPConfig3 секунды с Nginx - Часть 1: Минимальное приложение

ISPConfig это отличная панель управления хостингом, но она не поддерживает Python приложения из комплекта поставки. В этом сообщении показано, как это сделать с помощью Docker.

13 февраля 2019
post main image

Это сообщение показывает, как запустить 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 -&gt; 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

Оставить комментарий

Комментируйте анонимно или войдите в систему, чтобы прокомментировать.

Комментарии

Оставьте ответ

Ответьте анонимно или войдите в систему, чтобы ответить.