0x000b Installing and configuring nginx + php for Yii. Установка и настройка nginx + php для Yii

nginx - легковесный веб-сервер, разрабатываемый Игорем Сысоевым. Кроме основных возможностей веб-сервера в нём присутствует ещё много полезных плюшек, таких как обратный прокси-сервер, почтовый прокси-сервер (IMAP, POP3, SMTP с поддержкой различных вариантов аутентификации). Но эта тема для отдельной статьи, нас больше интересует поддержка FastCGI в связке с PHP-CGI т.к. встроенной поддержки PHP в nginx'е нет.

В качестве ОС мы будем использовать дистрибутив Debian GNU/Linux, так как он довольно распространён и относительно прост в обслуживании.

 

Установка и настройка PHP

Установка PHP и поддержки FastCGI тривиальна:

$ sudo apt-get install php5 php5-cgi

Установка spawn-fcgi

В качестве FastCGI-демона будет использоваться скрипт spawn-fcgi из пакета lighttpd.

Установка так же проста:

$ sudo apt-get install lighttpd

Но так как будет использоваться nginx, необходимо убрать lighttpd из автозагрузки:

$ sudo service lighttpd stop
$ sudo update-rc.d -f lighttpd remove

Установка nginx и настройка FastCGI

Для начала необходимо добавить запуск FastCGI-демона в автозагрузку:

# ...
# Добавить в конец скрипта перед вызовом exit 0
/usr/bin/spawn-fcgi -f /usr/bin/php5-cgi -s /var/run/php-fcgi.sock -P /var/run/php-fcgi.pid -u www-data -g www-data

Теперь нужно отредактировать конфигурационный файл нашего хоста, дабы nginx передавал PHP-скрипты, куда следует. Возьмём хост по-умолчанию - его конфигурация находится в файле /etc/nginx/site-available/default:

server {
        listen 80;
        server_name localhost;
        access_log /var/log/nginx/default.access.log;

        location / {
                root    /var/www/default;
                index   index.html index.php;
        }

        location ~ \.php$ {
                fastcgi_pass    unix:/var/run/php-fcgi.sock;
                fastcgi_index   index.php;

                fastcgi_param   SCRIPT_FILENAME /var/www/default$fastcgi_script_name;
                include         fastcgi_params;
        }

}

Далее проверим работоспособность нашей конфигурации:

$ echo '<?php phpinfo(); ?>' > /var/www/default/info.php

Если в файле по адресу http://localhost/info.php отображается информация о PHP и в строчке Server API указано CGI/FastCGI, то настройка произведена успешно. Если же нет - внимательно проверьте настройки.

Настройка nginx для работы с yii

Изменим конфигурационный файл хоста, добавив несколько параметров и проверок:

server {

        listen          wh.cabz.su:80;
        server_name     wh.cabz.su;

        root            /var/www/wh/;
        charset         utf-8; # Устанавливаем кодировку UTF-8 по-умолчанию

        access_log      /var/log/nginx/yii.access.log;
        error_log       /var/log/nginx/yii.error.log warn;

        location / {
                index   index.html index.php;
                try_files $uri $uri/ /index.php?$args; # Проверка наличия файлов
        }

        location ~ \.php$ {
                try_files $uri =404; # Проверка наличия скрипта, иначе ошибка 404
                fastcgi_pass    unix:/var/run/php-fcgi.sock; # Адрес сокета, указанного при запуске spawn-fcgi
                fastcgi_index   index.php;

                include         fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME /var/www/wh$fastcgi_script_name;
                fastcgi_param   PATH_INFO $fastcgi_path_info;
        }

        # Убираем вывод в лог при запросе к favicon.ico и robots.txt
        location ~ /(favicon.ico|robots.txt) {
                allow all; # Доступ разрешён всем
                log_not_found off; # Отключение вывода в лог сообщения об отсутствии файла
                access_log off; # Отключение вывода в лог доступа
        }

        # Запрет доступа к скрытым файлам и директориям (например, .htaccess, .htpasswd, .git/)
        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }

        # Запрет доступа к закрытым директориям Yii
        location ~ /(protected|framework|themes/\w+/views) {
                deny all;
                access_log off;
                log_not_found off;
        }

        # Кеширование JavaScript, СSS и изображений
        # Уменьшает нагрузку на сервер
        # Использовать есть смысл только при готовом проекте
        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                try_files $uri =404;
                expires 24h;
                log_not_found off;
        }

}

Перезапускаем nginx и проверяем, что всё работает:

$ sudo service nginx reload

P.S. Как устанавливать и настраивать непосредственно Yii framework, подробно описано в документации фреймворка.