Настройка веб-службы торнадо в производстве с обратным прокси-сервером nginx

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

python index.py

index.py - это мой обработчик приложения торнадо, который прослушивает порт 8001. Затем я запрашиваю веб-службу с помощью http://localhost:8001. Теперь я развертываю тестовую среду в промежуточной среде, которая должна отражать производство. Как я могу использовать торнадо в производстве? Я предполагаю, что мне нужно создать какой-то демон для приложения, но я не знаю, с чего начать!

Ответ 1

Есть несколько инструментов, которые вы можете использовать.

Сначала Supervisord

Supervisord - это "система управления процессом", вы настраиваете свои процессы и позволяете Supervisor управлять ими, они перезапускают их, если они не работают, упрощают управление ими и сохраняют их в фоновом режиме.

Вот пример конфигурационного файла диспетчера

[program:myprogram] 
process_name=MYPROGRAM%(process_num)s
directory=/var/www/apps/myapp 
command=/var/www/apps/myapp/virtualenv/bin/python index.py --PORT=%(process_num)s
startsecs=2
user=youruser
stdout_logfile=/var/log/myapp/out-%(process_num)s.log
stderr_logfile=/var/log/myapp/err-%(process_num)s.log
numprocs=4
numprocs_start=14000

С этой конфигурацией Supervisor запустит 4 (numprocs) экземпляры index.py на портах 14001-14004 (numprocs_start). Мы передаем --PORT=%(process_num)s, чтобы каждый процесс запускался на другом порту. Вы должны изменить numprocs и numprocs_start в соответствии с вашей средой/оборудованием. Как правило, мы запускаем процессы ядра 2xCPU (так что четырехъядерный процессор будет иметь 8 процессов), но это может сильно варьироваться в зависимости от того, что делают ваши процессы и сколько блокировки в вашем коде.

Затем настройте NGINX для пересылки запросов на ваш сайт

   upstream myappbackend {
            server 127.0.0.1:14001  max_fails=3     fail_timeout=1s;
            server 127.0.0.1:14002  max_fails=3     fail_timeout=1s;
            server 127.0.0.1:14003  max_fails=3     fail_timeout=1s;
            server 127.0.0.1:14004  max_fails=3     fail_timeout=1s;
    }

    server {
            listen                                          4.5.6.7:80;
            server_name                                     example.com;

            access_log      /var/log/nginx/myapp.log  main;


            location / {
                    proxy_set_header                Host            $host;
                    proxy_set_header                X-Real-Ip       $remote_addr;
                    proxy_pass                      http://myappbackend/;
            }
    }      

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