Настройка 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)
это скорее какие-то вилы с uwsgi, он точно запущен ?
Сейчас посмотрел логи wsgi
Ошибка paste.deploy
И что с этим делать ума не приложу
где-то вы спитоном ошиблись, либо с правами на папки
Отправить комментарий