Связка nginx + perl в Debian 7 Wheezy


Недавно понадобилось подружить perl и nginx на Debian 7 Wheezy, чтобы заработала небольшая панель управления, написанная на perl. Так как nginx не умеет напрямую выполнять CGI приложения, но умеет их выполнять через FastCGI, то задача решается с помощью готового сервера CGI приложений - fcgiwrap. Он имеется в главном репозитории Debian. Рассматривать установку nginx я не буду, она тривиальна, но коротко сообщу о том, что я всегда ставлю стабильную версию c репозитория разработчиков nginx, ибо это истинный путь джедая.

Итак, в первую очередь следует установить и настроить fcgiwrap:

apt-get install fcgiwrap
nano /etc/init.d/fcgiwrap

В блоке # FCGI_APP Variables следует указать пользователя и группу, от которого будут запускаться perl-скрипты. Также можно указать количество дочерних процессов, но если высокая нагрузка не планируется - следует оставить по умолчанию. У меня сделано так:

# FCGI_APP Variables
FCGI_CHILDREN="1"
FCGI_SOCKET="/var/run/$NAME.socket"
FCGI_USER="www-data"
FCGI_GROUP="www-data"
FCGI_SOCKET ничто иное, как сокет FastCGI, к которому будет обращаться nginx. В моем случае это файл сокета /var/run/fcgiwrap.socket. Но можно указать и сетевой сокет, соотвественно, правильно указав его в конфиге nginx. Пример:

# FCGI_APP Variables
FCGI_CHILDREN="1"
FCGI_PORT="8999"
FCGI_ADDR="127.0.0.1"
FCGI_USER="www-data"
FCGI_GROUP="www-data"

Вторым шагом следует настроить location в nginx для обработки perl-скриптов. Файл находится либо в /etc/nginx/conf.d, либо в /etc/nginx/sites-enabled, в зависимости от установленного пакета nginx.

server {
    listen   80;
    server_name www.example.com example.com;
    access_log /var/www/www.example.com/logs/access.log;
    error_log /var/www/www.example.com/logs/error.log;
    root   /var/www/www.example.com/public_html;
 
    location / {
        index  index.html index.htm;
    }
 
    location ~ \.pl$ {
        gzip off;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
        fastcgi_index index.pl;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Рестартуем сервисы fcgiwrap и nginx:

/etc/init.d/fcgiwrap restart
/etc/init.d/nginx restart

Собсно, это всё. Чтобы проверить работоспособность данной связки - следует положить следующий test.pl скрипт в каталог сайта, который отобразит переменные окружения perl:

#!/usr/bin/perl
 
print "Content-type:text/html\n\n";
print <<EndOfHTML;
<html><head><title>Perl Environment Variables</title></head>
<body>
<h1>Perl Environment Variables</h1>
EndOfHTML
 
foreach $key (sort(keys %ENV)) {
    print "$key = $ENV{$key}<br>\n";
}

print "</body></html>";

Не забываем выставить правильную группу и пользователя на файл, а также права на выполнение:

cd /var/www/www.example.com/public_html
chown www-data:www-data ./test.pl
chmod +x ./test.pl

Далее в браузере заходим по адресу веб сервера, обращаясь к скрипту test.pl - любуемся результатами проделанной работы.