Статьи

Настройка PHP за Nginx с FastCGI

Традиционный способ запуска PHP — использование Apache HTTP Server с использованием mod_php. Фактически, mod_php был самым популярным модулем Apache вплоть до 2009 года, когда это требование перешло к mod_ssl. Но по мере роста Интернета и развития технологий, которые стали его основой, стали доступны другие способы обслуживания сайтов и приложений на PHP. nginx, сервер, созданный для решения проблемы C10k, поглощает долю рынка Apache , а использование PHP за nginx с FastCGI становится все более распространенной альтернативой.

Настройка PHP и nginx немного сложнее, чем традиционная Apache, хотя в недавнем прошлом она стала проще благодаря лучшей упаковке и настройкам по умолчанию. Эта статья проведет вас через процесс настройки PHP и nginx для обслуживания вашего собственного высокопроизводительного веб-сайта. Я предполагаю, что вы работаете на Ubuntu Server (я использую Ubuntu 13.04, 64-битная версия), и мы установим основные приложения, используя Apt.

FastCGI в двух словах

На заре веб-разработки разработчикам требовался способ запуска сценариев на сервере для генерации содержимого страницы и запуска других процессов, поэтому для облегчения этого был разработан протокол CGI (Common Gateway Interface).

CGI определяет среду (переменные среды, переменные, специфичные для запроса и т. Д.), В которой будет выполняться скрипт, и способ передачи данных между скриптом и веб-сервером. Для каждого запроса CGI устанавливает среду, порождает запущенный экземпляр сценария и передает ему все входящие данные, а также собирает и отправляет выходные данные сценария на сервер.

Nginx-FCGI-1a

Конечно, у CGI есть свои плюсы и минусы. С другой стороны, CGI не зависит от языка, то есть сценарии могут быть написаны на любом языке программирования, который удобен для разработчика (например, Perl, C, bash и т. Д.), И каждое выполнение выполняется изолированно от веб-сервера, который Предотвращает ошибки в сценарии от возможного сбоя всего веб-стека. С другой стороны, для каждого запроса создается новый процесс, который может потреблять много ресурсов процессора и занимать много времени.

FastCGI по сути является CGI с некоторыми улучшениями, которые устраняют недостатки CGI. Это сокращает время / нагрузку на ЦП благодаря использованию постоянного процесса для выполнения сценариев, а данные между веб-сервером и FastCGI передаются с использованием сокетов, что способствует более масштабируемой архитектуре служб (фермы серверов и балансировка нагрузки, асинхронная связь между веб-сервером и FastCGI, и т.д.).

Для получения дополнительной информации о FastCGI ознакомьтесь с техническим документом на веб-сайте FastCGI, а для реализации PHP, в частности, ознакомьтесь с руководством по PHP .

Базовая установка и настройка

Чтобы установить PHP через Apt, выполните в командной строке следующее:

  sudo apt-get установить php5-cli php5-fpm 

Затем, чтобы установить nginx, выполните:

  sudo apt-get установить nginx 

Apt определит необходимые зависимости в каждом случае и запросит подтверждение для продолжения. После получения Apt загрузит и установит запрошенные пакеты и их зависимости.

Ubuntu помещает файлы конфигурации nginx в /etc/nginx Фрагменты общей конфигурации хранятся в этом корне, а конкретные настройки сервера находятся на sites-availablesites-enabled

Рекомендуется избегать редактирования исходных файлов конфигурации, поэтому я предлагаю использовать копии и сохранять оригиналы в чистоте. Таким образом, вы можете настроить nginx по своему вкусу и не беспокоиться о том, что ваши усилия будут переписаны Apt во время будущих обновлений. У вас также есть исходная конфигурация по умолчанию, к которой можно вернуться, если вам это никогда не понадобится.

Удалите символьную ссылку в sites-enableddefaultsites-available

  cd / etc / nginx
 sudo rm sites-enabled / default
 sudo cp sites-available / default-sites-available / my-default
 sudo ln -s / etc / nginx / sites-available / my-default sites-enabled / default 

Чтобы получить запросы PHP прокси-сервера nginx к службе FastCGI, откройте только что скопированный файл конфигурации и найдите раздел, который начинается с:

  # передать PHP-скрипты серверу FastCGI, прослушивающему 127.0.0.1:9000
 #
 #location ~ \ .php $ { 

Раскомментируйте строку locationfastcgi_split_path_info Когда вы закончите, раздел должен выглядеть следующим образом:

  # передать PHP-скрипты серверу FastCGI, прослушивающему 127.0.0.1:9000
 #
 location ~ \ .php $ {
     fastcgi_split_path_info ^ (. + \. php) (/.+) $;
 # # ПРИМЕЧАНИЕ: у вас должно быть "cgi.fix_pathinfo = 0;"  в php.ini
 #
 # # Только с php5-cgi:
 # fastcgi_pass 127.0.0.1:9000;
 # # С php5-fpm:
     fastcgi_pass unix: /var/run/php5-fpm.sock;
     fastcgi_index index.php;
     включить fastcgi_params;
 } 

Сохраните изменения и запустите nginx.

  sudo service nginx start 

Подключитесь к серверу через браузер, и вы увидите экран приветствия nginx.

Nginx-FCGI-2

Конфигурация по умолчанию указывает /usr/share/nginx/html В этом каталоге создайте файл с именем info.phpphpinfo() В выходных данных вы должны увидеть серверный API в списке «FPM / FastCGI».

Nginx-FCGI-3

Дополнительная конфигурация

Поздравляем! У вас есть базовая установка и обслуживание nginx и PHP! Но есть несколько дополнительных шагов настройки, которые я рекомендую.

Web Root Permissions

Быстрая проверка разрешений веб-root показывает, что он не доступен для записи кому-либо, кроме root. Постоянное sudo

  sudo adduser <имя пользователя> www-data
 sudo chgrp -R www-data / usr / share / nginx / html
 sudo chmod -R g + rw / usr / share / nginx / html
 sudo chmod g + s / usr / share / nginx / html 

adduser<username>www-data chgrphtmlwww-data

Затем первая команда chmodhtmlhtmlwww-data Обратите внимание, что второй chmod

После того, как четыре команды были выполнены, вам нужно будет перезагрузить вашу оболочку, чтобы групповые ассоциации в вашей учетной записи вступили в силу. Выйдите, а затем снова войдите. После того, как вы войдете в систему, вы сможете создавать, редактировать и удалять файлы в корневом веб-каталоге в соответствии с вашими предпочтениями, используя стандартный вход в систему, без каких-либо расширенных привилегий.

Несуществующие сценарии

Я также рекомендую добавить директиву try_fileslocation

  location ~ \ .php $ {
     fastcgi_split_path_info ^ (. + \. php) (/.+) $;
     try_files $ uri $ uri / = 404;
 ... 

Это защищает вас от известной уязвимости, которая возникает из-за неправильно настроенной системы, в которой nginx использует различные шаблоны для удовлетворения запроса. Возможно, вы захотите настроить точный список значений после прочтения документации для try_files и принять во внимание потребности вашего приложения, но вышеприведенное должно обеспечить минимальный уровень защиты.

Портирование файлов .htaccess

В какой-то момент вы захотите обслуживать существующее приложение PHP, которое ранее обслуживалось Apache, и, скорее всего, оно будет иметь некоторые подробности конфигурации для сервера либо в файле .htaccess Есть пара онлайн- конвертеров, которые «переводят» директивы Apache в nginx, и это хорошая отправная точка при переносе вашей конфигурации. Но будьте осторожны, чтобы не полагаться на них полностью. Как говорится , «Вставка кода из Интернета в производство — это как жвачка, найденная на улице». Ознакомьтесь с документацией nginx и перепроверьте выходные данные конвертера, чтобы убедиться, что все в порядке.

Вывод

Традиционный способ запуска PHP (Apache и mod_php) стабилен и зрел, и для большинства приложений является отличной платформой. Но ситуация меняется, и более производительные решения, такие как nginx, получают широкое признание, даже поглощая долю рынка Apache. В этой статье вы увидели, как настроить PHP для запуска за nginx с FastCGI. И с вашими новыми блестящими инсталляциями, готовыми к тому, чтобы создать свой собственный высокопроизводительный веб-сайт в массы, я желаю вам успеха!