Архивы: FastCGI

Запускаем django на nginx

Давным давно, я писал как установить nginx

там же в комментариях подсказали ещё способ
[cc lang=”bash”]
nginx=stable # use nginx=development for latest development version
add-apt-repository ppa:nginx/$nginx
apt-get update
apt-get install nginx[/cc]

получаем последний nginx.

Напомню, что у меня за nginx стоят разные “бэк-энды”
для самого нагруженного сайта я использую php5-fpm
для остальных сайтов я использую apache2
для Django проектов я использовал Apache2 + mod_python но его прожорливость, давала повод задуматься.

в итоге я искал способ освободить ресурсы занимаемые Индейцем.

Такой способ нашёлся 🙂

создаю конфигурационный файл хоста nginx.

[cc lang=”bash”]touch djangosite[/cc]

у меня они лежат в /etc/nginx/sites-available и уже от туда симлинками идут в /etc/nginx/sites-enabled

Конфигурационный файл такого содержания

[cc lang=”bash”]server {
listen 80;
server_name sitename.ru www.sitename.ru;

charset utf-8;

access_log /var/log/nginx/sitename-access.log;
error_log /var/log/nginx/sitename-error.log;
client_max_body_size 300m;

# Это, чтоб стили и статические файлы админки подгружались, проверьте у себя,
# в разных версиях Ubuntu могут быть разные версии Питона.
# ну и в настройках джанго проекта разумеется у нас тоже указан ADMIN_MEDIA как media_admin

location /media_admin {
alias /usr/lib/python2.5/site-packages/django/contrib/admin/media;
}
location / {
#Это как пример как мы запускаем джангоСервер
#python ./manage.py runfcgi method=prefork socket=/tmp/sitemane.sock pidfile=/tmp/sitename.pid
# Общаться будем по сокету, хотя можно и по 127.0.0.1:8000
fastcgi_pass unix:/tmp/sitename.sock;
#Ага и вот этот файлик не забудем создать, о нём ниже
include fastcgi_params_django;
}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
[/cc]

так же создаём файл

[cc lang=”bash”]touch /etc/nginx/fastcgi_params_django[/cc]

и в него вкладываем вот такие параметры

[cc lang=”bash”]
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_pass_header Authorization;
fastcgi_intercept_errors off;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param SERVER_PROTOCOL $server_protocol;

# PHP only, required if PHP was built with –enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
[/cc]

проверяем верность конфигурации
[cc lang=”bash”]nginx -t[/cc]
если всё ОК идём дальше.

проекты джанго у меня лежат в /home/django

Заходим в нужный нам проект и создадим там скрипт сервера.

[cc lang=”bash”]touch server.sh[/cc]
Вот с таким содержанием

[cc lang=”bash”]#!/bin/bash

case “$1” in
“start”)
#есть 2 варианта запуска сервера, по сети и через unix сокеты
# последний выигрывает по производительности
#python ./manage.py runfcgi method=prefork host=127.0.0.1 port=8000 pidfile=/tmp/sitename.pid
python ./manage.py runfcgi method=prefork socket=/tmp/sitename.sock pidfile=/tmp/sitename.pid
# не забываем, про то, что сокет у нас мог прочитать фронт-энд
# а nginx у меня работает с правами www-data
chown www-data:www-data /tmp/sitename.sock
;;
“stop”)
kill -9 `cat /tmp/sitemane.pid`
;;
“restart”)
$0 stop
sleep 1
$0 start
;;
*) echo “Usage: ./server.sh {start|stop|restart}”;;
esac
[/cc]

Вот и весь скрипт, не забываем только поменять sitename на имя вашего сайта, а то получится, что на один pid или сокет у вас будет ссылаться несколько серверов.

чтоб запустить сервер
[cc lang=”bash”]./server.sh start[/cc]

А вот он и не запустился ругается на Flup

[cc lang=”bash”]No module named flup[/cc]

нам понадобится пакет flup это питоновский пакет, поэтому его я устанавливаю вот так
[cc lang=”bash”]easy_install flup[/cc]
Можно попробовать поставить его из репозитория убунты
[cc lang=”bash”]apt-get install python-flup[/cc]
Но я так не пробовал 😉

Всё сервер запустился, можно перезапустить nginx для применения новой конфигурации

[cc lang=”bash”]/etc/init.d/nginx restart[/cc]

Всё готово, наш сервер запустился.

Теперь по хорошему добавить скрипт запуска сервера в автозагрузку.