Настройка Nginx + perl-fcgi

Nginx все очень хвалят за его производительность. Но никто не учитывает тот факт, что он так шустро работает из-за отсутствия всех тех модулей, которые расширяют функционал Apache. Для Nginx нельзя установить модуль обработки perl или python файлов через обычный установщик пакетов.

Nginx больше всего похож на универсальный фронт-энд.

В этой статье я хочу рассмотреть пример того, как можно настроить Nginx на работу с perl скриптами.

Все мои записки строились на базе Linux Ubuntu. Если вы используете CentOS, RedHat или OpenSuse, то принципиальных различий не встретите, кроме названий пакетов и местонахождения конфигурационных файлов. Если у Вас возникнут трудности — обращайтесь через форму обратной связи.

Итак, для начала нужно установить FCGI библиотеки для Perl.

apt-get install libfcgi-perl

Дальше качаем wraper и скрипт для его запуска:

wget http://nginxlibrary.com/downloads/perl-fcgi/fastcgi-wrapper -O /usr/bin/fastcgi-wrapper.pl  
wget http://nginxlibrary.com/downloads/perl-fcgi/perl-fcgi -O /etc/init.d/perl-fcgi

Если ссылки не работают можете воспользоваться вот этими:

wget http://tech-notes.tk/wp-content/uploads/2014/02/fastcgi-wrapper -O /usr/bin/fastcgi-wrapper.pl  
wget http://tech-notes.tk/wp-content/uploads/2014/02/perl-fcgi -O /etc/init.d/perl-fcgi

Выставляем правильные права доступа на файлы (делаем их исполняемыми):

chmod +x /usr/bin/fastcgi-wrapper.pl  
chmod +x /etc/init.d/perl-fcgi

Init.d скрипт нужно немного подредактировать:

  • поменять su - на sudo -u
  • убрать -c из строки выполнения

Для этого выполните следующуую команду в bash^

sed -i -e 's/su\ -/sudo\ -u/g' -e '/sudo/s/-c\ //g' /etc/init.d/perl-fcgi

Ставим на загрузку и запускаем перловый сервер:

update-rc.d perl-fcgi defaults  
/etc/init.d/perl-fcgi start

По умолчанию сервер perl-fcgi запустится на 8999 порту. Конечно это лучше проверить:

netstat -anp |grep -i perl

Дальше нужно научить Nginx проксировать запросы в perl. Добавляем вот такие строки в файл с конфигурацией виртуального хоста Nginx.

location ~ \.pl$ {
  try_files $uri =404;
  gzip off;
  fastcgi_pass  127.0.0.1:8999;
  fastcgi_index index.pl;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include fastcgi_params;
}

Теперь наш Nginx умеет работать с perl.
Можно выполнить проверку конфигурации nginx и перезапустить его, чтобы изменения вступили в силу:

nginx -t  
/etc/init.d/nginx restart

Для проверки можно созддать файл info.pl в корневом каталоге сайта и открыть этот скрипт в браузере.

info.pl
</p>
#!/usr/bin/perl
# test.cgi by Bill Weinman [http://bw.org/]
# Copyright 1995-2008 The BearHeart Group, LLC
# Free Software: Use and distribution under the same terms as perl.

use strict;
use warnings;
use CGI;

print foreach (
    "Content-Type: text/plain\n\n",
    "BW Test version 5.0\n",
    "Copyright 1995-2008 The BearHeart Group, LLC\n\n",
    "Versions:\n=================\n",
    "perl: $]\n",
    "CGI: $CGI::VERSION\n"
);

my $q = CGI::Vars();
print "\nCGI Values:\n=================\n";
foreach my $k ( sort keys %$q ) {
    print "$k [$q->{$k}]\n";
}

print "\nEnvironment Variables:\n=================\n";
foreach my $k ( sort keys %ENV ) {
    print "$k [$ENV{$k}]\n";
}