Установка серверов · 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:

Страница приветствия 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-soap

APC — это бесплатный и открытый кэш опкодов 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.service

PHP-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 с нашего сервера nginx.

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

Драйвер MySQL был активирован в PHP.

Настройка 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

Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.