Проблема с perl (внешним на сокете).

maxhl at hitline.net.ua maxhl at hitline.net.ua
Sat Jun 7 11:11:38 MSD 2008


В настоящий момент нет правильного перла для nginx такова как php и
приходится использовать
http://www.nginx.eu/nginx-fcgi/nginx-fcgi.txt
взятого с
http://www.nginx.eu/nginx-fcgi.html
он хорошо работает но для серьезной нагрузки негодится к сожелению.
Мы используем его для отрисовки самописной статы по серву, которая рисуется
http://www.fi.muni.cz/~kas/mrtg-rrd/
Возникла проблема толи nginx-fcgi толи самого nginx для вызова скрипта
используется url вида
http://192.168.0.1/stat/rrd/192/net/index.cgi/192.html где
http://192.168.0.1/stat/rrd/192/net/index.cgi имя скрипта,
а /192.html это параметры но nginx ищет
http://192.168.0.1/stat/rrd/192/net/index.cgi/192.html ненаходит его и
возвращает 404.

Пока сделал так
_________________________________________________________________________
                location ~ /index.cgi/ {
                        fastcgi_pass    unix:/var/run/nginx-fcgi.sock;
##                      fastcgi_index    index.cgi;
                        include  /usr/local/nginx/conf/fastcgi.conf;
                        fastcgi_param   SCRIPT_FILENAME
/home/htdocs$fastcgi_script_name;
                }
_________________________________________________________________________
где fastcgi.conf:
fastcgi_connect_timeout 30;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 32k;
fastcgi_buffers 4 32k;
fastcgi_busy_buffers_size 32k;
fastcgi_temp_file_write_size 32k;
fastcgi_intercept_errors on;
fastcgi_param   QUERY_STRING    $query_string;
fastcgi_param   CONTENT_TYPE    $content_type;
fastcgi_param   CONTENT_LENGTH  $content_length;
fastcgi_param   DOCUMENT_URI    $document_uri;
fastcgi_param   REQUEST_METHOD  $request_method;

fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR     $remote_addr;
fastcgi_param   REMOTE_PORT     $remote_port;
fastcgi_param   SERVER_ADDR     $server_addr;
fastcgi_param   SERVER_PORT     $server_port;
fastcgi_param   SERVER_NAME     $server_name;

fastcgi_param   SCRIPT_NAME     $fastcgi_script_name;
fastcgi_param   SERVER_PROTOCOL $server_protocol;
fastcgi_param   DOCUMENT_ROOT   $document_root;
fastcgi_param   REQUEST_URI     $request_uri;

# PHP only, required if PHP was built with --enable-force-cgi-redirect

_________________________________________________________________________
и внес фиксы в nginx-fcgi

   if ($req_params{SCRIPT_FILENAME}=~ /^(.*index.cgi).*/) {
$req_params{SCRIPT_FILENAME}=$1;}
и
  $ENV{PATH_INFO}="http://$req_params{SERVER_NAME}$req_params{REQUEST_URI}";
__________________________________________________________________________
Без этой переменной окружения модуль CGI неработает. Кроме того другие
нужные переменные могут отсутствовать.
Вот перечень того что передается:

CONTENT_LENGTH=""
CONTENT_TYPE=""
DOCUMENT_ROOT="/home/htdocs"
DOCUMENT_URI="/cgi-bin/index2.cgi"
FCGI_ROLE="RESPONDER"
GATEWAY_INTERFACE="CGI/1.1"
HTTP_ACCEPT="text/html, application/xml;q=0.9, application/xhtml+xml,
image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1"
HTTP_ACCEPT_CHARSET="iso-8859-1, utf-8, utf-16, *;q=0.1"
HTTP_ACCEPT_ENCODING="deflate, gzip, x-gzip, identity, *;q=0"
HTTP_ACCEPT_LANGUAGE="ru-RU,ru;q=0.9,en;q=0.8"
HTTP_CACHE_CONTROL="no-cache"
HTTP_CONNECTION="Keep-Alive, TE"
HTTP_HOST="192.168.0.1"
HTTP_TE="deflate, gzip, chunked, identity, trailers"
HTTP_USER_AGENT="Opera/9.25 (Windows NT 5.2; U; ru)"
PATH_INFO="http://max/cgi-bin/index2.cgi"
QUERY_STRING=""
REDIRECT_STATUS="200"
REMOTE_ADDR="192.168.0.1"
REMOTE_PORT="4714"
REQUEST_METHOD="GET"
REQUEST_URI="/cgi-bin/index2.cgi"
SCRIPT_FILENAME="/home/htdocs/cgi-bin/index2.cgi"
SCRIPT_NAME="/cgi-bin/index2.cgi"
SERVER_ADDR="192.168.106.128"
SERVER_NAME="max"
SERVER_PORT="80"
SERVER_PROTOCOL="HTTP/1.1"
SERVER_SOFTWARE="nginx/0.6.31"
_______________________________________________________________________________________________
В апаче такой проблемы не возникало и испотльзовать слеш вместо "?"
для передачи параметров скрипту невозбранялось.
Собственно вопрос как сделать это красивее и правильнее.

Еще у php и perl есть проблемка, если перейти по сыслке
http://192.168.0.1/stat/rrd/192/net без слеша на конце
то происходит редирект на первую запись в директиве server_name тоесть
поведение аналогичное включенной апачевской
UseCanonicalName, а если ссылка со слешем на конце то запускается скрипт
 http://192.168.0.1/stat/rrd/192/net/   index.php или index.pl
соответственно.
От этого помогло server_name_in_redirect off;

Так же хочется узнать с какими опциями оптимизации лучше собирать npinx и
php
пока испозьзую:
CC="gcc" \
OPTIM="-O3 -pipe  -fno-exceptions -funroll-loops -ffast-math  -funroll-loops
 -march=athlon64 -msse3" \
CFLAGS="-O2 -pipe" \
INCLUDES="-I/usr/local/include"
Система FreeBSD 7.0-RELEASE как х86 так и amd64 ...

Внимание - использовать перл как описано выше настоятельно нерекомендуется,
по причине запуска от пользователя root.
И быстродействие у него слобовато, при запуске теста начинает сыпать в лог
2008/06/04 20:20:07 [crit] 859#0: *129 connect() to
unix:/var/run/nginx-fcgi.sock failed (2: No such file or directory) while
connecting
to upstream, client: 192.168.106.128, server: max.mp.farlep.net, request:
"GET /stats/index.pl HTTP/1.1", upstream: "fastcgi://unix:/var/r
un/nginx-fcgi.sock:", host: "192.168.106.128"

С уважением Max.
maxhl at hitline.net.ua 71006063







More information about the nginx-ru mailing list