- Скачать и установить веб-сервер.
- Настроить его на работу с localhost
- Реализовать форму с загрузкой файла
3.1 Захостить приложение для расчета NDVI, при загрузке снимка рисовать в веб карту.
Работа выполнена на операционной системе Ubuntu 16.04, код программы расчет нормализованного индекса растительности реализован на языке программирования высокого уровня Python. Веб-приложение реализовано с помощью фреймворка Flask, в качестве web-сервера использовался Nginx в сочетании с сервером web-приложений uWSGI
Исходный код проекта представлен в репозитории на GitHub: https://github.com/AndreyRysistov/NDVI-web
В первую очередь установим необходимые для работы интрументы:
andrey@andrey-VirtualBox:~$ sudo apt update
andrey@andrey-VirtualBox:~$ sudo apt install python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
andrey@andrey-VirtualBox:~$ sudo apt install nginx
andrey@andrey-VirtualBox:~$ pip install numpy
andrey@andrey-VirtualBox:~$ pip install opencv-python
andrey@andrey-VirtualBox:~$ pip install Flask, uwsgi
Исходный код приложения представлен в репозитории проекта. Запустаемый файл - app.py
Web-приложение представляет собой веб-форму для загрузки снимков со стутника landsat-7 в формате .tif, а так же текстового описания данных снимков для расчета местоположения города. В результате на выходе мы получаем снимок местности с размеченными по значению нормализованного индекса раститетельности (NDVI),с помощью цветовых диапазонов, объектов.
В рамках тестирования приложения использовался снимок со спутника, пролетающего над городом Сидней. Результат работы приложения представлен на рисунке:
Теперь создадим файл, который будет служить точкой входа в наше приложение. Это покажет серверу uWSGI, как с ним взаимодействовать.
Мы назовем этот файл wsgi.py:
andrey@andrey-VirtualBox:~$ nano ~/myproject/wsgi.py
from myproject import app
if __name__ == "__main__":
app.run()
Т Проверим способность uWSGI обслуживать наше приложение.
Укажем сокет, чтобы запуск осуществлялся через общедоступный интерфейс, а также протокол, чтобы использовать протокол HTTP вместо двоичного протокола uwsgi. Мы будем использовать номер порта 5000, который предварительно откроем:
andrey@andrey-VirtualBox:~$ sudo ufw allow 5000
andrey@andrey-VirtualBox:~$ wsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app
Создадим файл конфигураций ndvi.ini:
andrey@andrey-VirtualBox:~$ nano NDVI-web-master/ndvi.ini
[uwsgi]
module = wsgi:app
master = true
processes = 5
socket = myproject.sock
chmod-socket = 660
vacuum = true
die-on-term = true
Заголовок uwsgi указывает на необходимость применить настройки. По ссылке указываем точку входа и испоняемый файл. Затем мы указываем uWSGI начать работу в режиме мастера и создать пять рабочих процессов для обслуживания фактических запросов. Для обработки фактических клиентских подключений мы будем использовать веб-сервер Nginx, который будет передавать запросы uWSGI. Поскольку эти компоненты работают на одном компьютере, предпочтительно будет использовать сокет Unix, так как он быстрее и безопаснее. Назовем этот сокет ndvi.sock и разместим его в этом каталоге.
Далее мы созадим файл служебных элементов systemd. Создание файла элементов systemd позволит системе инициализации Ubuntu автоматически запускать uWSGI и обслуживать приложение Flask при загрузке сервера.
Для начала создаем файл службы:
andrey@andrey-VirtualBox:~$ sudo nano /etc/systemd/system/NDVI-web.service
[Unit]
Description=uWSGI instance to serve NDVI-web
After=network.target
[Service]
User=andrey
Group=www-data
WorkingDirectory=/home/andrey/NDVI-web
ExecStart=/usr/bin/uwsgi --ini ndvi.ini
[Install]
WantedBy=multi-user.target
Теперь мы запустим созданную службу uWSGI и активируем ее запуск при загрузке системы:
andrey@andrey-VirtualBox:~$ sudo systemctl start NDVI-web.service
andrey@andrey-VirtualBox:~$ sudo systemctl enable NDVI-web.service
andrey@andrey-VirtualBox:~$ sudo systemctl status NDVI-web.service
● NDVI-web.service - uWSGI instance to serve NDVI-web
Loaded: loaded (/etc/systemd/system/NDVI-web.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2021-06-13 16:42:57 EET; 11s ago
Main PID: 6224 (uwsgi)
Tasks: 6 (limit: 4648)
Memory: 3.2M
CGroup: /system.slice/NDVI-web.service
├─6224 /usr/bin/uwsgi --ini ndvi.ini
├─6225 /usr/bin/uwsgi --ini ndvi.ini
├─6226 /usr/bin/uwsgi --ini ndvi.ini
├─6227 /usr/bin/uwsgi --ini ndvi.ini
├─6228 /usr/bin/uwsgi --ini ndvi.ini
└─6229 /usr/bin/uwsgi --ini ndvi.ini
Сервер приложений uWSGI должен быть запущен и ожидать запросы файла сокета в каталоге проекта. Настроим Nginx для передачи веб-запросов на этот сокет с помощью протокола uwsgi.
Вначале мы создадим новый файл конфигурации серверных блоков в каталоге Nginx sites-available. Назовем его NDVI-web для соответствия остальным именам в этом модуле:
andrey@andrey-VirtualBox:~$ sudo nano /etc/nginx/sites-available/NDVI-web
Содержимое файла:
server {
listen 90;
server_name andrey-VirtualBox www.andrey-VirtualBox;
location / {
include uwsgi_params;
uwsgi_pass unix:/home/andrey/NDVI-web/ndvi.sock;
}
}
Доменное имя получаем с помощью команды
andrey@andrey-VirtualBox:~$ hostname
Чтобы активировать созданную конфигурацию серверных блоков Nginx, необходимо привязать файл к каталогу sites-enabled:
andrey@andrey-VirtualBox:~$ sudo ln -s /etc/nginx/sites-available/NDVI-web /etc/nginx/sites-enabled
Перезапустим процесс Nginx для чтения новой конфигурации:
andrey@andrey-VirtualBox:~$ sudo systemctl restart nginx
В заключение снова изменим настройки брандмауэра. Нам больше не потребуется доступ через порт 5000, и мы можем удалить это правило. Затем мы сможем разрешить доступ к серверу Nginx:
andrey@andrey-VirtualBox:~$ sudo ufw delete allow 5000
andrey@andrey-VirtualBox:~$ sudo ufw allow 'Nginx Full'
Теперь мы можем обращаться к приложению через доменное имя
http://andrey-VirtualBox
В процессе выполнения курсовой работы было реализовано web-приложение для расчета NDVI по загружаемым спутниковым снимкам. Была создана точка входа uWSGI, а также настроен автоматический запуск службы приложение systemd. Наконец приложение было развернуто на web-сервере Nginx, который позволяет пользователям по доменному имени подключаться к ресурсу.