Установка серверов · 10 min read · Oct 04, 2025
Как установить Nginx с PHP и MySQL (LEMP стек) на CentOS 7.6

Этот учебник показывает, как вы можете установить Nginx на сервере CentOS 7 с поддержкой PHP (через PHP-FPM) и поддержкой MySQL (MariaDB).
Что такое LEMP?
Nginx (произносится как “engine x”) — это бесплатный, открытый, высокопроизводительный HTTP-сервер. Nginx известен своей стабильностью, богатым набором функций, простой конфигурацией и низким потреблением ресурсов.
Предварительные требования LEMP
В этом учебнике я буду использовать имя хоста server1.example.com с IP-адресом 192.168.1.100. Эти настройки могут отличаться у вас, поэтому вам нужно заменить их, где это необходимо.
Я буду использовать редактор nano в этом учебнике для редактирования файлов конфигурации. Nano можно установить следующим образом.
yum -y install nanoЯ рекомендую установить брандмауэр. Если у вас еще не установлен firewalld и вы хотите использовать брандмауэр, то установите его с помощью этих команд:
yum -y install firewalldзапустите брандмауэр и включите его для автоматического запуска при загрузке.
systemctl start firewalld.service
systemctl enable firewalld.serviceДалее откройте ваш SSH порт, чтобы убедиться, что вы сможете подключиться к серверу по SSH.
firewall-cmd --permanent --zone=public --add-service=ssh
firewall-cmd --reloadВключение дополнительных репозиториев CentOS
Последний Nginx недоступен из официальных репозиториев CentOS, поэтому мы добавляем репозиторий проекта Nginx для его установки:
nano /etc/yum.repos.d/nginx.repo[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1Установка MySQL (MariaDB)
Сначала мы установим MariaDB в качестве замены MySQL. MariaDB — это бесплатный форк MySQL. Выполните эту команду в оболочке, чтобы установить сервер базы данных MariaDB:
yum -y install mariadb mariadb-server net-toolsЗатем мы создаем системные ссылки для автозапуска MariaDB (чтобы она запускалась автоматически при загрузке системы) и запускаем сервер MariaDB:
systemctl enable mariadb.service
systemctl start mariadb.serviceТеперь проверьте, что сеть включена. Обратите внимание, что служба MraiDB называется mysql, так как это совместимый сервер базы данных. Выполните
netstat -tap | grep mysqlЭто должно показать что-то вроде этого:
[root@server1 ~]# netstat -tap | grep mysql
tcp 0 0 0.0.0.0:mysql 0.0.0.0:* LISTEN 19842/mysqld Выполните:
mysql_secure_installationчтобы установить пароль для пользователя root (в противном случае любой сможет получить доступ к вашей базе данных MySQL!):
[root@example ~]# mysql_secure_installation
/usr/bin/mysql_secure_installation: line 379: find_mysql_client: command not foundПРИМЕЧАНИЕ: РЕКОМЕНДУЕТСЯ ЗАПУСКАТЬ ВСЕ ЧАСТИ ЭТОГО СКРИПТА ДЛЯ ВСЕХ СЕРВЕРОВ MariaDB В ПРОИЗВОДСТВЕ! ПОЖАЛУЙСТА, ВНИМАТЕЛЬНО ПРОЧИТАЙТЕ КАЖДЫЙ ШАГ!Чтобы войти в MariaDB и обеспечить ее безопасность, нам понадобится текущий
пароль для пользователя root. Если вы только что установили MariaDB и
еще не установили пароль root, то пароль будет пустым,
поэтому вам просто нужно нажать Enter здесь.Введите текущий пароль для root (нажмите Enter для отсутствия):
Хорошо, успешно использован пароль, продолжаем...Установка пароля root гарантирует, что никто не сможет войти в MariaDB
пользователя root без надлежащей авторизации.Установить пароль root? [Y/n] <-- ENTER
Новый пароль: <-- yourrootsqlpassword
Повторите новый пароль: <-- yourrootsqlpassword
Пароль успешно обновлен!
Перезагрузка таблиц привилегий..
... Успех!По умолчанию установка MariaDB имеет анонимного пользователя, позволяя любому
войти в MariaDB без необходимости создания учетной записи пользователя
для них. Это предназначено только для тестирования и для того, чтобы сделать установку
немного более гладкой. Вам следует удалить их перед переходом в
производственную среду.Удалить анонимных пользователей? [Y/n] <-- ENTER
... Успех!Обычно root должен иметь возможность подключаться только с 'localhost'. Это
гарантирует, что кто-то не сможет угадать пароль root из сети.Запретить удаленный вход root? [Y/n] <-- ENTER
... Успех!По умолчанию MariaDB поставляется с базой данных с именем 'test', к которой любой может
получить доступ. Это также предназначено только для тестирования и должно быть удалено
перед переходом в производственную среду.Удалить тестовую базу данных и доступ к ней? [Y/n] <-- ENTER
- Удаление тестовой базы данных...
... Успех!
- Удаление привилегий на тестовую базу данных...
... Успех!Перезагрузка таблиц привилегий обеспечит, что все изменения, сделанные до сих пор,
вступят в силу немедленно.Перезагрузить таблицы привилегий сейчас? [Y/n] <-- ENTER
... Успех!Очистка...Все готово! Если вы выполнили все вышеперечисленные шаги, ваша установка MariaDB
теперь должна быть безопасной.Спасибо за использование MariaDB!
[root@example ~]#[root@server1 ~]# mysql_secure_installation
Установка Nginx
Nginx доступен как пакет с nginx.org, который мы можем установить следующим образом:
yum -y install nginxЗатем мы создаем системные ссылки для автозапуска nginx и запускаем его:
systemctl enable nginx.service
systemctl start nginx.serviceСуществует вероятность, что вы получите ошибку, что порт 80 уже используется, сообщение об ошибке будет выглядеть так:
[root@server1 ~]# service nginx start
Запуск 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] все еще не удалось привязать()
[FAILED]
[root@server1 ~]#Это означает, что другой веб-сервер (вероятно, Apache) уже работает на этом сервере. Остановите службу Apache, а затем запустите службу для NGINX:
systemctl stop httpd.service
yum remove httpd
systemctl disable httpd.serviceЗатем попробуйте снова запустить Nginx.
systemctl start nginx.serviceОткройте HTTP и HTTPS порты в брандмауэре
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reloadРезультирующий вывод в оболочке будет выглядеть так:
[root@example ~]# firewall-cmd --permanent --zone=public --add-service=http
успех
[root@example ~]# firewall-cmd --permanent --zone=public --add-service=https
успех
[root@example ~]# firewall-cmd --reload
успех
[root@example ~]#Введите IP-адрес или имя хоста вашего веб-сервера в браузере (например, http://192.168.1.100), и вы должны увидеть страницу приветствия Nginx:

Установка PHP
Мы можем заставить PHP 5 работать с Nginx через PHP-FPM (FastCGI Process Manager). PHP-FPM — это альтернативная реализация PHP FastCGI с некоторыми дополнительными функциями, полезными для сайтов любого размера, особенно более загруженных сайтов. Мы можем установить php-fpm вместе с php-cli и некоторыми модулями PHP5, такими как php-mysql, которые вам нужны, если вы хотите использовать MySQL из ваших PHP-скриптов следующим образом:
yum -y install php-fpm php-cli php-mysql php-gd php-ldap php-odbc php-pdo php-pecl-memcache php-pear php-mbstring php-xml php-xmlrpc php-mbstring php-snmp php-soapAPC — это бесплатный и открытый кэш опкодов PHP для кэширования и оптимизации промежуточного кода PHP. Он похож на другие кэши опкодов PHP, такие как eAccelerator и Xcache. Настоятельно рекомендуется установить один из них, чтобы ускорить вашу страницу PHP.
Я установлю APC из репозитория PHP pecl. PECL требует, чтобы инструменты разработки Centos были установлены для компиляции пакета APC.
yum -y install php-devel
yum -y groupinstall 'Development Tools'и установите APC:
pecl install apc[root@example ~]# pecl install apc
скачивание APC-3.1.13.tgz ...
Начало загрузки APC-3.1.13.tgz (171,591 байт)
.................готово: 171,591 байт
55 исходных файлов, сборка
запуск: phpize
Конфигурирование для:
PHP Api Version: 20100412
Zend Module Api No: 20100525
Zend Extension Api No: 220100525
Включить внутреннюю отладку в APC [нет] : <-- ENTER
Включить информацию о файлах по запросу о файлах, используемых из кэша APC [нет] : <-- ENTER
Включить спин-блокировки (ЭКСПЕРИМЕНТАЛЬНО) [нет] : <-- ENTER
Включить защиту памяти (ЭКСПЕРИМЕНТАЛЬНО) [нет] : <-- ENTER
Включить мьютексы pthread (по умолчанию) [нет] : <-- ENTER
Включить блокировки чтения/записи pthread (ЭКСПЕРИМЕНТАЛЬНО) [да] : <-- ENTER
сборка в /var/tmp/pear-build-rootVrjsuq/APC-3.1.13
......Затем откройте /etc/php.ini и установите cgi.fix_pathinfo=0:
nano /etc/php.ini[...]
; cgi.fix_pathinfo предоставляет *реальную* поддержку PATH_INFO/PATH_TRANSLATED для CGI. PHP
; предыдущее поведение заключалось в том, чтобы устанавливать PATH_TRANSLATED в SCRIPT_FILENAME и не понимать,
; что такое PATH_INFO. Для получения дополнительной информации о PATH_INFO смотрите спецификации cgi. Установка
; этого в 1 приведет к тому, что PHP CGI исправит свои пути в соответствии со спецификацией. Установка
; нуля заставляет PHP вести себя как раньше. По умолчанию 1. Вы должны исправить свои скрипты
; чтобы использовать SCRIPT_FILENAME, а не PATH_TRANSLATED.
; http://www.php.net/manual/en/ini.core.php#ini.cgi.fix-pathinfo
cgi.fix_pathinfo=0
[...](Пожалуйста, прочитайте http://wiki.nginx.org/Pitfalls, чтобы узнать, почему вы должны это сделать.)
и добавьте строку:
[...]
extension=apc.soв конец файла /etc/php.ini.
Кроме того, чтобы избежать ошибок часового пояса, таких как
[28-Июня-2016 14:21:01] PHP Warning: phpinfo(): Небезопасно полагаться на настройки часового пояса системы. Вы *обязаны* использовать настройку date.timezone или функцию date_default_timezone_set(). Если вы использовали любой из этих методов и все еще получаете это предупреждение, вы, скорее всего, неправильно написали идентификатор часового пояса. Мы выбрали 'Europe/Berlin' для 'CEST/2.0/DST' вместо этого в /usr/share/nginx/html/info.php на строке 2… в /var/log/php-fpm/www-error.log, когда вы вызываете PHP-скрипт в вашем браузере, вам следует установить date.timezone в /etc/php.ini:
[...]
[Date]
; Определяет часовой пояс по умолчанию, используемый функциями даты
; 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 и запустите его:
systemctl enable php-fpm.service
systemctl start php-fpm.servicePHP-FPM — это демон-процесс (с init-скриптом /etc/init.d/php-fpm), который запускает сервер FastCGI на порту 9000.
Настройка Nginx
Конфигурация nginx находится в /etc/nginx/nginx.conf, который мы сейчас откроем:
nano /etc/nginx/nginx.confСначала (это необязательно) вы можете увеличить количество рабочих процессов и установить keepalive_timeout на разумное значение:
[...]
worker_processes 4;
[...]
keepalive_timeout 2;
[...]Виртуальные хосты определяются в контейнерах server {} в каталоге /etc/nginx/conf.d. Давайте изменим стандартный vhost (в /etc/nginx/conf.d/default.conf) следующим образом:
nano /etc/nginx/conf.d/default.conf[...]
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
#error_page 404 /404.html;
# перенаправить страницы ошибок сервера на статическую страницу /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# проксировать PHP-скрипты на Apache, слушающий на 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# передать PHP-скрипты на сервер FastCGI, слушающий на 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;
}
# запретить доступ к файлам .htaccess, если корень документа Apache
# совпадает с корнем nginx
#
location ~ /\.ht {
deny all;
}
}servername ; делает это стандартным catchall vhost (конечно, вы также можете указать здесь имя хоста, например www.example.com).
В части location / я добавил index.php в строку index. root /usr/share/nginx/html; означает, что корень документа — это каталог /usr/share/nginx/html.
Важная часть для PHP — это блок location ~ .php$ {}. Раскомментируйте его, чтобы включить. Измените строку root на корень документа веб-сайта (например, root /usr/share/nginx/html;). Пожалуйста, обратите внимание, что я добавил строку try_files $uri =404; чтобы предотвратить нулевые эксплойты (см. http://wiki.nginx.org/Pitfalls#Passing_Uncontrolled_Requests_to_PHP и http://forum.nginx.org/read.php?2,88845,page=3). Пожалуйста, убедитесь, что вы изменили строку fastcgi_param на fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;, потому что в противном случае интерпретатор PHP не сможет найти PHP-скрипт, который вы вызываете в своем браузере ( $document_root переводится в /usr/share/nginx/html, потому что это то, что мы установили в качестве корня документа).
PHP-FPM слушает на порту 9000 на 127.0.0.1 по умолчанию, поэтому мы говорим Nginx подключиться к 127.0.0.1:9000 с помощью строки fastcgi_pass 127.0.0.1:9000;. Также возможно заставить PHP-FPM использовать Unix-сокет — я опишу это в главе 7.
Теперь сохраните файл и перезагрузите Nginx:
systemctl restart nginx.serviceТеперь создайте следующий PHP-файл в корне документа /usr/share/nginx/html…
nano /usr/share/nginx/html/info.phpТеперь мы вызываем этот файл в браузере (например, http://192.168.1.100/info.php):

Как видите, PHP 5 работает, и он работает через FPM/FastCGI, как показано в строке Server API. Если вы прокрутите дальше вниз, вы увидите все модули, которые уже включены в PHP5, включая модуль MySQL:

Настройка PHP-FPM для использования Unix-сокета
По умолчанию PHP-FPM слушает на порту 9000 на 127.0.0.1. Также возможно заставить PHP-FPM использовать Unix-сокет, что позволяет избежать накладных расходов TCP. Для этого откройте /etc/php-fpm.d/www.conf…
nano /etc/php-fpm.d/www.conf… и измените строку listen следующим образом:
[...]
;listen = 127.0.0.1:9000
listen = /var/run/php-fpm/php5-fpm.sock
[...]Затем перезагрузите PHP-FPM:
systemctl restart php-fpm.serviceДалее пройдите через вашу конфигурацию Nginx и все ваши vhosts и измените строку fastcgi_pass 127.0.0.1:9000; на fastcgi_pass unix:/tmp/php5-fpm.sock;, например, вот так:
vi /etc/nginx/conf.d/default.conf[...]
location ~ \.php$ {
root /usr/share/nginx/html;
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php5-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
[...]Наконец, перезагрузите Nginx:
systemctl restart nginx.serviceСкачайте этот сервер CentOS 7 как виртуальную машину
Эта настройка доступна для загрузки в формате виртуальной машины ova/ovf (совместимый с VMWare и Virtualbox) для подписчиков howtoforge.
Данные для входа в VM
- Пароль root: howtoforge
- Пароль пользователя “администратор“: howtoforge
Пожалуйста, измените оба пароля при первом входе.
- IP-адрес VM: 192.168.1.100
Ссылки
- nginx: http://nginx.org/
- вики nginx: 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/
Get new posts in your inbox
No spam. Unsubscribe anytime.