Берем 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.
Исходники свободно распространяются. Берем их с с официального сайта - php.net
Соберем с поддержкой необходимого нам fast-cgi. Здесь я привожу свою конфигурацию. Хочу отметить крайне желательное наличие опции --enable-force-cgi-redirect, которая предотвращает прямой вызов скриптов по адресу из браузера, а разрешает обработку только с перенаправления веб-сервером. Подробнее это описано в документации к 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 из пакета lighttpd. По конфигурации стартового скрипта, этот метод очень похож на первый. Отличие лишь в том, что запуском php-cgi занимается отдельная программа. Также с использованием данного метода расширяется возможности конфигурирования среды php-cgi.
Я использую второй метод. Привожу свою конфигурацию для typo3. Рекомендую ознакомится с описанием синтаксиса и параметров конфигурационного файла 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(настройка которого происходит обычным образом без каких либо изменений для адаптации под nginx) и 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