Как развернуть приложение Flask с помощью uWSGI и Nginx в Ubuntu 20.04
Это руководство существует для этих версий ОС
- Ubuntu 22.04 (Jammy Jellyfish)
- Ubuntu 20.04 (Focal Fossa)
На этой странице
- Предпосылки
- Начало работы
- Установите необходимые зависимости
- Создание виртуальной среды
- Настройка приложения Flask
- Настройка uWSGI
- Настройка uWSGI
- Создание служебного файла Systemd
- Настройка Nginx в качестве обратного прокси-сервера
- Защита приложения Flask с помощью Lets Encrypt SSL
- Заключение
Flask — это микровеб-фреймворк, написанный на Python, разработанный Армином Ронахером. Он называется микрофреймворком, потому что не требует никаких инструментов или библиотек. Flask — это модуль Python с небольшим и легко расширяемым ядром, которое помогает вам легко разрабатывать веб-приложения.
В этом руководстве мы узнаем, как развернуть приложение Flask с помощью Uwsgi и Nginx в Ubuntu 20.04.
Предпосылки
- Сервер под управлением Ubuntu 20.04.
- Действительное доменное имя, указанное с IP-адресом вашего сервера.
- Пароль root настраивается на сервере.
Начиная
Во-первых, рекомендуется обновить системные пакеты до последней версии. Вы можете обновить их, выполнив следующую команду:
apt-get update -y
Как только все пакеты будут обновлены, вы можете перейти к следующему шагу.
Установите необходимые зависимости
Далее вам нужно будет установить некоторые зависимости, необходимые для развертывания приложения flask. Вы можете установить их все с помощью следующей команды:
apt-get install nginx python3-pip python3-dev python3-venv build-essential libssl-dev libffi-dev python3-setuptools -y
После установки всех пакетов можно переходить к следующему шагу.
Создайте виртуальную среду
Далее вам нужно будет создать виртуальную среду для вашего приложения Flask. Виртуальная среда — очень полезный инструмент, используемый для создания изолированных сред Python. Это поможет вам установить определенную версию Python для вашего проекта.
Сначала создайте каталог для своего приложения Flask с помощью следующей команды:
mkdir /var/www/html/myapp
Затем измените каталог на myapp и создайте новую виртуальную среду Python с помощью следующей команды:
cd /var/www/html/myapp
python3.8 -m venv myappenv
Затем активируйте виртуальную среду с помощью следующей команды:
source myappenv/bin/activate
Настройте приложение Flask
На данный момент виртуальная среда Python готова для развертывания приложения Flask. Затем вам нужно будет настроить приложение Flask в вашей виртуальной среде.
Сначала установите Flask и uWSGI с помощью следующей команды:
pip install uwsgi flask
Затем создайте пример приложения с именем myapp.py с помощью следующей команды:
nano /var/www/html/myapp/myapp.py
Добавьте следующие строки:
from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return "<h1 style='color:blue'>Hi This is My Flask Application</h1>" if __name__ == "__main__": app.run(host='0.0.0.0')
Сохраните и закройте файл, когда закончите. Затем запустите приложение Flask с помощью следующей команды:
python /var/www/html/myapp/myapp.py
Вы должны увидеть следующий вывод:
* Serving Flask app "myapp" (lazy loading) * Environment: production Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Теперь откройте веб-браузер и получите доступ к приложению Flask, используя URL-адрес http://your-server-ip:5000. Вы должны увидеть следующий экран:
Теперь нажмите CTRL + C в терминале, чтобы остановить приложение Flask.
Настроить uWSGI
Сначала создайте точку входа WSGI, чтобы указать серверу uWSGI, как с ней взаимодействовать.
nano /var/www/html/myapp/wsgi.py
Добавьте следующие строки, чтобы импортировать ваш экземпляр Flask из вашего приложения:
from myapp import app if __name__ == "__main__": app.run()
Сохраните и закройте файл, когда закончите, затем проверьте uWSGI, может ли он обслуживать приложение, используя следующую команду:
uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app
Теперь снова войдите в свое приложение, используя URL-адрес http://your-server-ip:5000. Вы должны увидеть следующий экран:
Теперь нажмите CTRL + C, чтобы остановить приложение.
Затем выполните следующую команду, чтобы выйти из виртуальной среды:
deactivate
Настроить uWSGI
На этом этапе uWSGI может обслуживать ваше приложение. Теперь создайте файл конфигурации uWSGI с помощью следующей команды:
nano /var/www/html/myapp/myapp.ini
Добавьте следующие строки:
[uwsgi] module = wsgi:app master = true processes = 5 socket = myapp.sock chmod-socket = 660 vacuum = true die-on-term = true
Сохраните и закройте файл, когда закончите.
Создайте служебный файл Systemd
Далее вам нужно будет создать файл службы systemd для управления службой uWSGI. Вы можете создать его с помощью следующей команды:
nano /etc/systemd/system/myapp.service
Добавьте следующие строки:
[Unit] Description=uWSGI instance to serve myapp After=network.target [Service] User=www-data Group=www-data WorkingDirectory=/var/www/html/myapp Environment="PATH=/var/www/html/myapp/myappenv/bin" ExecStart=/var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini [Install] WantedBy=multi-user.target
Сохраните и закройте файл, когда закончите, затем перезагрузите демон systemd с помощью следующей команды:
systemctl daemon-reload
Затем измените право собственности вашего приложения на www-data и установите соответствующие разрешения с помощью следующей команды:
chown -R www-data:www-data /var/www/html/myapp
chmod -R 775 /var/www/html/myapp
Затем запустите приложение и включите его запуск при перезагрузке системы с помощью следующей команды:
systemctl start myapp
systemctl enable myapp
Вы также можете проверить статус своего приложения с помощью следующей команды:
systemctl status myapp
Вы должны получить следующий результат:
? myapp.service - uWSGI instance to serve myapp Loaded: loaded (/etc/systemd/system/myapp.service; disabled; vendor preset: enabled) Active: active (running) since Sun 2020-09-13 08:38:08 UTC; 1min 53s ago Main PID: 662796 (uwsgi) Tasks: 6 (limit: 4691) Memory: 21.8M CGroup: /system.slice/myapp.service ??662796 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini ??662808 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini ??662809 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini ??662810 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini ??662811 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini ??662812 /var/www/html/myapp/myappenv/bin/uwsgi --ini myapp.ini Sep 13 08:38:08 ubunt4 uwsgi[662796]: WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x55e207e7a510 pid: 662796 (default app) Sep 13 08:38:08 ubunt4 uwsgi[662796]: *** uWSGI is running in multiple interpreter mode *** Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI master process (pid: 662796) Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 1 (pid: 662808, cores: 1) Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 2 (pid: 662809, cores: 1) Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 3 (pid: 662810, cores: 1) Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 4 (pid: 662811, cores: 1) Sep 13 08:38:08 ubunt4 uwsgi[662796]: spawned uWSGI worker 5 (pid: 662812, cores: 1)
Настройте Nginx в качестве обратного прокси
Далее вам нужно будет настроить Nginx в качестве обратного прокси-сервера для обслуживания приложения Flask. Вы можете сделать это с помощью следующей команды:
nano /etc/nginx/sites-available/flask.conf
Добавьте следующие строки:
server { listen 80; server_name flask.example.com; location / { include uwsgi_params; uwsgi_pass unix:/var/www/html/myapp/myapp.sock; } }
Сохраните и закройте файл, когда закончите. Затем проверьте Nginx на наличие синтаксической ошибки с помощью следующей команды:
nginx -t
Вы должны увидеть следующий вывод:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Затем активируйте виртуальный хост Nginx с помощью следующей команды:
ln -s /etc/nginx/sites-available/flask.conf /etc/nginx/sites-enabled/
Наконец, перезапустите службу Nginx, чтобы применить изменения:
systemctl restart nginx
На данный момент Nginx настроен для обслуживания вашего приложения Flask.
Безопасное приложение Flask с помощью Lets Encrypt SSL
Далее также рекомендуется защитить ваше приложение с помощью бесплатного SSL от Lets Encrypt. Во-первых, вам нужно будет установить клиент Certbot для установки и управления SSL-сертификатом. Вы можете установить его с помощью следующей команды:
apt-get install python3-certbot-nginx -y
После установки защитите свой сайт с помощью Lets Encrypt SSL, выполнив следующую команду:
certbot --nginx -d flask.example.com
Вам будет предложено указать действующий адрес электронной почты и принять условия обслуживания, как показано ниже:
Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator nginx, Installer nginx Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel: A - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y Obtaining a new certificate Performing the following challenges: http-01 challenge for flask.example.com Waiting for verification... Cleaning up challenges Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/flask.conf
Затем выберите, следует ли перенаправлять HTTP-трафик на HTTPS, как показано ниже:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Введите 2 и нажмите Enter, чтобы завершить установку. Вы должны увидеть следующий вывод:
Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/flask.conf - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations! You have successfully enabled https://flask.example.com You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=flask.example.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/flask.example.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/flask.example.com/privkey.pem Your cert will expire on 2020-10-30. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le - We were unable to subscribe you the EFF mailing list because your e-mail address appears to be invalid. You can try again later by visiting https://act.eff.org.
Теперь ваш фляжный сайт защищен с помощью Lets Encrypt SSL. Вы можете получить доступ к своему приложению Flask, используя URL-адрес https://flask.example.com.
Заключение
Поздравляем! вы успешно развернули приложение Flask с помощью uWSGI и Nginx и защитили его с помощью Lets Encrypt SSL. Теперь вы можете легко разработать и развернуть свое приложение Python с помощью Flask. Не стесняйтесь спрашивать меня, если у вас есть какие-либо вопросы.