Gentoo - nginx, spawn-fcgi, fcgiwrapПодписка на Комментарии к "Gentoo - nginx, spawn-fcgi, fcgiwrap"

Аватар zenon

Собственно сабж. Подключения обработки Perl в Nginx шаблоном.
Подразумеваем, что nginx уже стоит и флаги nginx_modules_http_fastcgi nginx_modules_http_scgi были включены при сборке.
Дефолтный конфиг есть, и nginx может отображать "Привет мир" в html. :_)
Установим fcgiwrap spawn-fcgi:

$ emerge -av fcgiwrap spawn-fcgi

Конфигурируем spawn-fcgi для запуска fcgiwrap:

$ cp /etc/conf.d/spawn-fcgi /etc/conf.d/spawn-fcgi.fcgiwrap
$ nano /etc/conf.d/spawn-fcgi.fcgiwrap
$ cat /etc/conf.d/spawn-fcgi.fcgiwrap
FCGI_SOCKET=/var/run/fcgiwrap.sock
FCGI_ADDRESS=
FCGI_PORT=
FCGI_PROGRAM=/usr/sbin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
ALLOWED_ENV="PATH"
FCGI_CHILDREN=1
FCGI_CHROOT=
$ cd /etc/init.d/
$ ln -s spawn-fcgi spawn-fcgi.fcgiwrap

Запустим:

$ /etc/init.d/spawn-fcgi.fcgiwrap start

Создадим шаблон обработки Perl в Nginx:

$ nano /etc/nginx/perlcgi.tmpl
$ cat /etc/nginx/perlcgi.tmpl
# Все скрипты заканчивающиеся на pl и cgi
location ~ \.(pl|cgi)$ {
  # Не сжимаем скрипты
  gzip off;
  try_files $uri =404;
  # Передаем скрипты на обработку fcgiwrap
  fastcgi_pass unix:/var/run/fcgiwrap.sock-1;
  # Используем стандартные параметры
  include /etc/nginx/fastcgi_params;
  include /etc/nginx/fastcgi.conf;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_ignore_client_abort off;
}
# Замена апачевской ScriptAlias
location /cgi-bin/ {
  gzip off;
  try_files $uri =404;
  fastcgi_pass unix:/var/run/fcgiwrap.sock-1;
  include /etc/nginx/fastcgi_params;
  include /etc/nginx/fastcgi.conf;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_ignore_client_abort off;
}

Важный момент - сокет у нас /var/run/fcgiwrap.sock-1!

Теперь в любую конфигурацию сервера достаточно добавит строку:

include /etc/nginx/perlcgi.tmpl;

И у нас всё заработает.

Пример дефолтного конфига:

$ cat /etc/nginx/default
server {
  listen 80;
  root /var/www/;
  # Разрешаем листинг директорий
  autoindex on;
  # Подключаем шаблон Perl
  include /etc/nginx/perlcgi.tmpl;

}

Для проверки можно сделать тестовый файл:

$ cat /var/www/test.cgi
#!/usr/bin/perl -w
print "Content-type: text/html\n\n";
print "<html><head><title>Hello World!! </title></head>\n";
print "<body><h1>Hello world</h1></body></html>\n";
$ chmod +x /var/www/test.cgi

Идея с шаблоном с хабра тыц.
Небольшая правка с сокетами для реалий Gentoo...
:_)
Похожие материалы:
Аватар Nige1ist

Можно перенести обсуждение вопроса с LightSquid сюда? Там и опишу ряд вопросов, которые возникли.

Аватар zenon

Там это где? Пиши тут, если это касается fcgiwrap.
ы. Зарегистрироваться не пробовал? :)

Аватар Nige1ist

Я зарегистрирован. Авторизация через OpenID (Яндекс). Но пройти авторизацию не могу. Хотя раньше проблем не было. Да и на форуме писать удобнее.

Аватар Nigelist

Таки сбросил пароль, продублирую сообщение форума. В данный момент возникло несколько вопросов применительно настроек cgi на Debian (fcgiwrap и spawn-fcgi установлены).

  1. У меня нету файла: cp /etc/conf.d/spawn-fcgi
    И хотя содержимое файла приведено в статье, непонятно где этой файл храниться в Debian?
  2. В настройке указаны пользователь и группа nginx:
    ...
    FCGI_USER=nginx
    FCGI_GROUP=nginx
    ...

    Должен ли на Debian указан пользователь www-data?
  3. Та же сама ситуация с:
    ...
    $ cd /etc/init.d/
    $ ln -s spawn-fcgi spawn-fcgi.fcgiwrap
    ...

    В /etc/init.d нету файла spawn-fcgi, хотя может имеется в виду /etc/conf.d/spawn-fcgi?
  4. Нету файла /etc/nginx/fastcgi.conf, где брать не указано.
    ...
      include /etc/nginx/fastcgi_params;
      include /etc/nginx/fastcgi.conf;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    ...

Аватар zenon

Пути конфигов и имена пользователей для www в Debian и Gentoo конечно же разные, при установке всегда смотри на сообщения консоли, будет проще.
После:

# aptitude install fcgiwrap spawn-fcgi

установщик настоятельно рекомендует смотреть документацию: /usr/share/doc/fcgiwrap/README.Debian - там написаны необходимые изменения в конфигурации.
По поводу пользователя - в Debian принято для веб-сервисов использовать пользователя www-data
Вот тут ещё можно почитать - http://wiki.nginx.org/Fcgiwrap
Аватар Nigelist

Вопрос по поводу строчки:
echo "FCGI_CHILDREN=3" > /etc/default/fcgiwrap
Файл:
/etc/default/fcgiwrap
Лучше настроить как у вас в статье?

Аватар Nigelist

Кстати, с синтаксисом локации lightsquid не поможете? Мой вариант не работает:

location ~ *\.cgi$ {
        root /usr/lib/cgi-bin/lightsquid/;

        #Поддержка fast cgi
        include /etc/nginx/fcgiwrap.conf;

        gzip off; #gzip makes scripts feel slower since they have to complete before getting gzipped
        fastcgi_pass   localhost:9000;
        fastcgi_index  index.cgi;

        fastcgi_param  SCRIPT_FILENAME  $document_root/php/$fastcgi_script_name;
        fastcgi_param  QUERY_STRING     $query_string;
        fastcgi_param  REQUEST_METHOD   $request_method;
        fastcgi_param  CONTENT_TYPE     $content_type;
        fastcgi_param  CONTENT_LENGTH   $content_length;
}

Выдает ошибку:
[....] Restarting nginx: nginxnginx: [emerg] pcre_compile() failed: nothing to repeat in "*\.cgi$" at "*\.cgi$" in /etc/nginx/conf.d/localhost.conf:57
nginx: configuration file /etc/nginx/nginx.conf test failed
Аватар zenon

Сейчас deb нет под рукой. Но в любом случае откуда такой location?
Сокет/порт fastcgi_pass должен существовать.
После запуска обработчика (/etc/init.d/fcgiwrap restart) смотри где и что он слушает, сокет должен быть в /var/run

# ls -la /var/run/fcgi*
Аватар Nigelist

Вроде запустил. Создал сим-линк:
ln -s /var/www/localhost/lightsquid /usr/lib/cgi-bin/lightsquid/
В конфиг хоста добавил такую секцию:

        location ~ (\.cgi|\.pl) {
                gzip off; #gzip makes scripts feel slower since they have to complete before getting gzipped
                fastcgi_pass   unix:/var/run/fcgiwrap.socket;
                #fastcgi_pass  127.0.0.1:8999;
                fastcgi_index index.cgi;
                include "fastcgi_params";
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_script_name;
                expires 1m;
        }

        location /lightsquid {
                #alias /usr/lib/cgi-bin/lightsquid/;
                alias /var/www/localhost/lightsquid;
                index index.cgi;
        }

Делал по этой статье. Посмотрите, может надо что-то переделать?
Аватар zenon

Во, это другое дело, проверил пути, сокет итп...
Работает? Ну и отлично.

Аватар Nigelist

zenon написал:

Во, это другое дело, проверил пути, сокет итп...
Работает? Ну и отлично.

Да я не про то... :)
Я вот думаю, может что пропущено? Может где-то правильнее сделать по другому?
Аватар zenon

На мой взгляд всё правильно.
Можно было без ссылки наверное, но это мелочи.

Аватар zenon

Ограничить только локалкой видимость желательно, но это в случае если lightsqud установлен на сервере, у которого есть внешний IP.
Можно даже с редиректом на error_page

error_page  403  http://example.com/forbidden.html;
location / {
  deny    192.168.1.1;
  allow   192.168.1.0/24;
  allow   10.1.1.0/16;
  deny    all;
}

Отсюда.

Добавить комментарий