Установка и настройка Nginx и PHP5 на CentOS 6.5
О чём эта инструкция
Здесь описаны команды и конфигурация для быстрого развёртывания Nginx и PHP5 (через PHP-FPM) на CentOS 6.5. Предполагается, что у вас есть root-доступ. Все пути и параметры даны в виде, совместимом с CentOS 6.5 и типичными сборками Nginx/PHP-FPM того времени.
Важно: PHP-FPM — это менеджер процессов FastCGI. Он запускает PHP-воркеры и принимает запросы от веб-сервера по TCP (по умолчанию 127.0.0.1:9000) или по Unix-сокету.
Содержание
- Установка Nginx
- Установка PHP5 и PHP-FPM
- Настройка nginx для работы с PHP-FPM
- Перевод PHP-FPM на Unix-сокет
- Проверки и тесты
- Безопасность и отладка
- Чеклист и критерии приёмки
- Альтернативы и когда это не подходит
1 Установка Nginx
Nginx доступен в пакете для CentOS 6.5 (через репозиторий EPEL). Установите его так:
yum install nginxЗатем создайте автозапуск и запустите сервис:
chkconfig --levels 235 nginx on
service nginx startЕсли при старте вы получите ошибку вроде “Address already in use” для порта 80, сообщение будет похоже на следующее:
[root@server1 ~]# service nginx start
Starting nginx: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
[FAILED]
[root@server1 ~]# Это означает, что на системе уже запущен другой веб-сервер (обычно Apache/httpd). Остановите и удалите его, чтобы Nginx мог слушать порт 80:
apachectl stop
yum remove httpd
chkconfig --level 235 httpd offПосле этого снова включите и запустите Nginx:
chkconfig --levels 235 nginx on
service nginx startВ браузере посетите IP-адрес или hostname вашего сервера (например, http://192.168.0.100). Вы должны увидеть приветственную страницу Nginx:

2 Установка PHP5
Чтобы Nginx мог обрабатывать PHP, используйте PHP-FPM (FastCGI Process Manager). Установите php-fpm, php-cli и необходимые модули (например, php-mysql) командой:
yum install php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidyРекомендуется также установить кэшер опкодов (например, APC или другой) для ускорения выполнения PHP-кода. Для установки APC:
yum install php-pecl-apcОткройте файл /etc/php.ini и установите параметр cgi.fix_pathinfo=0. Это важно для безопасности обработки путей.
vi /etc/php.ini| [...] ; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's ; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok ; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting ; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting ; of zero causes PHP to behave as before. Default is 1. You should fix your scripts ; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. ; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo cgi.fix_pathinfo=0 [...] |
(Прочитайте http://wiki.nginx.org/Pitfalls, чтобы понять причину).
Чтобы избежать предупреждений о временной зоне в логах PHP, установите date.timezone в /etc/php.ini (например, “Europe/Berlin” или вашу зону):
| [...] [Date] ; Defines the default timezone used by the date functions ; http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone date.timezone = "Europe/Berlin" [...] |
Узнать текущую зону, настроенную в системе, можно так:
cat /etc/sysconfig/clock
[root@server1 nginx]# cat /etc/sysconfig/clock
ZONE="Europe/Berlin"
[root@server1 nginx]#Создайте автозапуск для php-fpm и запустите сервис:
chkconfig --levels 235 php-fpm on
service php-fpm startPHP-FPM по умолчанию запускает FastCGI-сервер на 127.0.0.1:9000.
3 Настройка nginx для PHP
Основная конфигурация nginx находится в /etc/nginx/nginx.conf. Откройте её:
vi /etc/nginx/nginx.confМожно увеличить число рабочих процессов и снизить keepalive_timeout для повышения производительности:
| [...] worker_processes 4; [...] keepalive_timeout 2; [...] |
Виртуальные хосты определяются контейнерами server {} в каталоге /etc/nginx/conf.d. Изменим дефолтный vhost (/etc/nginx/conf.d/default.conf):
vi /etc/nginx/conf.d/default.conf| [...] server { listen 80; server_name _; #charset koi8-r; #access_log logs/host.access.log main; location / { root /usr/share/nginx/html; index index.php index.html index.htm; } error_page 404 /404.html; location = /404.html { root /usr/share/nginx/html; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { root /usr/share/nginx/html; try_files $uri =404; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } } |
Пояснения и важные моменты:
- servername ; делает виртуальный хост «по умолчанию». Можно указать конкретный домен.
- index включает index.php, чтобы Nginx отдавал индексные PHP-страницы.
- try_files $uri =404; защищает от передачи непроверенных запросов в PHP и уменьшает риск RFI/LFI.
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; — критично для корректного поиска файлов PHP интерпретатором.
Перезагрузите конфигурацию nginx:
service nginx reloadСоздайте тестовый PHP-файл в корне документа (/usr/share/nginx/html):
vi /usr/share/nginx/html/info.php| |
Откройте в браузере http://192.168.0.100/info.php (замените на IP/домен сервера). Вы увидите страницу phpinfo, подтверждающую работу PHP через FPM:

Если прокрутить вниз, вы увидите список загруженных модулей (включая модуль MySQL):

4 Перевод PHP-FPM на Unix-сокет
По умолчанию PHP-FPM слушает 127.0.0.1:9000. Для снижения накладных расходов TCP можно использовать Unix-сокет.
Откройте конфигурацию пула www:
vi /etc/php-fpm.d/www.conf…и измените строку listen на Unix-сокет:
| [...] ;listen = 127.0.0.1:9000 listen = /tmp/php5-fpm.sock [...] |
Перезагрузите PHP-FPM:
service php-fpm reloadЗатем в конфигурациях nginx (в каждом vhost с PHP) замените fastcgi_pass 127.0.0.1:9000; на:
fastcgi_pass unix:/tmp/php5-fpm.sock;Например, в /etc/nginx/conf.d/default.conf:
vi /etc/nginx/conf.d/default.conf| [...] location ~ \.php$ { root /usr/share/nginx/html; try_files $uri =404; fastcgi_pass unix:/tmp/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } [...] |
Перезагрузите nginx:
service nginx reload5 Проверки и тесты
- Откройте /info.php — должна отображаться phpinfo.
- Проверьте логи: /var/log/nginx/error.log и /var/log/php-fpm/www-error.log.
- Убедитесь, что файлы имеют корректные разрешения и владелец веб-каталога (обычно root или пользователь, под которым работает Nginx).
- Если используется сокет, проверьте его права и владельца (socket должен быть доступен nginx).
6 Безопасность и отладка
Important: cgi.fix_pathinfo=0 и try_files — обязательны для предотвращения передачи неподтверждённых путей в интерпретатор PHP.
Рекомендации по безопасности:
- Используйте минимальный набор установленных PHP-модулей.
- Отключите display_errors в production и ведите лог ошибок в файл.
- Проверьте права на Unix-сокет: php-fpm может создать сокет с владельцем root; настройте user/group в /etc/php-fpm.d/www.conf под пользователя nginx (обычно nobody или www-data), либо настройте доступ через правильные права.
- Рассмотрите включение и настройку SELinux: при включённом SELinux доступ к сокету/файлам может блокироваться — проверьте audit.log и установите правильные контексты.
- Ограничьте доступ к /phpinfo или удаляйте тестовый info.php после проверки.
Отладка типичных проблем:
- 502 Bad Gateway — чаще всего PHP-FPM не запущен или слушает другой адрес/сокет.
- 403 Forbidden — проверьте права и SELinux.
- Ошибки «It is not safe to rely on the system’s timezone settings» — установите date.timezone в php.ini.
7 Чеклист перед постановкой в продакшен
- Nginx установлен и запущен
- Apache (httpd) остановлен/удалён или слушает другие порты
- php-fpm установлен и запущен
- cgi.fix_pathinfo=0 в /etc/php.ini
- date.timezone задана в /etc/php.ini
- fastcgi_pass настроен на корректный адрес/сокет
- try_files $uri =404; добавлен в обработку PHP
- Тестовый info.php удалён или защищён
- Логи и мониторинг настроены
- Права на сокет и файлы корректны
8 Критерии приёмки
- На запрос https://или-http-server/info.php возвращается страница phpinfo без ошибок.
- В логах nginx и php-fpm нет критических ошибок при простых запросах.
- Скрипты PHP, использующие базу данных, корректно подключаются (если настроен модуль php-mysql).
9 Альтернативы и когда это не подходит
- Если требуется динамическая автомасштабируемость с контейнерами — рассматривайте Docker-образы с Nginx и PHP-FPM, orchestration и разные подходы к сокетам.
- Для приложений с очень высокой нагрузкой иногда выгоднее отдавать статический контент через CDN и отделять PHP-слой на отдельные машины.
- Если вы привязаны к Apache (модули .htaccess и пр.), миграция на Nginx потребует конвертации правил.
10 Схема принятия решения (упрощённый алгоритм)
flowchart TD
A[Есть конфликт порта 80?] -->|Да| B[Остановить Apache или поменять порт]
A -->|Нет| C[Установить Nginx]
B --> C
C --> D[Установить PHP-FPM]
D --> E[Настроить fastcgi_pass 127.0.0.1:9000]
E --> F{Нужен ли более быстрый обмен?}
F -->|Да| G[Перевести на Unix-сокет и настроить права]
F -->|Нет| H[Оставить TCP:9000]
G --> I[Перезагрузить службы и протестировать]
H --> I11 Роль‑ориентированные проверки
Администратор:
- Убедиться, что сервисы запущены и автозапуск включён.
- Проверить логи и права на сокеты.
Разработчик:
- Убедиться, что скрипты корректно работают через FPM.
- Проверить настройки php.ini (display_errors, error_reporting, timezone).
Оператор безопасности:
- Проверить SELinux/контексты и брандмауэр.
- Убедиться, что нет открытых внутренних интерфейсов наружу.
12 Полезные ссылки
- nginx: http://nginx.org/
- nginx Wiki: http://wiki.nginx.org/
- PHP: http://www.php.net/
- PHP-FPM: http://php-fpm.org/
- MySQL: http://www.mysql.com/
- CentOS: http://www.centos.org/
Итог
Вы установили Nginx и PHP5 с использованием PHP-FPM, научились переключать PHP-FPM на Unix-сокет и настроили безопасную передачу запросов в PHP. Проверьте чеклист и критерии приёмки перед вводом в рабочую эксплуатацию.
Notes: удалите тестовые файлы и удостоверьтесь, что логирование и мониторинг настроены для контроля доступности и ошибок.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента