Показаны сообщения с ярлыком django. Показать все сообщения
Показаны сообщения с ярлыком django. Показать все сообщения

FastCGI в Lighttpd и Nginx

Сравнение настроек, приводящих к одинаковому результату в Lighttpd и Nginx.

Настройки Lighttpd:
url.rewrite-once += ( "^/testfc$" => "/testfc/", )

fastcgi.server += ( 
        "/testfc" => ((
                        "bin-path" => "/path/to/fcgi/server.py",
                        "socket" => socket_dir + "/viewvc.sock",
                        "max-procs" => 1,
                        "check-local" => "disable",
                        "fix-root-scriptname" => "enable",
        ))
)

Настройки Nginx:
location /testfc/ {
                fastcgi_pass unix:/path/to/fcgi/sock;
                fastcgi_split_path_info ^(/testfc)(.*)$;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param  PATH_INFO $fastcgi_path_info;
                fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;
                include        fastcgi_params;
        }

Nginx сам запускать приложения не умеет, поэтому об этом нужно заботиться заранее. Например можно использовать изысканное решение с помощью systemd.

Внешние скрипты и Django

Когда в следующий раз понадобится запускать какой-то внешний скрипт для облегчения пакетного менеджмента сайтов, пригодится этот пример:

import os
import sys

# укажем путь к нашему django-сайту
sys.path.append('/var/www/mydjango')

# укажем какие настройки следует использовать
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

# импортируем модели
from myapp import models

# используем

Альтернативный вариант, который не предполагает никаких дополнительных изменений в самом скрипте. Просто запустим наш скрипт, установив нужное окружение:

PYTHONPATH=/var/www/mydjango DJANGO_SETTINGS_MODULE=settings python my-script.py

django + lighttpd

Как заставить вместе работать lighttpd и django. Готовый пример конфигурации, которую необходимо складывать в vhosts.d:

$SERVER["socket"] == "0.0.0.0:8888" {
        server.document-root = "/srv/www/django/htdocs"

        url.access-deny = ( "~", ".inc", ".svn/" )

        fastcgi.server = (
                "/dispatch.fcgi" => (
                "main" => (
                        "socket" => "/srv/www/django/run/fcgi.sock",
                        "bin-path" => "/srv/www/django/manage.py runfcgi --pythonpath=/srv/www/django --settings=djangoapp.settings-production method=threaded",
                        "max-procs" => 2,
                        "check-local" => "disable",
                        "fix-root-scriptname" => "enable",
                )
                ),
        )

        alias.url = ( "/static" => "/srv/www/django/htdocs", )

        url.rewrite-once = (
                "^(/static.*)$" => "$1",
                "^/favicon\.ico$" => "/static/favicon.ico",
                "^(/.*)$" => "/dispatch.fcgi$1"
        )
}

Предполагается, что проект лежит в /srv/www/django/, где для него существует рабочая версия настроек в файле settings-production.py. lighttpd сам запустит fcgi-сервер в количестве max-procs экземпляров. Опция check-local необходима для того, чтобы отключить проверку существования файлов на локальной машине, которую делает lighttpd; так как запрашиваемые URL существуют лишь в логике django, а не в файловой системе.

Для правильной работы тегов типа {% url %} необходимо добавить строчку FORCE_SCRIPT_NAME = '' в настройки проекта написанного на django, иначе ко всем ссылкам в начало будет добавляться название /dispatch.fcgi.