Проблема с 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