ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



В настоящий момент нет правильного перла для 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@xxxxxxxxxxxxxx 71006063






 




Copyright © Lexa Software, 1996-2009.