Поиск по сайту:

Как развернуть приложение Flask с помощью uWSGI и Nginx в Ubuntu 20.04


Это руководство существует для этих версий ОС

  • Ubuntu 22.04 (Jammy Jellyfish)
  • Ubuntu 20.04 (Focal Fossa)

На этой странице

  1. Предпосылки
  2. Начало работы
  3. Установите необходимые зависимости
  4. Создание виртуальной среды
  5. Настройка приложения Flask
  6. Настройка uWSGI
  7. Настройка uWSGI
  8. Создание служебного файла Systemd
  9. Настройка Nginx в качестве обратного прокси-сервера
  10. Защита приложения Flask с помощью Lets Encrypt SSL
  11. Заключение

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. Не стесняйтесь спрашивать меня, если у вас есть какие-либо вопросы.