Такое техническое решение обладает неоспоримым преимуществом. lighthttpd полностью берет на себя управление приложением, отвечает за количество запущенных процессов. Развернем fastcgi hello world на python.
Важно! Везде в листингах <project_name>
- имя проекта
Определимся с файловой структурой
Каждый администратор создает файловую структуру, так как ему это удобно, привычно. Я привык работать с такой структурой. Некоторые инженеры рекомендует создавать аналогичную структуру в рабочей директории пользователя ssh. Удобно для автоматизированного деплоя. Я создаю все каталоги в корневом каталоге. На все доводы у меня есть контрдовод. В процессе разработки если приходится использовать длинные пути например freebsd /usr/local/www/python/project/
это превращается в сущий кошмар, даже с учетом автодополнения.
/web/<project_name>/
- корневая директория проекта
/web/<project_name>/run/
- директория для сокетных файлов и файлов идентификаторов процессов
/web/<project_name>/logs/
- логи
/web/<project_name>/project/
- директория проекта
/web/<project_name>/env/
- виртуальное окружение для проекта
Подготовим плацдарм
$ mkdir -p /web/<project_name>/{run,logs,project}
$ cd /web/<project_name>
$ virtualenv -ppython2.7 env
Напишем приложение
Установим необходимые модули в виртуальное окружение. Для этого активируем виртуальное окружение и устанавливаем flup
$ cd /web/<project_name>/project/
$ source ../env/bin/activate
(env)$ pip install flup
Создадим исполняемый файл test.fcgi
$ nano /web/<project_name>/project/test.fcgi
#!../env/bin/python
# -*- coding: utf-8 -*-
def myapp(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['Hello World!\n']
if __name__ == '__main__':
from flup.server.fcgi import WSGIServer
WSGIServer(myapp).run()
Протестируем файл:
(env)$ python test.fcgi
Должно запуститься без ошибок.
Установка lighttpd на Debian
$ sudo apt-get install lighttpd
Конфигурирование lighttpd
Перейдем в каталог с конфигурационными файлами
$ sudo su
# cd /etc/lighttpd/
Скопируем предварительно настроенную конфигурацию из папки с доступными настройками
# cp conf-available/10-fastcgi.conf conf-available/<project_name>.conf
Откроем конфигурацию на редактирование <project_name>.conf
# nano conf-available/<project_name>.conf
server.modules += (
"mod_fastcgi",
"mod_rewrite"
)
accesslog.filename = "/var/<project_name>/logs/access.log"
fastcgi.debug = 1
fastcgi.server = ("/run.fcgi" =>
((
"socket" => "/web/<project_name>/run/<project_name>.sock",
"bin-path" => "/web/<project_name>/env/bin/python2.7 /web/<project_name>/project/test.fcgi",
"check-local" => "disable",
"max-procs" => 1,
"broken-scriptfilename" => "enable",
"fix-root-scriptname" => "enable"
))
)
url.rewrite-once = (
"^/(.*)$" => "/run.fcgi/$1"
)
Все директивы модуля fastcgi и rewrite можно посмотреть в официальной докуметации.
После редактирования создадим символическую ссылку:
# ln -s conf-available/svisy.conf conf-enabled/
Тестируем конфигурацию:
# lighttpd -t -f lighttpd.conf
Syntax OK
# service ligthtpd restart
Смотрим лог:
$ tail -f /var/logs/lighttpd/error.log
$ tail -f /web/<project_name>/logs/access.log
Заходим в браузер и тестируем http://127.0.0.1/