====== Настройка связки nginx + php-cgi ====== Берем nginx с официальной страницы [[http://sysoev.ru/nginx/download.html]] \\ В моем случае это была версия nginx-0.6.1. \\ Стандартная процедура сборки: \\ ''./configure --help'' - выбираем опции под себя. \\ В моем случае было только указание путей установки. \\ ''./configure --prefix=/opt/nginx'' - делаем Makefile. \\ ''make && make install'' - соберем. \\ Поскольку nginx не имеет самостоятельного модуля php, мы будем использовать fast_cgi. \\ Соответственно, нам понадибится php, собраный с поддержкой fast_cgi. \\ Исходники свободно распространяются. Берем их с с официального сайта - [[http://www.php.net/downloads.php|php.net]] Соберем с поддержкой необходимого нам fast-cgi. Здесь я привожу свою конфигурацию. Хочу отметить крайне желательное наличие опции --enable-force-cgi-redirect, которая предотвращает прямой вызов скриптов по адресу из браузера, а разрешает обработку только с перенаправления веб-сервером. Подробнее это описано в [[http://doc.mpv.ru/php/security.cgi-bin.force-redirect.html|документации]] к php. \\ ''./configure \ \\ --prefix=/opt/php-5.2.3 \ \\ --enable-fastcgi \ \\ --with-bz2 \ \\ --with-mysql \ \\ --enable-force-cgi-redirect \ \\ --with-gd=shared \ \\ --with-config-file-path=/opt/php-5.2.3/etc/ \ \\ --prefix=/opt/php-5.2.3/ \ \\ $@" '' \\ Теперь необходимо создать связку из nginx + php_cgi. Есть два способа. \\ **1.** Использование только лишь встроенного в php сервера fast-cgi через скрипт: \\ '' \\ #!/bin/bash \\ \\ ## ABSOLUTE path to the PHP binary \\ PHPFCGI="/opt/php-5.2.3/bin/php-cgi" \\ ## tcp-port to bind on \\ FCGIPORT="9000" \\ ## IP to bind on \\ FCGIADDR="127.0.0.1" \\ ## number of PHP children to spawn \\ PHP_FCGI_CHILDREN=2 \\ ## number of request before php-process will be restarted \\ PHP_FCGI_MAX_REQUESTS=1000 \\ # allowed environment variables sperated by spaces \\ ALLOWED_ENV="ORACLE_HOME PATH USER" \\ ## if this script is run as root switch to the following user \\ USERID=www-data \\ ################## no config below this line \\ if test x$PHP_FCGI_CHILDREN = x; then \\ PHP_FCGI_CHILDREN=2 \\ fi \\ ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN" \\ ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS" \\ ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS" \\ if test x$UID = x0; then \\ EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID" \\ else \\ EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT" \\ fi \\ echo $EX \\ # copy the allowed environment variables \\ E= \\ for i in $ALLOWED_ENV; do \\ E="$E $i=${!i}" \\ done \\ # clean environment and set up a new one \\ nohup env - $E sh -c "$EX" &> /dev/null & '' \\ **2.** Запуск через сторонний софт, например spawn-fcgi из [[http://www.lighttpd.net/download/|пакета lighttpd]]. По конфигурации стартового скрипта, этот метод очень похож на первый. Отличие лишь в том, что запуском php-cgi занимается отдельная программа. Также с использованием данного метода расширяется возможности конфигурирования среды php-cgi. Я использую второй метод. Привожу свою конфигурацию для typo3. Рекомендую ознакомится с описанием [[http://sysoev.ru/nginx/docs/|синтаксиса]] и параметров конфигурационного файла nginx. '' server { \\ access_log logs/access.log main; \\ error_log logs/error.log; \\ listen xxx.ru:6680; \\ server_name xxx.ru; \\ location ~ /\.ht { \\ deny all; \\ } \\ location / { \\ root /var/www; \\ index index.php; \\ if (!-e $request_filename) \\ { \\ rewrite ^(.*)$ /index.php last; \\ } \\ #Секция ниже - есть связующая часть nginx с php-cgi. \\ location ~ \.php$ { #обрабатываем .php \\ fastcgi_pass 127.0.0.1:9000; #адрес, где находится и на каком порту слушает php-cgi \\ fastcgi_index index.php; #файл-индекс \\ fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name; #где находятся скрипты \\ include conf/fastcgi_params; # файл с дополнительными параметрами для fcgi. \\ } \\ } '' '' \\ Файл **fastcgi_params:** \\ fastcgi_param QUERY_STRING $query_string; \\ fastcgi_param REQUEST_METHOD $request_method; \\ fastcgi_param CONTENT_TYPE $content_type; \\ fastcgi_param CONTENT_LENGTH $content_length; \\ \\ fastcgi_param SCRIPT_NAME $fastcgi_script_name; \\ fastcgi_param REQUEST_URI $request_uri; \\ fastcgi_param DOCUMENT_URI $document_uri; \\ fastcgi_param DOCUMENT_ROOT $document_root; \\ fastcgi_param SERVER_PROTOCOL $server_protocol; \\ \\ fastcgi_param GATEWAY_INTERFACE CGI/1.1; \\ fastcgi_param SERVER_SOFTWARE nginx; \\ \\ 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; \\ \\ # PHP only, required if PHP was built with --enable-force-cgi-redirect \\ fastcgi_param REDIRECT_STATUS 200; '' Теперь более подробно разберем взаимодействие typo3-модуля realurl([[http://typo3.org/documentation/document-library/extension-manuals/realurl/1.1.4/view/|настройка]] которого происходит обычным образом без каких либо изменений для адаптации под nginx) и [[http://sysoev.ru/nginx/docs/http/ngx_http_rewrite_module.html|rewrite_module]] nginx`а. \\ \\ '' if (!-e $request_filename) \\ { \\ rewrite ^(.*)$ /index.php last; \\ }'' \\ \\ Эта конструкция соответствует апачевской. \\ RewriteCond %{REQUEST_FILENAME} !-f \\ RewriteCond %{REQUEST_FILENAME} !-d \\ RewriteCond %{REQUEST_FILENAME} !-l Человеческим языком можно объяснить так: \\ если запрашиваемый URL не является не файлом\линком\директорией (!-e $request_filename) \\ меняем URL на указаный регулярным выражением ^(.*). \\ Т.е typo3/index.php?id=location, станет так необходимым нам typo3/location