# $Id: fast-cgi-server.txt,v 1.3 2006/09/05 13:28:48 aost Exp $ # # Исходная задача - проверить гипотезу о том, что время выполнения php скриптов в связке http серверов nginx <-> some_backend меньше в случае применения fast-cgi вместо традиционного сервера apache. Установлено из портов: nginx-0.3.49 Robust and small WWW server php4-4.4.2_2 PHP Scripting Language (Apache Module and CLI) lighttpd-1.4.11_1 со всеми сброшенными опциями. В идущем в комплекте с дистрибутивом lighttpd скрипте spawn-php.sh заменяем имя запускаемого приложения: php на php-cgi # Scripts/spawn-php.sh spawn-fcgi.c.190: child spawned successfully: PID: 92751 После этого появляются процессы # ps ax|grep php 92751 ?? Is 0:00,04 /usr/local/bin/php-cgi 92753 ?? I 0:00,00 /usr/local/bin/php-cgi 92754 ?? I 0:00,00 /usr/local/bin/php-cgi Если скрипт не курочить - работает только по tcp, при этом, на начальном этапе, этот искусственный интеллект в течение минуты что-то делает сам в себе и на внешние вопросы не отвечает. Если поправить в скрипте строку запуска с указанием сокета вместо адрес:порт, то сервер готов обслуживать запросы сразу после запуска. === FCGISOCKET="/tmp/php-fcgi.sock" EX="$SPAWNFCGI -P /var/run/fcgi.pid -s $FCGISOCKET -f $FCGIPROGRAM -u $USERID -g $GROUPID -C $PHP_FCGI_CHILDREN" === Полный список изменений находится в файле: spawn-php.diff В результате имеем: -rw-r--r-- 1 root wheel 5 20 июн 16:11 /var/run/fcgi.pid srwxr-xr-x 1 www wheel 0 20 июн 16:11 /tmp/php-fcgi.sock $ ps aux|grep php www 28895 0,0 0,5 4704 2456 ?? Is 16:11 0:00,04 /usr/local/bin/php-cgi www 28896 0,0 0,5 4784 2588 ?? I 16:11 0:00,01 /usr/local/bin/php-cgi www 28897 0,0 0,5 4764 2572 ?? I 16:11 0:00,01 /usr/local/bin/php-cgi www 28898 0,0 0,5 4784 2580 ?? I 16:11 0:00,01 /usr/local/bin/php-cgi Есть подозрение, что запуская такой скрипт от разных пользователей - можно добиться весьма интересных эффектов. Для проверки работоспособности создаем файлик вида: === /path/to/file/test.txt === "; print_r($GLOBALS); echo ""; ?> ===================== В файл конфигурации nginx.conf добавляем такую секцию (взято с nginx.info): /path/to/file - аналог апачевского document_root. Часть опций пришлось убрать, т.к. не проходила проверка синтаксиса (nginx -t) location ~* ^/.+\.php { set $srv_root /path/to/file; root $srv_root; #fastcgi_pass 127.0.0.1:1026; fastcgi_pass unix:/tmp/php-fcgi.sock; # сокет fastcgi_index index.php; fastcgi_connect_timeout 60; fastcgi_send_timeout 180; fastcgi_read_timeout 180; fastcgi_buffers 4 32k; fastcgi_busy_buffers_size 32k; fastcgi_temp_file_write_size 32k; #fastcgi_temp_path /var/tmp; #fastcgi_next_upstream error timeout invalid_header http_500 http_404; #fastcgi_next_upstream error timeout; fastcgi_redirect_errors on; # для отображения своих страниц об ошибках fastcgi_param DOCUMENT_ROOT $srv_root; fastcgi_param SCRIPT_FILENAME $srv_root$fastcgi_script_name; fastcgi_param PATH_TRANSLATED $srv_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param QUERY_STRING $query_string; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param REDIRECT_STATUS 200; # если php собрано с опцией --enable-force-cgi-redirect # производится дополнительный системный вызов, без нужды лучше не использовать, # так как операциz ресурсоемкая. fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param SERVER_SOFTWARE "nginx/0.3.49"; fastcgi_param GATEWAY_INTERFACE "CGI/1.1"; fastcgi_param SERVER_NAME $server_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param REMOTE_USER $remote_user; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; }