Установка и настройка nginx + PHP7 FPM + Mysql на CentOS 7
В погоне за скоростью и с целью экономии ресурсов настроем веб-сервер в конфигурации Linux + NGINX + PHP7 (PHP-FPM + MYSQL (MariaDB) или просто LEMP.
Данная связка ПО становится все популярнее. Потому, что это наиболее удачный вариант для проектов, которые ограничены мощностью своего сервера. Эта связка требует меньше всего ресурсов для своей работы и при этом показывает хорошие результаты быстродействия.
И так для начала устанавливаем CetnOS 7 в конфигурации Minimal и после можно приступить к установке и настройке нашего набора ПО для бeдующего веб-сервера
Отключаем SELinux:
первая команда редактирует конфигурационный файл, чтобы SELinux не запускался автоматически, вторая — отключает его разово.
Установка NGINX
Установка NGINX очень проста достаточно выполнить команду yum install nginx, только предварительно надо добавить официальный репозитарий выполнив две команды:
Или добавить репозитарий ручками, создав файл /etc/yum.repos.d/nginx.repo с содержанием:
После добавления репозитария уже можно установить пакет NGINX и добавить его в автозагрузку:
Установка PHP-FPM
Поскольку на момент написания в официальном репозитарии CentOS 7 отсутсвует пакеты PHP 7 то подключим неофициальный репозитарий IUS.
Выполните скрипт командой:
Далее устанавливаем PHP 7 и модули php-fpm, php-mysqlnd:
Добавим PHP-FPM в автозагрузку
Настройка PHP 7 для работы с Nginx
И так для начала откроем файл в редакторе и внесем изменения:
Затем найдите блок listen.acl_users и раскомментируйте в нем строку listen.acl_users = nginx.
Далее необходимо изменить конфигурацию NGINX, что бы веб-сервер использовал сокет для взаимодействия с PHP-FRM:
Переключаем способ взаимодействия с TCP-порта 9000 на использование сокета, как показано ниже:
Настроем хост по умолчанию что бы в последствии убедится что у нас все работает:
Вариант конфигурации для проверки:
Что бы все наши изменения вступили в силу перезапускаем PHP-FPM и Nginx:
Проверка работы PHP 7
Поскольку все установили и вроде как настроили то неплохо и убедится что все работает.
Для начала выполним команду:
Ответ которого мы ждем :
Теперь можно создать в корневом каталоге веб-сервера файл info.php для проверки работы самого серврера:
И теперь если все правильно установили и настроили то открыв в браузере http://ip-адрес-вашего-сервера/info.php мы должны увидеть информацию о конфигурации php.
Далее можно спокойно продолжить настройку веб-сервера под конкретные нужды.
Установка MariaDB (mysql)
В общем установка MariaDB тоже сводится к выполнению нескольких команд:
Добавляем mariadb в автозагрузку:
В случае если пакет не нашелся добавим репозитарий MariaDB создав файл /etc/yum.repos.d/MariaDB.repo с содержанием:
Открываем необходимые порты в брандмауэре:
80, 443 порты для работы веб-сервера.
Nginx + php-fpm на CentOS 7
Установка nginx на CentOS 7
Ставим непосредственно web сервер:
Добавляем в автозагрузку:
Проверяем, запустился ли:
Теперь можно зайти на тестовую страничку, чтобы убедиться, что nginx работает:
Не забудьте открыть 80-й порт на фаерволе.
Установка mysql на CentOS 7
Практически ни один web сервер сейчас не обходится без mysql. В centos 7 вместо mysql устанавливается mariadb, которая имеет полную совместимость с mysql, в том числе понимает все ее команды. Так что ставим на сервер:
Добавляем в автозапуск:
Проверяем, запустилась ли mysql:
Теперь воспользуемся скриптом безопасности, который позволит задать пароль root и произвести некоторые настройки:
Установка php-fpm на CentOS 7
Устанавливаем php-fpm и некоторые модули, которые скорее всего пригодятся в дальнейшей работе:
На все вопросы просто жмем enter, выбирая параметры по-умолчанию.
Теперь отредактируем /etc/php.ini как нам рекомендует инсталлятор:
Задаем параметр cgi.fix_pathinfo=0 и добавляем в конце строку extension=apc.so
Заодно установим сразу же часовой пояс: date.timezone = «Europe/Moscow»
Создадим файл настроек APC:
Добавляем php-fpm в автозагрузку:
Настройка nginx и php-fpm на CentOS 7
Теперь отредактируем конфиги для совместной работы. Приводим конфиг nginx к следующему виду:
Более подробно о том, как выполнить базовую настройку nginx читайте в отдельной обширной статье.
Теперь правим конфиг php-fpm, приводим его к следующему виду:
Создаем необходимые каталоги:
Теперь все готово, можно проверять. Создаем в папке /web/sites/site1.ru/www тестовый файл:
Заходим по адресу: http://site1.ru/ и если наблюдаем информацию о php, то все сделано правильно.
Если нет, то идем в логи и смотрим, в чем ошибка.
Установка phpmyadmin на CentOS 7
Для удобства управления базами веб сайтов я всегда использую phpmyadmin. Установим ее:
Копируем файлы панели в наш виртуальный домен, созданный ранее:
Заходим по адресу http://pma.site1.ru/ и проверяем, все ли в порядке.
У меня при первом запуске в браузере открылся просто белый лист. Начал разбираться в чем дело. В логе ошибок nginx этого виртуального хоста увидел ошибку:
*43 FastCGI sent in stderr: «PHP message: PHP Fatal error: Call to undefined function __() in /web/sites/pma.site1.ru/www/libraries/core.lib.php on line 245» while reading response header from upstream, client: 77.47.234.119, server: pma.site1.ru, request: «GET /index.php HTTP/1.1», upstream: «fastcgi://unix:/var/run/php-fpm/php5-fpm.sock:», host: «pma.site1.ru»
Немного погуглил на эту тему и нашел, в чем причина ошибки. Проблема с директорией для файлов сессий. Чтобы исправить ошибку, создаем эту директорию и выставляем на нее нужные права:
После этого загрузилась панель phpmyadmin:
Более подробную информацию об установке и настройке phpmyadmin смотрите в отдельной статье.
На этом все, настройка nginx + php-fpm на CentOS7 закончена.
Онлайн курс Внедрение и работа в DevSecOps
Помогла статья? Подписывайся на telegram канал автора
Автор Zerox
27 комментариев
Добрый день!
Вы тут в пункте «Настройка nginx и php-fpm на CentOS 7» связали nginx и php-fpm но php 5.4
где можно найти связку nginx и php-fpm 7.1?
нашёл ссылку Вашу https://serveradmin.ru/ustanovka-i-nastroyka-nginx-php-fpm-php7-1-na-centos-7/
там установка nginx и php-fpm 7.1 есть но связки не нашёл(а может только их установка хватит)
Zerox, огромное спасибо за статью!
Сможете подсказать, возможно ли настроить и если возможно, то как это сделать)
Есть сервер mysql на Windows 2012 R2, к нему привязано несколько других сервесов. Необходимо использовать его для работы с Сайтом.
Как это настроить?
Если делать по инструкции, то будет использоваться mariadb, что распологается локально.
Буду признателен, если сможете подсказать и/или направить в нужное русло.
Так ничего делать и не надо. Создайте базу на текущем сервере и подключайтесь к ней удаленно. В больших проектах так чаще всего и бывает, что сервер с базой данных это отдельный сервер.
Установка Nginx, MySQL, PHP (LEMP) для CentOS 7
В данной статье рассмотрен пример установки LEMP-стека на VPS/VDS сервере под управлением операционной системы CentOS 7.
Перед началом установки стека LEMP рекомендуется обновить все ранее установленные пакеты приложений.
Шаг #1: Настройка файервола
Для начала убедимся, что файервол у нас запущен и включен в автозапуск при перезагрузке сервера:
Если в результате выполнения команд вы видите такие слова как inactive и disabled соответственно, то это означает, что файевол у вас не работает и ваш сервер не защищен. Запустить файервол можно так:
Убедившись, что файервол работает, создадим для него новое правило, которое добавляет сервисы http и https для работы на 80 и 443 портах соответственно в публичную зону (группа портов/сервисов, которые доступны для всех компьютеров).
Перезапустим службу firewalld для того, чтобы изменения вступили в силу.
Убедимся в том, что службы http и https добавлены в публичную зону.
Теперь, при удачно выполненных предыдущих действиях, ваши будущие сайты будут доступны для всех.
Шаг #2: Установка веб-сервера Nginx
Nginx (энджин экс) можно установить как минимум двумя способами.
Способ #1: Из репозитория EPEL-release
Так как Nginx не входит в набор пакетов доступных из базового репозитория, то скачать и установить его вы сможете его из репозитория EPEL-release.
EPEL-release, в некоторых дистрибутивах, может быть не установлен по-умолчанию, поэтому для начала нужно убедится, что он у вас есть.
Если вы не видите никаких результатов для вышеуказанных команд, тогда EPEL репозитория у вас нет и его нужно установить.
Далее устанавливаем сам веб-сервер nginx
Минус данного способа в том, что часто в EPEL репозитории хранится устаревшая версия пакета Nginx. Установленную версию можно проверить следующей командой:
Способ #2: Из собственного репозитория Nginx
Данный способ позволит установить последнюю стабильную версию Nginx прямо с сайта http://nginx.org, который мы укажем в репозитории как источник пакета.
Файл нужно наполнить следующим содержимым:
Теперь установим Nginx, однако в качестве источника пакета автоматически будет выбран наш, только что созданный, репозиторий.
Включим Nginx и добавим его в автозапуск при перезагрузке системы.

Шаг #3: Настройка файла конфигурации Nginx
Настроим параметры в главном конфигурационном файле Nginx.
Перед любым начальным изменением конфигов, рекомендую создавать их копии.
Приступим к редактированию главного конфига Nginx.
После сохранения изменений, рекомендую всегда проверять конфиг на ошибки в синтаксисе.
Шаг #4: Создание и настройка сервер-блоков Nginx
Создание директорий для сайта
Созданным директориям нужно присвоить владельца. Владельцем чаще всего назначается сам веб-сервер т.к. именно он проводит большинство операций с файлами.
Установка веб-сервера в качестве владельца особенно важна при установки каких-либо CMS-систем, например WordPress.
Так как нашим веб сервером будет Nginx, то и установим его в качестве владельца и группы. При необходимости группу можно будет заменить на любую удобную вам.
Также настроим права доступа для /var/www
Создание тестовой страницы.
Создание сервер-блока
Создадим необходимые для работы каталоги и файл для настроек сервер-блока:
How To Install Linux, Nginx, MySQL, PHP (LEMP) stack On CentOS 7
Last Validated on April 21, 2020 Originally Published on July 22, 2014
Not using CentOS 7?
Choose a different version or distribution.
Introduction
A LEMP software stack is a group of open source software that is typically installed together to enable a server to host dynamic websites and web apps. This term is actually an acronym which represents the Linux operating system, with the ENginx web server (which replaces the Apache component of a LAMP stack). The site data is stored in a MySQL-based database, and dynamic content is processed by PHP.
In this guide, we’ll get a LEMP stack with PHP 7.4 installed on a CentOS 7 server, using MariaDB as the database management system. MariaDB works as a drop-in replacement for the original MySQL server, which in practice means you can switch to MariaDB without having to make any configuration or code changes in your application.
Prerequisites
Before you begin with this guide, you should have a separate, non-root user account set up on your server. You can learn how to do this by completing steps 1-4 in the initial server setup for CentOS 7.
Step 1 — Installing Nginx
In order to display web pages to our site visitors, we are going to employ Nginx, a high-performance web server. To get the latest Nginx version, we’ll first install the EPEL repository, which contains additional software for the CentOS 7 operating system.
To add the CentOS 7 EPEL repository, run the following command:
Since we are using a sudo command, these operations get executed with root privileges. It will ask you for your regular user’s password to verify that you have permission to run commands with root privileges. You’ll also be prompted to confirm installation, so press Y to proceed.
Now that the EPEL repository is installed on your server, install Nginx using the following yum command:
Once the installation is finished, start the Nginx service with:
You can do a spot check right away to verify that everything went as planned by visiting your server’s public IP address in your web browser (see the note under the next heading to find out what your public IP address is if you do not have this information already):
You will see the default CentOS 7 Nginx web page, which is there for informational and testing purposes. It should look something like this:
If you see this page, then your web server is now correctly installed.
To enable Nginx to start on boot, run the following command:
How To Find Your Server’s Public IP Address
If you do not know what your server’s public IP address is, there are a number of ways you can find it. Usually, this is the address you use to connect to your server through SSH.
From the command line, you can find this a few ways. First, you can use the iproute2 tools to get your address by typing this:
This will give you one or two lines back. They are both correct addresses, but your computer may only be able to use one of them, so feel free to try each one.
An alternative method is to use an outside party to tell you how it sees your server. You can do this by asking a specific server what your IP address is:
Regardless of the method you use to get your IP address, you can type it into your web browser’s address bar to get to your server.
Step 2 — Installing MariaDB
Now that we have our web server up and running, it is time to install MariaDB, a MySQL drop-in replacement. MariaDB is a community-developed fork of the MySQL relational database management system.
Again, we can use yum to acquire and install our software. This time, we’ll also install some other helper packages that will assist us in getting our components to communicate with each other:
When the installation is complete, we need to start MariaDB with the following command:
Now that our MariaDB database is running, we want to run a security script that will remove some dangerous defaults and lock down access to our database. Start the interactive script by running:
For the rest of the questions, you should hit the “ENTER” key through each prompt to accept the default values. This will remove some sample users and databases, disable remote root logins, and load these new rules so that MySQL immediately respects the changes we have made.
The last thing you will want to do is enable MariaDB to start on boot. Use the following command to do so:
At this point, your database system is now set up and we can move on.
Step 3 — Installing PHP
PHP is the component of our setup that will process code to display dynamic content. It can run scripts, connect to our MySQL databases to get information, and hand the processed content over to our web server to display.
The PHP version available by default within CentOS 7 servers is outdated, and for that reason, we’ll need to install a third-party package repository in order to obtain PHP 7+ and get it installed on your CentOS 7 server. Remi is a popular package repository providing the most up-to-date PHP releases for CentOS servers.
To install the Remi repository for CentOS 7, run:
After the installation is done, you’ll need to run a command to enable the repository containing your preferred version of PHP. To check which PHP 7+ releases are available in the Remi repository, run:
You’ll see output like this:
In this guide, we’ll install PHP 7.4, which is currently the most updated stable version of PHP. To enable the correct Remi package to get PHP 7.4 installed, run:
Now we can proceed to use yum for installing PHP as usual. The following command will install all the required packages to get PHP 7.4 set up within Nginx and allow it to connect to MySQL-based databases:
To confirm that PHP is available as your chosen version, run:
You’ll see output like this:
Open the /etc/php-fpm.d/www.conf configuration file using nano or your editor of choice:
Next, locate the listen directive. By default, php-fpm will listen on a specific host and port over TCP. We want to change this setting so it listens on a local socket file, since this improves the overall performance of the server.
Change the line containing the listen directive to the following:
To enable and start the php-fpm service, run:
Step 4 — Configuring Nginx to Process PHP Pages
Now, we have all of the required components installed. The only configuration change we still need to do is tell Nginx to use our PHP processor for dynamic content.
Nginx has a dedicated directory where we can define each hosted website as a separate configuration file, using a server block. This is similar to Apache’s virtual hosts.
With the default installation, however, this directory is empty. We’ll create a new file to serve as the default PHP website on this server, which will override the default server block defined in the /etc/nginx/nginx.conf file.
First, open a new file in the /etc/nginx/conf.d directory:
Copy the following PHP server definition block to your configuration file, and don’t forget to replace the server_name directive so that it points to your server’s domain name or IP address:
Save and close the file when you’re done.
Next, restart Nginx to apply the changes:
Your web server is now fully set up. In the next step, we’ll test the PHP integration to Nginx.
Step 5 — Testing PHP Processing on your Web Server
Before creating our script, we’ll make a change to the default ownership settings on Nginx’s document root, so that our regular sudo user is able to create files in that location.
We’ll now create a test PHP page to make sure the web server works as expected.
Create a new PHP file called info.php at the /usr/share/nginx/html directory:
The following PHP code will display information about the current PHP environment running on the server:
When you are finished, save and close the file.
Now we can test whether our web server can correctly display content generated by a PHP script. Go to your browser and access your server hostname or IP address, followed by /info.php :
You’ll see a page similar to this:
After checking the relevant information about your PHP server through that page, it’s best to remove the file you created as it contains sensitive information about your PHP environment and your CentOS server. You can use rm to remove that file:
You can always regenerate this file if you need it later.
Conclusion
Установка и оптимальная настройка Nginx + LAMP (CentOS 7)
Недавно приняли решение переехать с хостинга на VPS, будем использовать: CentOS 7, Nginx, Apache, PHP, MySQL. Несмотря на большое количество статей на эту тему, многие аспекты не упоминаются, поэтому выкладываем эту статью чтобы услышать мнение знающих и опытных людей. Настраивать сервер как Вы уже поняли будем первый раз, поэтому о актуальности статьи можно будет судить из комментариев. Nginx будет отдавать статику, а динамику Apache (скрипты PHP), чтобы снизить нагрузку на сервер.
Все настройки будем применять на рабочем сервере нашего проекта с конфигурацией сервера: CPU — 2 × 2000 МГц и RAM — 2048 МБ.
Для начала работы находим подходящий VPS с предустановленной CentOS 7, к серверу будем подключаться по SSH через PuTTY.
Вводим название хоста и порт, нажимаем Open:
Далее вводим логин [Enter], потом пароль (обратите внимание, ввод пароля не отображается) [Enter]:
Обновить систему, при этом сохранить устаревшие версии пакетов:
Создаём файловую структуру и пользователей под сайты.
Создаём каталог (папку) для файлов под все сайты:
Под каждый отдельный сайт выполните такие действия.
Содержимое каждого сайта будет находиться в собственном каталоге, поэтому создаём нового пользователя и отдельный каталог для разграничения прав доступа:
-b папка в которой будет создан каталог пользователя
-m создать каталог
-U создаём группу с таким же именем как у пользователя
-s /bin/false отключаем пользователю shell
]# chmod 755 /website/name.site
Инструкции по установке приведены на официальном сайте Nginx.
Для настройки репозитория yum в CentOS создаём файл /etc/yum.repos.d/nginx.repo:
]# cd /etc/yum.repos.d
[root@test
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
]# systemctl start nginx.service
]# systemctl stop nginx.service
Устанавливаем Apache и PHP.
Устанавливаем Apache (в CentOS — httpd):
]# systemctl start httpd.service
]# systemctl stop httpd.service
Добавляем в автозагрузку:
]# systemctl enable nginx.service
user nginx;
worker_processes 2;
pid /var/run/nginx.pid;
events <
worker_connections 1024;
multi_accept on;
>
http <
error_log /var/log/nginx/error.log warn;
access_log off;
charset utf-8;
server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
reset_timedout_connection on;
client_header_timeout 15;
client_body_timeout 30;
send_timeout 15;
keepalive_timeout 5;
keepalive_requests 30;
client_max_body_size 8m;
limit_rate_after 30M;
limit_rate 500K;
open_file_cache max=10000 inactive=3m;
open_file_cache_min_uses 2;
open_file_cache_valid 1m;
sendfile on;
tcp_nodelay on;
tcp_nopush on;
open_file_cache max=10000 inactive=3m;
Для каждого сайта создаём виртуальный хост Nginx.
Чтобы Nginx получил доступ к файлам сайта, добавим пользователя nginx в группу name.site:
server <
listen 80;
server_name name.site www.name.site;
#access_log /website/name.site/logs/nginx_access.log;
error_log /website/name.site/logs/nginx_error.log;
* \.(css|js|png|gif|jpg|jpeg|ico)$ <
root /website/name.site/www;
expires 1d;
>
error_page 500 502 503 504 /50x.html;
location = /50x.html <
root /usr/share/nginx/html;
>
>
* \.(css|js|png|gif|jpg|jpeg|ico)$ <
root /serves/name.site/www;
expires 1d;
>
Посмотрите какой именно модуль Apache у вас установлен. У меня — apache2-mpm-prefork (один процесс с одним потоком будет обрабатывать одно соединение, рекомендуется как безопасный совместно с PHP):
ServerRoot «/etc/httpd»
DocumentRoot «/website»
Include conf.modules.d/*.conf
User apache
Group apache
Listen 127.0.0.1:8080
ServerName 127.0.0.1:8080
ServerAdmin root@localhost
ServerSignature Off
ServerTokens Prod
RLimitMEM 786432000
TimeOut 250
AddDefaultCharset utf-8
DefaultLanguage ru
KeepAlive Off
ContentDigest Off
EnableSendfile off
ErrorLog «logs/error_log»
LogLevel error
DirectoryIndex index.php
AllowOverride none
Require all denied
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 30
MaxRequestsPerChild 2500
Require all denied
Для каждого сайта создаём виртуальный хост Apache.
Добавляем пользователя apache в группу каждого сайта:
ServerName name.site
ServerAlias www.name.site
AllowOverride None
Require all granted
ErrorLog /website/name.site/logs/error.log
CustomLog /website/name.site/logs/requests.log combined
Блок VirtualHost, указывается какой порт слушать:
CustomLog /website/name.site/logs/requests.log combined
Проверка Nginx и Apache.
Добавляем Apache в автозагрузку:
]# systemctl enable httpd.service
]# touch /website/name.site/www/index.php
[root@test
]# cp /etc/httpd/conf.d/php.conf /etc/httpd/sites-enabled/php.conf
]# systemctl start nginx.service
[root@test
]# systemctl start httpd.service
engine = On
expose_php = Off
short_open_tag = Off
zlib.output_compression = Off
disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, etc
display_startup_errors = Off
display_errors = Off
log_errors = On
error_log = «/usr/local/zend/var/log/php.log»
ignore_repeated_errors = Off
ignore_repeated_source = Off
html_errors = On
implicit_flush = Off
output_buffering = 4K
realpath_cache_size = 2M
realpath_cache_ttl = 1800
zend.enable_gc = On
max_input_time = 200
max_execution_time = 30
file_uploads = On
memory_limit = 256M
post_max_size = 8M
upload_max_filesize = 2M
max_file_uploads = 4
extension_dir = «/usr/local/zend/lib/php_extensions»
date.timezone = Europe/Moscow
default_mimetype = «text/html»
default_charset = «UTF-8»
variables_order = «CGPS»
register_argc_argv = Off
auto_globals_jit = On
enable_dl = Off
allow_url_fopen = On
allow_url_include = Off
disable_functions = exec, passthru, shell_exec, system, proc_open, popen, curl_exec, curl_multi_exec, parse_ini_file, show_source, etc
Устанавливаем и настраиваем MySQL.
Немного про безопасность.
Под root заходить нежелательно, поэтому создаём нового пользователя:
]# service sshd restart
P.S. Можно использовать Nginx с php-fpm, но есть такое мнение, что при правильно настроенном Apache особой разницы в производительности не наблюдается.
Особое внимание хотелось обратить на безопасность и производительность сервера, поэтому если вы нашли ошибки или недочёты, просим написать это в комментариях и в случае необходимости мы внесём изменения в статью.








