Как развернуть приложения Python Web2py с помощью uWSGI и Nginx в Ubuntu 14.04

Вступление

Фреймворк web2py - это мощный и простой в использовании инструмент для быстрой разработки полнофункциональных веб-приложений на Python. С помощью web2py вы можете легко разрабатывать и управлять своими приложениями с помощью административного веб-интерфейса.

В этом руководстве мы продемонстрируем, как развернуть приложение web2py в Ubuntu 14.04. Мы будем использовать сервер приложений uWSGI для взаимодействия с приложением с несколькими рабочими процессами. Перед uWSGI мы настроим Nginx в конфигурации обратного прокси-сервера для обработки фактических клиентских подключений. Это гораздо более надежная стратегия развертывания, чем использование сервера web2py или uWSGI.

Предпосылки и цели

Чтобы выполнить это руководство, у вас должен быть новый экземпляр сервера Ubuntu 14.04 с пользователем без полномочий root с настроенными привилегиями + sudo +. Вы можете узнать, как это настроить, запустив наше https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 руководство по настройке начального сервера].

Мы будем загружать инфраструктуру web2py и тестировать ее, чтобы убедиться, что среда приложения по умолчанию работает правильно. После этого мы загрузим и установим контейнер приложения uWSGI, который будет служить интерфейсом между запросами и кодом Python web2py. Перед этим мы настроим Nginx, чтобы он мог обрабатывать клиентские соединения и запросы прокси к uWSGI. Мы настроим каждый из наших компонентов для запуска при загрузке, чтобы минимизировать необходимость административного вмешательства.

Загрузите web2py Framework

Нашим первым шагом будет загрузка самой фреймворка web2py. Это поддерживается в репозитории + git + на GitHub, поэтому лучший способ скачать его - с самим + git +.

Мы можем скачать и установить + git + из репозиториев Ubuntu по умолчанию, набрав:

sudo apt-get update
sudo apt-get install git

После установки + git + мы можем клонировать репозиторий в домашний каталог нашего пользователя. Мы можем назвать приложение как угодно. В нашем примере мы используем имя ++ для простоты. Нам нужно добавить флаг + - recursive +, потому что уровень абстракции базы данных обрабатывается как его собственный подмодуль + git +:

git clone --recursive https://github.com/web2py/web2py.git ~/

Платформа web2py будет загружена в каталог с именем + myapp + в вашем домашнем каталоге.

Мы можем протестировать приложение по умолчанию, перейдя в каталог:

cd ~/

Административный интерфейс должен быть защищен SSL, чтобы мы могли сделать простой самоподписанный сертификат, чтобы проверить это. Создайте ключ сервера и сертификат, набрав:

openssl req -x509 -new -newkey rsa:4096 -days 3652 -nodes -keyout .key -out .crt

Вам нужно будет заполнить некоторую информацию для генерируемого вами сертификата. Единственная часть, которая действительно имеет значение в этих обстоятельствах, это поле + Common Name +, которое должно ссылаться на доменное имя или IP-адрес вашего сервера:

. . .

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:[email protected]

Когда вы закончите, ключ SSL и сертификат должны быть в каталоге вашего приложения. Они будут называться + .key и` + .ctrl` соответственно.

После этого мы можем запустить веб-интерфейс web2py, чтобы протестировать его. Для этого мы можем набрать:

python web2py.py -k .key -c .crt -i 0.0.0.0 -p 8000

Вам будет предложено выбрать пароль для административного интерфейса.

Теперь вы можете посетить свое приложение в веб-браузере, перейдя по ссылке:

https://:8000

Убедитесь, что вы используете + https + вместо + http + в указанном выше адресе. Вы будете предупреждены, что ваш браузер не распознает сертификат SSL:

изображение: https: //assets.digitalocean.com/articles/web2py_uwsgi_nginx_1404/ssl_warning.png [предупреждение web2py SSL]

Это ожидается, так как мы подписали наш собственный сертификат. Нажмите на ссылку «Дополнительно» или любую другую ссылку, которую дает вам ваш браузер, а затем перейдите на сайт, как и планировалось. Вы увидите интерфейс web2py:

изображение: https: //assets.digitalocean.com/articles/web2py_uwsgi_nginx_1404/welcome_app.png [приложение приветствия web2py]

Нажав на кнопку «Административный интерфейс» справа, вы сможете ввести пароль, выбранный вами при запуске сервера, и перейти на сайт администрирования:

изображение: https: //assets.digitalocean.com/articles/web2py_uwsgi_nginx_1404/admin_interface.png [интерфейс администратора web2py]

Это дает вам доступ к реальному коду, который запускает ваши приложения, позволяя вам редактировать и настраивать файлы из самого интерфейса.

Когда вы закончите осматриваться, введите CTRL-C обратно в окно терминала. Мы протестировали наше приложение и продемонстрировали, что к нему можно получить доступ в Интернете, когда запущен сервер разработки web2py.

Установите и настройте uWSGI

Теперь, когда у нас работает приложение web2py, мы можем настроить uWSGI. uWSGI - это сервер приложений, который может взаимодействовать с приложениями через стандартный интерфейс WSGI. Чтобы узнать больше об этом, прочитайте https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on-ubuntu-14-04 # определения и понятия [этот раздел] нашего руководства по настройке uWSGI и Nginx в Ubuntu 14.04.

Установка uWSGI

В отличие от руководства, указанного выше, в этом руководстве мы будем устанавливать uWSGI по всему миру. Прежде чем мы сможем установить uWSGI, нам нужно установить + pip +, менеджер пакетов Python и файлы разработки Python, на которые опирается uWSGI. Мы можем установить их прямо из репозиториев Ubuntu:

sudo apt-get install python-pip python-dev

Теперь мы можем установить uWSGI глобально с помощью + pip +, набрав:

sudo pip install uwsgi

Контейнерный сервер приложений uWSGI взаимодействует с приложениями Python, используя спецификацию интерфейса WSGI. Фреймворк web2py содержит файл, предназначенный для предоставления этого интерфейса в каталоге + handlers +. Чтобы использовать файл, нам нужно переместить его из каталога в основной каталог проекта:

mv ~//handlers/wsgihandler.py ~/

Используя обработчик WSGI в главном каталоге проекта, мы можем проверить, что uWSGI может обслуживать приложение, введя:

uwsgi --http :8000 --chdir ~/ -w wsgihandler:application

Это должно запустить приложение снова на порт 8000. На этот раз, поскольку мы не используем сертификат и ключ SSL, он будет обслуживаться по обычному HTTP вместо HTTPS. Вы можете проверить это снова в своем браузере, используя протокол + http +. Вы не сможете проверить интерфейс администратора, потому что web2py отключает это, когда шифрование недоступно.

Когда вы закончите, введите CTRL-C в окне терминала, чтобы остановить сервер.

Создание файла конфигурации uWSGI

Теперь, когда мы знаем, что uWSGI может обслуживать приложение, мы можем создать файл конфигурации uWSGI с информацией нашего приложения.

Создайте каталог в + / etc / uwsgi / sites для хранения ваших настроек и затем перейдите в этот каталог:

sudo mkdir -p /etc/uwsgi/sites
cd /etc/uwsgi/sites

Мы назовем наш файл конфигурации + myapp.ini +:

sudo nano .ini

В файле конфигурации нам нужно начать с заголовка + [uwsgi] +, в который будут помещены все наши директивы конфигурации. После заголовка мы укажем путь к каталогу нашего приложения и сообщим ему модуль для выполнения. Это будет та же информация, которую мы использовали в командной строке ранее. Вам не нужно изменять строку модуля:

[uwsgi]
chdir = /home//
module = wsgihandler:application

Далее нам нужно указать, что мы хотим, чтобы uWSGI работал в режиме master. Мы хотим создать пять рабочих процессов:

[uwsgi]
chdir = /home//
module = wsgihandler:application

master = true
processes = 5

Далее нам нужно указать, как мы хотим, чтобы uWSGI получал соединения. В нашем тесте сервера uWSGI мы приняли нормальные HTTP-соединения. Однако, поскольку мы будем настраивать Nginx в качестве обратного прокси-сервера перед uWSGI, у нас есть другие варианты. Nginx может прокси использовать протокол + uwsgi +, быстрый двоичный протокол, разработанный uWSGI для связи с другими серверами. Мы будем общаться с использованием этого протокола, который используется по умолчанию, если мы не указываем другой протокол.

Поскольку мы общаемся с Nginx по протоколу + uwsgi +, нам не нужен сетевой порт. Вместо этого мы будем использовать сокет Unix, который является более безопасным и быстрым. Мы разместим это в нашем каталоге приложений. Нам нужно изменить разрешения, чтобы группа могла читать и писать в сокет. Через некоторое время мы передадим сокету группу процессов Nginx, чтобы uWSGI и Nginx могли общаться через сокет:

[uwsgi]
chdir = /home//
module = wsgihandler:application

master = true
processes = 5

socket = /home///.sock
chmod-socket = 660
vacuum = true

Директива +uum +, приведенная выше, очистит файл сокета после завершения процесса uWSGI.

Наш файл конфигурации uWSGI теперь готов. Сохраните и закройте файл.

Создать файл upstart uWSGI

Мы создали файл конфигурации для uWSGI, но мы до сих пор не настроили наш сервер приложений для автоматического запуска при загрузке. Для реализации этой функциональности мы можем создать простой файл Upstart. Мы скажем ему запускать uWSGI в «режиме Emperor», который позволяет серверу приложений читать любое количество конфигураций и запускать сервер для каждой из них.

Создайте файл в каталоге + / etc / init +, где процесс Upstart ищет свои файлы конфигурации:

sudo nano /etc/init/uwsgi.conf

Мы начнем с того, что дадим нашему сервисному файлу описание и укажем, с каких уровней запуска мы хотим его запускать автоматически. Обычные многопользовательские уровни выполнения: 2, 3, 4 и 5. Upstart будет останавливать службу, когда сервер переходит на другие уровни выполнения (например, во время выключения, перезагрузки или однопользовательского режима):

description "uWSGI application server in Emperor mode"

start on runlevel [2345]
stop on runlevel [!2345]

Далее нам нужно указать пользователя и группу для запуска процесса. Мы будем использовать нашу обычную учетную запись пользователя, поскольку она владеет всеми файлами нашего проекта. Для нашей группы нам нужно разрешить владение группой + www-data, которая является группой, в которой работает Nginx. Это позволит веб-серверу свободно обмениваться данными с uWSGI, поскольку наша конфигурация uWSGI предоставила группе сокетов права на чтение и запись.

После этого нам просто нужно указать команду для запуска uWSGI. Нам просто нужно использовать флаг + - emperor + и передать ему каталог, содержащий наш файл конфигурации:

description "uWSGI application server in Emperor mode"

start on runlevel [2345]
stop on runlevel [!2345]

setuid
setgid www-data

exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites

Это запустит сервер приложений uWSGI для управления нашим сайтом web2py. Режим Emperor позволяет нам легко добавлять файлы конфигурации в этот каталог для других проектов. Они будут обработаны автоматически.

Теперь мы закончили с нашим сценарием Upstart. Сохраните и закройте файл. На данный момент мы не можем запустить службу uWSGI, потому что мы еще не установили Nginx. Это означает, что группа, под которой мы сказали запускать наш скрипт, еще не доступна.

Установите и настройте Nginx в качестве обратного прокси

Теперь, когда uWSGI настроен и готов к работе, мы можем установить и настроить Nginx в качестве нашего обратного прокси-сервера. Это можно скачать из стандартных репозиториев Ubuntu:

sudo apt-get install nginx

После установки Nginx мы можем изменить конфигурацию блока сервера. Мы будем использовать серверный блок по умолчанию в качестве базы, так как он имеет большую часть того, что нам нужно:

sudo nano /etc/nginx/sites-available/default

Приложение web2py определяет, подключаетесь ли вы по обычному HTTP или с использованием шифрования SSL. Из-за этого наш файл фактически будет содержать один блок сервера для каждого. Мы начнем с серверного блока, настроенного на работу с портом 80.

Измените + server_name +, указав имя домена или IP-адрес, по которому ваш сайт должен быть доступен. После этого мы создадим блок + location {} +, который будет соответствовать запросам на статическое содержимое. По сути, мы хотим использовать регулярные выражения для сопоставления запросов, заканчивающихся на + / static / +, с предшествующим компонентом пути. Мы хотим отобразить эти запросы в каталог + Applications + в нашем проекте web2py. Убедитесь, что вы указали домашний каталог вашего пользователя и имя приложения:

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html;
   index index.html index.htm;

   server_name ;





   . . .

После этого нам нужно настроить блок + location / {} + для передачи запросов в наш сокет uWSGI. Нам просто нужно включить файл параметров uWSGI, упакованный с Nginx, и передать запросы в настроенный сокет (в нашем файле uWSGI + .ini +):

server {
   listen 80 default_server;
   listen [::]:80 default_server ipv6only=on;

   root /usr/share/nginx/html;
   index index.html index.htm;

   server_name ;

   location ~* /(\w+)/static/ {
       root /home///applications/;
   }

   location / {


   }
}

Это будет все, что нам нужно для нашего первого блока сервера.

В нижней части файла находится закомментированный раздел, в котором содержится большинство директив, необходимых для обслуживания контента с помощью SSL. Вы можете идентифицировать этот блок, потому что он имеет + listen 443; + в качестве первой директивы. Раскомментируйте этот блок, чтобы начать его настройку.

Для начала измените + server_name + еще раз, чтобы соответствовать доменному имени или IP-адресу вашего сервера. Затем мы можем перейти к директивам + ssl_certificate + и + ssl_certificate_key +. Мы будем помещать сгенерированные нами SSL-сертификаты в каталог + / etc / nginx / ssl +, поэтому укажите путь к файлам в этом месте:

server {
   listen 443;
   server_name ;

   root html;
   index index.html index.htm;

   ssl on;
   ssl_certificate ;
   ssl_certificate_key ;

   . . .

В списке + ssl_protocols + удалите SSLv3, поскольку обнаружены уязвимости, присущие самому протоколу.

Затем мы можем перейти к блоку + location / {} + и поместить ту же самую информацию о прокси uWSGI, которую мы сделали в последнем блоке сервера:

server {
   listen 443;
   server_name ;

   root html;
   index index.html index.htm;

   ssl on;
   ssl_certificate /etc/nginx/ssl/.crt;
   ssl_certificate_key /etc/nginx/ssl/.key;

   ssl_session_timeout 5m;

   ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
   ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
   ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
   ssl_prefer_server_ciphers on;

   location / {


   }
}

Теперь у вас должно быть два серверных блока, настроенных в этом файле. Сохраните и закройте его, когда закончите.

Заключительные шаги

Далее нам нужно переместить SSL-сертификаты в каталог, который мы указали. Сначала создайте каталог:

sudo mkdir -p /etc/nginx/ssl

Теперь переместите созданный вами сертификат и ключ в этот каталог. Если у вас есть сертификат SSL, подписанный коммерческим центром сертификации, вы можете заменить сертификат и соответствующий ключ здесь, чтобы избежать предупреждений о недоверенных сертификатах SSL для ваших посетителей:

sudo mv ~//.crt /etc/nginx/ssl
sudo mv ~//.key /etc/nginx/ssl

Измените разрешения, чтобы пользователи без полномочий root не могли получить доступ к этому каталогу:

sudo chmod 700 /etc/nginx/ssl

Теперь проверьте файл конфигурации Nginx на наличие синтаксических ошибок:

sudo nginx -t

Если нет сообщений о синтаксических ошибках, мы можем продолжить и перезапустить Nginx:

sudo service nginx restart

Мы также можем запустить наш сервис uWSGI:

sudo service uwsgi start

Последнее, что нам нужно сделать, это скопировать файл параметров нашего приложения, чтобы он правильно читался при обслуживании соединений через порт 443. Он содержит пароль, который мы настроили для административного интерфейса. Нам просто нужно скопировать его в новое имя, которое указывает порт 443 вместо порта 8000:

cp ~//parameters_8000.py ~//parameters_443.py

Благодаря этому вы сможете получить доступ к своему серверу, используя доменное имя или IP-адрес сервера. Используйте + https +, если вы хотите войти в административный интерфейс.

Заключение

В этом руководстве мы настроили пример проекта web2py для практического развертывания. Мы настроили uWSGI для взаимодействия между нашим приложением и клиентскими запросами. Затем мы настроили Nginx перед uWSGI, чтобы разрешить SSL-соединения и эффективно обрабатывать запросы клиентов.

Проект web2py упрощает разработку сайтов и веб-приложений, предоставляя работоспособный веб-интерфейс с самого начала. Используя общую цепочку инструментов, описанную в этой статье, вы можете легко обслуживать созданные вами приложения с одного сервера.

Related