- Скачать и установить веб-сервер.
- Настроить его на работу с localhost
- Реализовать форму с загрузкой файла
3.1 Захостить python приложение из предыдущего семестра, при загрузке снимка рисовать в веб карту NDVI.
Выполнять работу будем на Cent OS версии 7.
Предварительно создадим пользователя "vladislav" и авторизуемся.
Создадим директорию для проекта: "mkdir ~/project/"
Установим репозиторий EPEL, содержащий дополнительные пакеты.
[vladislav@localhost project]$ sudo yum install epel-release
Установим pip диспетчер пакетов Python, а также файлы разработки Python, необходимые для сборки uWSGI, а также установим Nginx.
[vladislav@localhost project]$ sudo yum install python3-pip python3-devel gcc nginx
Для того чтобы изолировать приложение настроим виртуальную среду.
Установим пакет virtualenv:
[vladislav@localhost project]$ sudo pip3 install virtualenv
Создадим видтуальную среду:
[vladislav@localhost project]$ virtualenv projectvenv
Активируем её:
[vladislav@localhost project]$ source projectvenv/bin/activate
Убедимся что мы начали работу в виртуальной среде. Ввод терминала выглядит следующим образом:
(projectvenv) [vladislav@localhost project]$
Установим uwsgi и flask:
(projectvenv) [vladislav@localhost project]$ pip3 install wheel uwsgi flask
Создадим приложение Flask:
(projectvenv) [vladislav@localhost project]$ vi ~/project/app.py
(Исходный код приложения продемонмтрирован в данном репозитории)
Сохраним и закроем файл нажав ESC, а затем нажав Ctrl+Z,Z.
Установим модули для работы приложения:
(projectvenv) [vladislav@localhost project]$ pip3 install Pillow opencv-python mesa-liblibGL.x86_64
Протестируем созданное приложение. Для этого запустим его в фоновом режиме:
(projectvenv) [vladislav@localhost project]$ python3 ~/project/application.py &
*Serving Flask app 'application' (lazy loading)
*Environment: prodction
*Debug mode: on
*Running on all addresses.
*Running on http://10.0.2.15:5000 (Press CTRL+C) to quit)
А затем обратимся к содержимому с помощью curl. Выведем первые 8 строчек html страницы:
(projectenv) [vladislav@localhost project]$ curl -L http://10.0.2.15:5000 | head -n 8
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Image processing</title>
</head>
<body>
<p class="fadein1">Загрузите изображения для красного и инфракрасного спектров в формате tif:
После этого остановим Flask приложение с помощью fg:
(projectvenv) [vladislav@localhost project]$ fg
python3 application.py
^C
Создадим файл wsgi.py:
(projectvenv) [vladislav@localhost project]$ vi ~/project/wsgi.py
Внутри напишем:
import application
if __name__ == "__main__":
application.run()
Для начала протестируем что uWSGI может обслуживать наше приложение:
(projectvenv) [vladislav@localhost project]$ uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi &
Убедимся что по указанному ранее адресу, но с портом 8000 находится содержимое html страницы.
(projectvenv) [vladislav@localhost project]$ curl -L http://10.0.2.15:8000 | head -n 5
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Image processing</title>
После этого приостановим uwsgi:
(projectvenv) [vladislav@localhost project]$ fg
uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi
^C
На этом работа с виртуальной средой окончена. Выйдем из нее командой deactivate:
(projectvenv) [vladislav@localhost project]$ deactivate
Создадим файл конфигурации uWSGI:
[vladislav@localhost project]$ vi ~/project/project.ini
Внутри напишем:
[uwsgi]
module = wsgi
master = true
processes = 10
socket = project.sock
chmod-socket = 660
vacuum = true
где "module = wsgi" - исполняемый модуль, созданный ранее файл "wsgi.py";
"master = true" - означает что uWSGI будет запускаться в главном режиме;
"processes = 10" - будет иметь 10 рабочих процесса для обслуживания запросов;
"socket = project.sock" - сокет, который будет использовать uWSGI;
"chmod-socket = 660" - права на процесс uWSGI;
"vacuum = true" - сокет будет очищен по завершении работы процесса;
Создадим файл службы:
[vladislav@localhost project]$ sudo vi /etc/systemd/system/project.service
Внутри напишем:
[Unit]
Description=uWSGI for project
After=network.target
[Service]
User=vladislav
Group=nginx
WorkingDirectory=/home/vladislav/project
Environment="PATH=/home/vladislav/project/projectvenv/bin"
ExecStart=/home/vladislav/project/projectvenv/bin/uwsgi --ini project.ini
[Install]
WantedBy=multi-user.target
где "[Unit]", "[Service]", "[Install]" - заголовки разделов;
"Description" - описание службы;
"After" - цель, по достижении которой будет производиться запуск;
"User" - пользователь;
"Group" - группа;
"WorkingDirectory" - рабочая директория в которой хранятся исполняемые файлы;
"Environment" - директория виртуальной среды;
"ExecStart" - команда для запуска процесса;
"WantedBy" - когда запускаться службе.
Запустим созданную службу:
[vladislav@localhost project]$ sudo systemctl daemon reload
[vladislav@localhost project]$ sudo systemctl start project
[vladislav@localhost project]$ sudo systemctl enable project
Теперь необходимо настроить Nginx для передачи веб-запросов в сокет с использованием uWSGI протокола.
Откроем файл конфигурации Nginx:
[vladislav@localhost project]$ sudo vi /etc/nginx/nginx.conf
Найдем блок server {} в теле http:
...
http {
...
include /etc/nginx/conf.d/*.conf;
*
server {
listen 80 default_server;
}
...
}
...
Выше него (*) создадим свой:
server {
listen 80;
server_name 10.0.2.15;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/vladislav/project/project.sock;
}
Закроем и сохраним файл.
Добавим nginx пользователя в свою группу пользователей с помощью следующей команды:
[vladislav@localhost project]$ sudo usermod -a -G vladislav nginx
Предоставим группе пользователей права на выполнение в домашнем каталоге:
[vladislav@localhost project]$ chmod 710 /home/vladislav
Наконец, запустим Nginx:
[vladislav@localhost project]$ sudo systemctl start nginx
[vladislav@localhost project]$ sudo systemctl enable nginx
В ходе выполнения курсовой работы было создано приложение Flask в виртуальной средe, позволяющее загружать файлы формата ".tif" и получать цветное изображение NDVI. Была создана и настроена точка входа WSGI, с помощью котрой любой сервер приложений, поддерживающий WSGI, может взаимодействовать с приложением Flask. Была создана служба systemd для автоматического запуска uWSGI при загрузке системы. Также был настроен серверный блок Nginx.