Гид по технологиям

Установка и настройка Nginx и PHP5 на CentOS 6.5

6 min read DevOps Обновлено 26 Nov 2025
Nginx и PHP5 на CentOS 6.5 — установка
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:

Приветственная страница 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 start

PHP-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:

Страница phpinfo, показывающая Server API FPM/FastCGI

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

Список модулей PHP, включая 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 reload

5 Проверки и тесты

  • Откройте /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 --> I

11 Роль‑ориентированные проверки

Администратор:

  • Убедиться, что сервисы запущены и автозапуск включён.
  • Проверить логи и права на сокеты.

Разработчик:

  • Убедиться, что скрипты корректно работают через FPM.
  • Проверить настройки php.ini (display_errors, error_reporting, timezone).

Оператор безопасности:

  • Проверить SELinux/контексты и брандмауэр.
  • Убедиться, что нет открытых внутренних интерфейсов наружу.

12 Полезные ссылки

Итог

Вы установили Nginx и PHP5 с использованием PHP-FPM, научились переключать PHP-FPM на Unix-сокет и настроили безопасную передачу запросов в PHP. Проверьте чеклист и критерии приёмки перед вводом в рабочую эксплуатацию.

Notes: удалите тестовые файлы и удостоверьтесь, что логирование и мониторинг настроены для контроля доступности и ошибок.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро