fcgiwrap и simplecgi.pl - работает :)
Petruha 12.03.2013 10:47
/ 12.03.2013 11:33
3 дня и 3 ночи бился головой о стену :)
Пока не вырезал кусок из кода fcgiwrap работал криво.
До сих пор не могу понять, как это может происходить.
Там же есть строка: иф скрипт_нэйм ... ретурн :)
Как он дальше исполняется мне непонятно.
Пробовал и из репозитория ставить и компилять свежий - всегда переписывает переменные окружения (система Debian 6.0.7 x64).
Если посмотреть на код, то он лишний и вредный для Парсера :)
static char *get_cgi_filename(void) /* and fixup environment */
{
...
if ((p = getenv("DOCUMENT_ROOT"))) {
docroot = p;
docrootlen = strlen(p);
buflen += docrootlen;
} else {
goto err;
}
if ((p = getenv("SCRIPT_NAME"))) {
buflen += strlen(p);
scriptname = p;
} else {
goto err;
}
buf = malloc(buflen);
if (!buf) goto err;
strcpy(buf, docroot);
strcpy(buf + docrootlen, scriptname);
pathinfo = strdup(buf);
if (!pathinfo) {
goto err;
}
while(1) {
switch(check_file_perms(buf)) {
case -EACCES:
goto err;
case 0:
rf_len = strlen(buf);
if (rf_len < buflen - 1) {
setenv("PATH_INFO", pathinfo + rf_len, 1);
setenv("SCRIPT_NAME", buf + docrootlen, 1);
} else {
unsetenv("PATH_INFO");
}
free(pathinfo);
return buf;
default:
p = strrchr(buf, '/');
if (!p) goto err;
*p = 0;
}
}
...
}
Конфиги под ЧПУшки!!!ДЛЯ FCGIWRAP:server{
listen 80;
server_name parser.test;
access_log /var/log/nginx/parser.test.log;
try_files $uri $uri/ /index.html?req=$query_string;
location ~ \.html$ {
root /var/www/test/html;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
fastcgi_param SCRIPT_NAME /index.html;
fastcgi_param SCRIPT_FILENAME /var/www/test/cgi/parser3.cgi;
fastcgi_param PATH_INFO /index.html;
fastcgi_param PATH_TRANSLATED $document_root$uri;
fastcgi_param DOCUMENT_ROOT /var/www/test/html;
include fastcgi_params;
}
location ~ \.(p|cfg|dir|pag|cgi|php|sh)$ {
deny all;
}
ДЛЯ SIMPLECGI:server{
listen 80;
server_name parser.test;
access_log /var/log/nginx/parser.test.log;
try_files $uri $uri/ /index.html?req=$query_string;
location ~ \.html$ {
root /var/www/test/html;
fastcgi_pass unix:/var/run/nginx/cgiwrap-dispatch.sock;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME /var/www/test/cgi/parser3.cgi;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param PATH_TRANSLATED /var/www/test/html$fastcgi_script_name;
include fastcgi_params;
}
location ~ \.(p|cfg|dir|pag|cgi|php|sh)$ {
deny all;
}
}
Fcgiwrap в разы быстрее, чем simplecgi скрипт (просто в каком-то блоге человек высказывал сомнения).
Для Парсера важны PATH_TRANSLATED (что будет обрабатывать Парсер) и SCRIPT_FILENAME (где Парсер лежит).