Настройка nginx uwcgi mediacore (продакшн)

В предыдущем материале был описан процесс установки и настройки медиа портала mediacore в режиме development.
Сейчас пришло время установить и настроить связку nginx uwsgi mediacore, для работы в production режиме.

Установка веб сервера nginx

Что такое nginx, дкмаю рассказывать никоому не нужно), если он еще не установлен, ставим.
Свежую версию можно получить, добавив репозитарий с официального сайта nginx.
В конец файла /etc/apt/sources.list добавляем:

deb http://nginx.org/packages/debian/ squeeze nginx
deb-src http://nginx.org/packages/debian/ squeeze nginx

оттуда-же, с оффсайта nginx, берем ключ:

root@server:~# wget http://nginx.org/keys/nginx_signing.key

выполняем:

root@server:~# apt-key add nginx_signing.key
OK

готово, ну и теперь обновляем список пакетов и ставим текущую стабильную версию nginx:

root@server:~# apt-get update
root@server:~# apt-get install nginx

Установка и настройка uwsgi

Теперь поставим WSGI приложение которое будет обрабатывать запросы к Mediacore, приходящие через nginx. Для этого выполняем:

обратите внимание, виртуальная среда должнв быть уже активирована командой source /home/mediacore_env/bin/activate

(mediacore_env)root@server:/home/mediacore# pip install uwsgi

создаем новый конфигурационный файл для mediacore

(mediacore_env)root@server:/home/mediacore# paster make-config MediaCore deployment.ini

прописываем правильные данные для доктупа к базе mysql, как делали ранее и дописываем в конец следующий блок настроек для uwsgi

[uwsgi]
socket = /tmp/uwsgi.sock # файл сокета для связи nginx и uwsgi
master = true # менеджер основного процесса uwsgi
processes = 5 # количество рабочих процессов
home = /home/mediacore # домашняя папка mediacore 
daemonize = /var/log/uwsgi.log # запускать uwsgi в режиме демона с логгированием в указанный файл 

кроме того, делаем некоторую оптимизацию в файле конфига, должно получится:

static_files = false 
file_serve_method = nginx_redirect 

запускаем uwsgi с нашим новым конфигом;

(mediacore_env)root@server:/home/mediacore# uwsgi --ini-paste /home/mediacore/deployment.ini
[uWSGI] getting INI configuration from /home/mediacore/deployment.ini

на всякий случай проверяем что там упало в /var/log/uwsgi.log, так-же не лишним будет посмотреть на месте-ли файл сокета /tmp/uwsgi.sock, если все в норме, отлично.

В самом конце статьи выложил рабочий init скрипт, набросал за 3 минуты на коленке, так что строго не судите, кому нужно, сам до ума доведет).

Настройка nginx

Очередь за nginx.
В папке /etc/nginx/conf.d, создаем файл mediacore.conf следующего содержания:

   server {
        listen       192.168.50.131:80;
        server_name  mediacore.grt;

        #charset koi8-r;

        access_log  /var/log/nginx/mediacore.access.log  main;
        error_log   /var/log/nginx/mediacore.error.log error;

        root /home/mediacore/mediacore/public;

        location ~*/(appearance)/ {
            root /home/mediacore/data ;
            break;
        }

        location ~*(/images\/media|images\/podcasts) {
            root /home/mediacore/data ;
            break;
        }

        location ~*/(styles|scripts|images)/ {
            expires max;
            add_header Cache-Control "public";
            break;
        }

        location /__mediacore_serve__ {
            alias /home/mediacore/data/media;
            internal;
        }

        location / {
            uwsgi_pass      unix:/tmp/uwsgi.sock; # отправляем на uwsgi
            include         uwsgi_params;
            uwsgi_param     SCRIPT_NAME '';
       }

        error_page  404              /404.html;
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

Проверяем правильность конфига, если все в норме, запускаем nginx:

root@server:/etc/nginx/conf.d# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

root@server:/etc/nginx/conf.d# /etc/init.d/nginx start

Идем в браузер и смотрим что получилось, для проверки добавляем видео, все работает.

Тперь по поводу пользователя от которого будет работать uwsgi, при написании я не стал заморачиваться и все делал от рута, поскольку машина все таки виртуалка а не боевой сервак, но в рабочих условиях это крайне не желательно.
Как привести все в порядок. Во первых нужно создать пользователя, например mediacore, назначив ему домашней папкой /home/mediacore. Изменить владельца этой папки со всем содержимым на mediacore, поскольку папку я создал под рутом, принадлежит она руту, хоть и числится домашней для mediacore. Ну и запускать uwsgi с соответствующими ключами --uid, --gid. Вообще рекомендую посмотреть uwsgi -h, там довольно много ключей.

Для запуска получилось что-то в этом духе:
init скрипт uwsgi.sh

#!/bin/bash
### BEGIN INIT INFO
# Provides:          uwsgi
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: uwsgi
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

PIDFILE="/var/run/uwsgi.pid"
USER=mediacore
GROUP=mediacore

case "$1" in
    start)
        export PYTHON_EGG_CACHE=/tmp/.python-eggs
        source /home/mediacore_env/bin/activate
        uwsgi --pidfile $PIDFILE --uid $USER --gid $GROUP --ini-paste /home/mediacore/deployment.ini
    ;;
    stop)
        PID=`cat $PIDFILE`
        kill -QUIT $PID
        rm -f $PIDFILE
    ;;
      *) echo "Usage: $0 {start|stop)" >&2; exit 1 ;;
esac

coxраняем в /etc/init.d/uwsgi.sh, и не забываем сделать его исполняемым

root@server:/# chmod +x /etc/init.d/uwsgi.sh

добавляем в автозапуск

update-rc.d uwsgi.sh defaults

На этом вроде все.
Удачи.

Комментарии

Подскажите, все делал по вашему алгоритму, ничего не пропустил, переделал несколько раз, но на этапе

root@server:/etc/nginx/conf.d# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

root@server:/etc/nginx/conf.d# /etc/init.d/nginx start

в браузер выдается страничка 404 которую выдает nginx

если не сложно подскажите с чем это может быть связано, насколько я понимаю nginx по какимто причинам после запуска не видит корень
root /home/mediacore/mediacore/public;

в логе есть
2013/03/28 18:34:11 [error] 3158#0: *4 connect() to unix:/tmp/uwsgi.sock failed (111: Connection refused) while connecting to upstream
2013/03/28 18:34:11 [error] 3158#0: *4 open() "/etc/nginx/html/50x.html" failed (2: No such file or directory)

connect() to unix:/tmp/uwsgi.sock failed (111: Connection refused) while connecting to upstream

это скорее какие-то вилы с uwsgi, он точно запущен ?

Сейчас посмотрел логи wsgi

Ошибка paste.deploy

*** Starting uWSGI 1.9.3 (64bit) on [Thu Mar 28 19:44:35 2013] ***
compiled with version: 4.4.5 on 28 March 2013 17:25:42
os: Linux-2.6.32-5-amd64 #1 SMP Sun Sep 23 10:07:46 UTC 2012
nodename: p165266.kvmvps
machine: x86_64
clock source: unix
detected number of CPU cores: 4
current working directory: /home/mediacore
detected binary path: /home/mediacore_env/bin/uwsgi
uWSGI running as root, you can use --uid/--gid/--chroot options
*** WARNING: you are running uWSGI as root !!! (use the --uid flag) ***
your memory page size is 4096 bytes
detected max file descriptor number: 1024
lock engine: pthread robust mutexes
uwsgi socket 0 bound to UNIX address /tmp/uwsgi.sock fd 3
Python version: 2.6.6 (r266:84292, Dec 26 2010, 22:48:11) [GCC 4.4.5]
Set PythonHome to /home/mediacore
'import site' failed; use -v for traceback
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0x2570eb0
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 436080 bytes (425 KB) for 5 cores
*** Operational MODE: preforking ***
Loading paste environment: config:/home/mediacore/deployment.ini
ImportError: No module named paste.deploy

И что с этим делать ума не приложу

где-то вы спитоном ошиблись, либо с правами на папки

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
Регистр имеет значение
     .ooo          .o.                  ooooooooooooo    .oooooo.       oooooooooo.  
.88' .888. 8' 888 `8 d8P' `Y8b `888' `Y8b
d88' .8"888. .oooo.o 888 888 888 888 888
d888P"Ybo. .8' `888. d88( "8 888 888 888 888oooo888'
Y88[ ]88 .88ooo8888. `"Y88b. 888 888 888 888 `88b
`Y88 88P .8' `888. o. )88b 888 `88b d88b 888 .88P
`88bod8' o88o o8888o 8""888P' o888o `Y8bood8P'Ybd' o888bood8P'


Введите код, изображенный в стиле ASCII-арт.