Установка и настройка NGINX + PHP (php-fpm) на Linux сервере


+3 +/-
Добрый день!

Я собираюсь отказаться от Apache и первый раз установить на сервере Nginx в связке с php-fpm. Пожалуйста опубликуйте подробную инструкцию.

И Ваше мнение - правда ли nginx + php-fpm работает намного быстрее чем Apache?
спросил 21 мая Дмитрий Седов в категории Сис. администрирование

1 Ответ

+1 голос
Лучший ответ

Добрый день!

Да, на мой взгляд, Nginx в несколько раз быстрее сервера Apache. Некоторые возразят - ведь Apache можно оптимизировать и он тоже станет быстрым. Это правда, но, не надо забывать, что и Nginx можно очень сильно разогнать. Подробно про оптимизацию я обязательно напишу отдельную статью.

Немного теории о Nginx + php-fpm

В веб-сервере Apache php является подключаемым модулем, такая связка работает медленно и потребляет много ресурсов. Из-за этой неудачной архитектуры, Apache обычно не может обработать более 200-300 запросов в секунду даже на очень мощном сервере. В Nginx же применена другая архитектура - сам веб-сервер Nginx обрабатывает только запросы на статику (картинки, css и прочее), а выполнение php отдает другому программному серверу - php-fpm. Php-fpm (FastCGI Process Manager) - это полностью самостоятельное программное обеспечение, его можно установить на одном сервере с Nginx (для небольших проектов), либо вынести на отдельный сервер. Большие проекты обычно обслуживают по несколько серверов с Nginx, php-fpm и базами данных. 

Заменяя сервер Apache на Nginx + php-fpm, вы сможете ускорить обработку запросов пользователей и сильно сэкономить на "железе". Веб проект с посещаемостью до 10000 уникальных посетителей в день вполне сможет жить на самом дешевом виртуальном сервере от DigitalOcean за 5$ в месяц. Кстати, если вы перейдете по этой ссылке - DigitalOcean, вы получите 10$ при регистрации, а это 2 месяца использования виртуального сервера. Никаких дополнительных условий при этом там нет.

Но перейдем к делу. Я буду описывать процесс установки и настройки на примере CentOS 6.x, но он не сильно будет отличаться и для других дистрибутивов Linux.

Установка Nginx: 

1. Установка репозитария Nginx: в стандартных дистрибутивах Linux по умолчанию нет дистрибутива Nginx, поэтому добавим его в систему.

vi /etc/yum.repos.d/nginx.repo

Далее нажмите i для перехода в режим редактирования редактора vi и вставьте:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

Далее нажмите ":wq" и Enter для сохранения и выхода. Все, теперь Nginx доступен для автоматической установки через менеджер пакетов yum. Если вы используете другой дистрибутив Linux - перейдите на эту страницу для получения инструкций именно для вашей системы.

2. Установка Nginx из репозитария: теперь просто выполните команду установки.

yum install nginx

Установка php-fpm:

Php-fpm доступен по всех современных дистрибутивах по умолчанию, поэтому просто выполните установку:

yum install php-fpm

При этом будут установлен сам сервер и все вспомогательные пакеты. Если что-то не получается, можно собрать php-fpm из исходников самостоятельно, для подробных инструкций перейдите сюда.

Настройка и запуск Nginx + php-fpm:

1. Начнем с php-fpm: откройте файл конфигурации

vi /etc/php-fpm.d/www.conf

и пропишите там работу через сокет (так будет работать быстрее):

listen = /var/run/php5-fpm.sock

измените существующую строчку "listen =" или добавьте новую и удалите старую.

2. Теперь перейдем к Nginx: создайте файл конфигурации для своего первого сайта (site1 замените на название сайта, хотя будет работать и так)

vi /etc/nginx/conf.d/site1.conf

Ниже приведена минимальная конфигурация, можете просто ее скопировать. Все что надо заменить, выделено красным. В данной конфигурации настроена отдача статических файлов и доступ к одному php-файлу - index.php. Все современные CMS запускаются одним файлом, поэтому такая конфигурация подойдет для большинства задач. Если вам надо запускать другие php-файлы, пропишите их отдельно. В данной конфигурации файлы сайта надо положить в папку /home/mysite/public_html/

server {
        listen [ip адрес сервера]:80;
        server_name voprosoff.net;
        resolver 8.8.8.8;
        error_log /var/log/nginx/voprosoff_net_error.log warn;
        root /home/voprosoff_net/public_html;
        access_log /var/log/nginx/voprosoff_net-access.log;
        charset utf-8;
        index index.php;
        location ~ .*(gif|jpg|jpeg|png|ico|swf|txt|pdf|doc|docx|exe|xls|xlsx|strings|zip|rar|7z)$ {
            expires 1y;
        }
        
        location ~ .*(html|htm|js|css)$ {
            expires 1y;
        }

        location ~ ^/index.php {
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_param SCRIPT_FILENAME /home/voprosoff_net/public_html/index.php;
                include /etc/nginx/fastcgi_params;
                fastcgi_param SCRIPT_NAME /index.php;
        }    

}    

Теперь положите файлы вашего первого сайта в папку /home/site1/public_html/ и мы готовы к запуску.

3. Запуск nginx + php-fpm:

service nginx start

service php-fpm start

Если вы все сделали правильно и нигде не ошиблись, результат будет такой:

Первый запуск nginx и php-fpm

Если у вас остались вопросы или нужны уточнения - пожалуйста, задайте вопрос или оставьте комментарий.

Я всегда рад помочь!

Удачи вам!

ответил 21 мая Эксперт Дмитрий (7,715 баллов)
выбран 14 августа Эксперт Михаил
502 Bad Gateway: Что означает и как исправить
Nginx или Apache: что выбрать для веб-сервера?
Спасибо за статью.
Но у меня вопрос: а mysql для этой связки не нужен?
Сайты, кроме html страничек используют для хранения данных БД, а тут ни слова о ней.
Добрый день!

Да, большинство веб-приложений используют базу данных MySQL, у нас есть статья как ее установить: https://voprosoff.net/1349/

Я не стал писать о MySQL в этой статье, так как это уже несколько другая задача.