Хостинги/Домены | Веб-сервер на основе Nginx и PHP-FPM
Настройка
Настройка состоит из двух этапов — настройки «Nginx» и «PHP-FPM». Для начала необходимо остановить процессы (демоны) «Nginx» и «PHP-FPM», например, командами
Настройка состоит из двух этапов — настройки «Nginx» и «PHP-FPM». Для начала необходимо остановить процессы (демоны) «Nginx» и «PHP-FPM», например, командами
sudo service nginx stop
sudo service php5-fpm stop
Настройка PHP-FPM
Прежде всего, следует открыть файл «/etc/php5/fpm/php.ini» для редактирования, например, командой
после чего, найти строчку содержащую «cgi.fix_pathinfo», которая по-умолчанию выглядит так (закомментирована)
и привести её к виду
И сохранить изменения. Это призвано устранить опасность неправильно трактования (и возникающей уязвимости) запросов вида «/image.gif/foo.php»
Прежде всего, следует открыть файл «/etc/php5/fpm/php.ini» для редактирования, например, командой
sudo gedit /etc/php5/fpm/php.ini после чего, найти строчку содержащую «cgi.fix_pathinfo», которая по-умолчанию выглядит так (закомментирована)
;cgi.fix_pathinfo = 1 и привести её к виду
cgi.fix_pathinfo = 0 И сохранить изменения. Это призвано устранить опасность неправильно трактования (и возникающей уязвимости) запросов вида «/image.gif/foo.php»
Далее, необходимо отрыть для редактирования файл «/etc/php5/fpm/pool.d/www.conf», например, командой
найти строчку с параметров «security.limit_extensions» и привести её к виду
Эта настройка ограничит выполнение файлов по расширению имени. В этом же файле найти строчку с параметром «listen» и привести её к виду
Это определит файл для связи «Nginx» с «PHP-FPM» (сокет). В целях безопасности запрещаем какой-попало программе писать в сокет
sudo gedit /etc/php5/fpm/pool.d/www.conf найти строчку с параметров «security.limit_extensions» и привести её к виду
security.limit_extensions = .php .php3 .php4 .php5 Эта настройка ограничит выполнение файлов по расширению имени. В этом же файле найти строчку с параметром «listen» и привести её к виду
listen = /var/run/php5-fpm.sock Это определит файл для связи «Nginx» с «PHP-FPM» (сокет). В целях безопасности запрещаем какой-попало программе писать в сокет
параметров «listen.owner», «listen.group» и «listen.mode» (по-умолчанию они закомментированы) и приводим их к виду
Следует сохранить изменения в файле и перезапустить «PHP-FPM», например, командой
Можно убедится в том, что права доступа к сокету установлены верно:
Права доступа должны быть «srw-rw—-», владелец «www-data» (группа «www-data»), например,
listen.owner = www-data
listen.group = www-data
listen.mode = 0660 Следует сохранить изменения в файле и перезапустить «PHP-FPM», например, командой
sudo service php5-fpm restart Можно убедится в том, что права доступа к сокету установлены верно:
ls -la /var/run/php5-fpm.sock Права доступа должны быть «srw-rw—-», владелец «www-data» (группа «www-data»), например,
srw-rw---- 1 www-data www-data 0 May 2 16:36 /var/run/php5-fpm.sock
Настройка Nginx
Основные настройки «Nginx» хранятся в файле «/etc/nginx/nginx.conf». Настройки базового сайта хранятся в файле «/etc/nginx/sites-available/default». Базовый конфигурационный файл сайта принято помещать в папку «/etc/nginx/sites-available/» и затем включить его путём добавления символической ссылки на этот файл в папке «/etc/nginx/sites-enabled/». Например, создадим конфигурационный файл для сайта с доменным именем (для примера выбрано «example.com») в названии для удобства
и откроем его для редактирования
При редактировании данного файла необходимо учитывать синтаксис конфигурации «Nginx»
Основные настройки «Nginx» хранятся в файле «/etc/nginx/nginx.conf». Настройки базового сайта хранятся в файле «/etc/nginx/sites-available/default». Базовый конфигурационный файл сайта принято помещать в папку «/etc/nginx/sites-available/» и затем включить его путём добавления символической ссылки на этот файл в папке «/etc/nginx/sites-enabled/». Например, создадим конфигурационный файл для сайта с доменным именем (для примера выбрано «example.com») в названии для удобства
sudo touch/etc/nginx/sites-available/example.com
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ и откроем его для редактирования
sudo gedit /etc/nginx/sites-available/example.com При редактировании данного файла необходимо учитывать синтаксис конфигурации «Nginx»
Описывать конфигурацию сайта в одном файле не очень удобно, для увеличения читабельности конфигурационного файла и гибкости настройки можно воспользоваться директивой «include» позволяющей указать «Nginx», что следует загрузить другой конфигурационный файл и затем продолжить чтение текущего. Создадим в папке «/etc/nginx/» каталог «common», где будут хранится общие настройки для сайта, которые затем будут подгружаться из основного конфигурационного файла «/etc/nginx/sites-available/example.com» с помощью директивы «include»
Некоторые запросы «Nginx» будет перенаправлять к «PHP-FPM», который в данном случае называется сервером выгрузки данных (upstream). Укажем как следует это делать. Создадим файл конфигурации с описанием серверов выгрузки данных
и откроем его для редактирования
и добавим в него строчки
где «php-fpm» – название для сервера выгрузки данных, для удобства.
Редактируем файл «/etc/nginx/sites-available/example.com». Добавляем строчку
для загрузки созданого выше конфигурационного файла. Как можно видеть – допускается указание относительного пути к файлу.
Далее описываем перенаправление от HTTP к HTTPS, если, конечно, это планируется. В таком случае необходимо наличие сертификатов для HTTPS
sudo mkdir /etc/nginx/common Некоторые запросы «Nginx» будет перенаправлять к «PHP-FPM», который в данном случае называется сервером выгрузки данных (upstream). Укажем как следует это делать. Создадим файл конфигурации с описанием серверов выгрузки данных
sudo touch /etc/nginx/common/upstream и откроем его для редактирования
sudo gedit /etc/nginx/common/upstream и добавим в него строчки
upstream php-fpm
{
# PHP5-FPM сервер
server unix:/var/run/php5-fpm.sock;
} где «php-fpm» – название для сервера выгрузки данных, для удобства.
Редактируем файл «/etc/nginx/sites-available/example.com». Добавляем строчку
include common/upstream; для загрузки созданого выше конфигурационного файла. Как можно видеть – допускается указание относительного пути к файлу.
Далее описываем перенаправление от HTTP к HTTPS, если, конечно, это планируется. В таком случае необходимо наличие сертификатов для HTTPS
server
{
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
} иначе, можно опустить эти строчки.
Начинаем описывать конфигурацию сайта
server
{ Сетевой порт для приема соединений: 80 — обычный HTTP; 443 — HTTPS (см. выше)
# Порты
listen80;
listen443ssl;# использовать шифрование для этого порта Корневая директория сайта работающего на данном сервере
root/var/www; Возможные имена индексных файлов (их «Nginx» пытается открыть если он получил запрос вида «example.com/», вместо явного «example.com/index.html»)
indexindex.php index.html index.htm; Имя сервера – обычно доменное имя Вашего сервера
server_nameh2m.name www.h2m.name; Настройка шифрования SSL (если оно требуется, см. выше). Необходимо наличие сертификата «*.crt» или «*.pem» и приватного секретного ключа «*.key»
Самоподписанный сертификат можно сгенерировать командой в терминале
При этом программа запросит данные, среди них «commmon name» — следует указать доменное имя сервера. Можно использовать шаблон, если необходимо учесть домены нижнего уровня, например, «*example.com». Иначе могут возникнуть проблемы с некоторыми программами, например, «davfs2»
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt При этом программа запросит данные, среди них «commmon name» — следует указать доменное имя сервера. Можно использовать шаблон, если необходимо учесть домены нижнего уровня, например, «*example.com». Иначе могут возникнуть проблемы с некоторыми программами, например, «davfs2»
Решил набить посты копипастом с гугла? :D
Устаревший способ включения «HTTPS», сейчас не используется, просто для примера
Для удобства описываем настройки шифрования во внешнем файле «/etc/nginx/common/ssl»
Редактируем файл «/etc/nginx/common/ssl»
Файлы сертификатов для «HTTPS»
Дополнительные параметры требуемые для «HTTPS»
На этом настройки «SSL» в «Nginx» завершены, сохраняем и закрываем файл.
Продолжаем редактировать файл «/etc/nginx/sites-available/example.com». Подгружаем созданный выше конфигурационный файл с описанием настроек SSL
Различные настройки. Указание максимального размера запроса – необходимо если сервер будет использоваться для загрузки больших файлов (например, для построения небольшого облачного хранилища)
Далее указание директорий сайта и правил работы с ними с использованием директив «location». Данная директива может обрабатывать регулярные выражения «Perl»
ssl on;# шифрование включено Для удобства описываем настройки шифрования во внешнем файле «/etc/nginx/common/ssl»
sudo touch /etc/nginx/common/ssl Редактируем файл «/etc/nginx/common/ssl»
sudo gedit /etc/nginx/common/ssl Файлы сертификатов для «HTTPS»
ssl_certificate /etc/ssl/certs/example.com_nginx.crt;# сертификат (можно свободно распространять)
ssl_certificate_key /etc/ssl/private/example.com_nginx.key;# приватный ключ (секретный файл - НИКОМУ НЕ ПОКАЗЫВАТЬ) Дополнительные параметры требуемые для «HTTPS»
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;# указание протоколов шифрования (не использовать SSLv3, уязвимо)
ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
ssl_prefer_server_ciphers on; На этом настройки «SSL» в «Nginx» завершены, сохраняем и закрываем файл.
Продолжаем редактировать файл «/etc/nginx/sites-available/example.com». Подгружаем созданный выше конфигурационный файл с описанием настроек SSL
# Настройка шифрования SSL
include common/ssl; Различные настройки. Указание максимального размера запроса – необходимо если сервер будет использоваться для загрузки больших файлов (например, для построения небольшого облачного хранилища)
client_max_body_size1000m;# увеличение максимального объема файла для загрузки до 1ГБ Далее указание директорий сайта и правил работы с ними с использованием директив «location». Данная директива может обрабатывать регулярные выражения «Perl»