- NGINX + Apache + MariaDB (MySQL) + PHP + PHP-FPM (fastCGI) + FTP + PHPMyAdmin + Memcached + Postfix на Ubuntu
- Настройка операционной системы
- Установка NGINX
- Установка PHP и PHP-FPM
- Настройка связки NGINX + PHP
- Установка СУБД
- PHP + MariaDB
- Установка phpMyAdmin
- Установка Memcached
- Установка и настройка FTP-сервера
- Apache
- NGINX + Apache
- Apache Real IP
NGINX + Apache + MariaDB (MySQL) + PHP + PHP-FPM (fastCGI) + FTP + PHPMyAdmin + Memcached + Postfix на Ubuntu
Обновлено: 06.04.2023 Опубликовано: 24.03.2019
Используемые термины: Linux, Ubuntu, NGINX, Apache, MySQL, MariaDB, PHP-FPM, FTP, phpMyAdmin, Memcached, Postfix. Данная инструкция позволит настроить веб-сервер для решения большей части задач по размещению сайтов, порталов или веб-приложений. Она подходит для серверов на Ubuntu и других систем на основе deb-пакетов. Для RPM Linux читайте похожую инструкцию по настройке полноценного веб-сервера на CentOS. Данные команды протестированы на Ubuntu версий 18, 20 и 22.
Настройка операционной системы
* первая команда для установки пакета синхронизации времени; вторая задает часовой пояс по московскому времени; третья разрашит автозапуск chrony. 3. По умолчанию, в Ubuntu брандмауэр работает в режиме «разрешить все». Но если мы настроили защиту по максимуму, то для веб-сервера открываем следующие порты:
* 80, 443 и 8080 порты для веб-сервера; 20, 21 порты нужны для работы FTP; 60000-65535 также необходимы для работы FTP (динамические порты для пассивного режима); Подробнее про настройку iptables. Для сохранения правил ставим пакет iptables-persistent:
Установка NGINX
* в данном примере мы сняли комментарий со строчки server_names_hash_bucket_size 64;
* на практике, может встретиться ошибка could not build server_names_hash, you should increase server_names_hash_bucket_size: 32. Она возникает при большом количестве виртуальных серверов или если один из них будет иметь длинное название. Данная строка в конфиге исправит ситуацию. Перезапускаем nginx:
* в процессе запуска мы можем увидим ошибку — возможно, в системе работает другой веб-сервер и занимает 80 порт. Как правило, это apache. Чтобы его выключить (на данном этапе он нам не нужен) вводим команду systemctl stop apache2. Проверим работу веб-сервера. Открываем браузер и вводим в адресной строке http:// . В итоге мы должны увидеть заголовок «Welcome to nginx!»: Если стартовая страница не загружается, проверяем состояние сервиса:
Установка PHP и PHP-FPM
* в каждой версии Ubuntu устанавливается своя нативная версия php. Но если нам нужно установить несколько версий PHP или конкретную версию, то использум инструкцию Установка разных версий PHP на Linux Ubuntu. Далее, в зависимости от установленной версии PHP команды и действия будут различаться. Смотрим версию php:
* обратите внимание, что мы запустили php-fpm версии 7.4 (через переменную). Но установлена может быть и другая версия — ее можно узнать по версии php командой php -v.
Настройка связки NGINX + PHP
В секции location или server редактируем параметр index на следующее значение:
* в данном случае мы сказали серверу сначала искать индексный файл index.php, затем остальные по списку. А внутри секции server добавим следующее:
location ~ \.php$ <
set $root_path /var/www/html;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
>
* где /var/www/html — корневой путь хранения скриптов; /run/php/php7.4-fpm.sock — путь до сокетного файла для взаимодействия с php-fpm. Обратите еще раз внимание, что если в нашей системе будет установлена другая версия php, необходимо внести соответствующую корректировку. Пример файла default:
server <
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.php index.html index.htm index.nginx-debian.html;
server_name _;
location / index index.php index.html index.htm;
>
location ~ \.php$ set $root_path /var/www/html;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
>
>
Открываем браузере и переходим по адресу http:// . Мы должны увидеть сводную информацию по PHP и его настройкам: * в данном примере используется php версии 7.4.
Установка СУБД
* где New_Password — пароль, который мы хотим установить для учетной записи root. Выходим из sql-консоли:
PHP + MariaDB
И открываем наш сайт в браузере. В phpinfo появится новая секция MySQL: * несмотря на то, что мы установили mariadb, в заголовке мы видим mysql. Так и должно быть.
Установка phpMyAdmin
* в процессе установки система может потребовать ввод пароля для пользователя phpmyadmin. Его нужно ввести дважды. Теперь создадим конфигурационный файл. Содержимое будет отличаться в зависимости от того, как мы будем настраивать наш сервер. а) Виртуальный домен в NGINX:
server <
listen 80;
server_name phpmyadmin.dmosk.local;
set $root_path /usr/share/phpmyadmin;
location ~ \.php$ fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
>
>
* где phpmyadmin.dmosk.local — адрес для виртуального домена, именно этот адрес должен быть введен в адресную строку браузера, чтобы открылся нужный сайт. Поэтому есть нет возможность зарегистрировать домен и имя узла в DNS, можно воспользоваться локальным файлом hosts. /usr/share/phpmyadmin — это каталог, в который по умолчанию устанавливается phpMyAdmin. б) Используем location /phpmyadmin:
server <
listen 80 default_server;
location /phpmyadmin <
root /usr/share/;
index index.php;
location ~ ^/phpmyadmin/(.+\.php)$ <
root /usr/share/;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
fastcgi_read_timeout 300;
>
location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ <
root /usr/share/;
>
>
>
- http://phpmyadmin.dmosk.local — если настроили phpmyadmin на отдельном виртуальном домене (способ а).
- http:///phpmyadmin — если настроили location /phpmyadmin (способ б).
Откроется форма для авторизации — вводим логин phpmyadmin и пароль, который мы указали при установке phpmyadmin.
Если система вернула ошибку входа из-за неправильного пароля, необходимо задать пароль для учетной записи root@localhost (рассказывается выше в разделе установки MariaDB).
Установка Memcached
Для начала, выполняем установку пакетов:
apt install memcached php-memcached
После разрешаем автозапуск и запускаем сервис кэширования:
systemctl enable memcached
Для проверки, что модуль memcached появился в PHP, открываем наш сайт в браузере — в phpinfo должна появиться новая секция:
Установка и настройка FTP-сервера
Мы настроим ProFTPd, так как он позволит использовать виртуальных пользователей с uid пользователя www-data.
Для его установки вводим следующую команду:
Смотрим uid пользователя www-data:
* в Ubuntu это, как правило, 33.
Создаем виртуального пользователя:
ftpasswd —passwd —file=/etc/proftpd/ftpd.passwd —name=ftpwww —uid=33 —gid=33 —home=/var/www —shell=/usr/sbin/nologin
* где /etc/proftpd/ftpd.passwd — путь до файла, в котором хранятся пользователи; ftpwww — имя пользователя (логин); uid и gid — идентификаторы пользователя и группы системной учетной записи (www-data); /var/www — домашний каталог пользователя; /usr/sbin/nologin — оболочка, запрещающая локальный вход пользователя в систему.
Открываем основной конфигурационный файл:
Снимаем комментарий или редактируем опцию:
* данная опция говорит о том, что корневой директорией для пользователя будет домашняя директория. Это нужно, чтобы FTP-пользователи не могли выйти за пределы дозволенного и видеть на сервере сайты друг друга.
Создаем дополнительный конфигурационный файл для proftpd:
UseIPv6 off
IdentLookups off
PassivePorts 60000 65535
RequireValidShell off
AuthUserFile /etc/proftpd/ftpd.passwd
AuthPAM off
LoadModule mod_auth_file.c
AuthOrder mod_auth_file.c
* где 60000 — 65535 — диапазон динамических портов для пассивного режима.
Разрешаем автозапуск FTP-серверу и запускаем его:
systemctl restart proftpd
Пробуем подключиться к серверу, использую любые FTP-клиенты, например, FileZilla, Total Commander или тот же браузер.
При необходимости, можно настроить шифрование и хранение пользователей в базе данных. Подробнее в инструкции Установка и настройка ProFTPd на Ubuntu Server.
Apache
Для поддержки файла .htaccess, который используется многими сайтами, необходимо установить и настроить веб-сервер Apache.
Устанавливаем apache и модуль для php:
apt install apache2 libapache2-mod-php
Заходим в настройки портов:
* мы настроили прослушивание на порту 8080, так как на 80 уже работает NGINX. Также мы закомментировали прослушивание по 443, так как и он будет слушаться NGINX.
Теперь открываем настройку следующего модуля:
И добавляем впереди индексных файлов index.php:
* если не указан конкретный скрипт, сначала веб-сервер пытается найти и запустить index.php, затем index.html и так далее.
Открываем основной конфигурационный файл для apache:
Рядом с опциями Directory дописываем:
AllowOverride All
Options Indexes ExecCGI FollowSymLinks
Require all granted
* где Directory указывает на путь, для которого мы хотим задать настройки; AllowOverride — позволит переопределить все настройки с помощью файла .htaccess; Options задает некоторые настройки: Indexes разрешает списки каталогов, ExecCGI разрешает запуск cgi скриптов, Require all granted — предоставляет всем доступ к сайтам в данном каталоге.
* этой настройкой мы при получении заголовка X-Forwarded-Proto со значением https задаем переменную $_SERVER[‘HTTPS’] равную on. Данная настройки критична для функционирования некоторых CMS.
* по умолчанию, apache2 может быть установлен с модулем мультипроцессовой обработки mpm_event. Данный модуль не поддерживает php 7 и выше.
Разрешаем модуль мультипроцессовой обработки mpm_prefork:
* в данном примере установлен php версии 7.4.
Разрешаем модуль setenvif:
В процессе включения модулей, если мы видим «Module . already enabled», значит модуль уже включен.
Разрешаем автозапуск Apache и перезапускаем службу:
systemctl restart apache2
Открываем браузер и вводим в адресную строку http://:8080. Мы должны увидеть привычную страницу:
* в разделе Server API мы должны увидеть Apache.
NGINX + Apache
Ранее мы настроили связку nginx + php-fpm. Теперь настроим nginx + apache. Открываем конфигурационный файл nginx для сайта по умолчанию:
Находим наш настроенный location для php-fpm:
.
location ~ \.php$ set $root_path /var/www/html;
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root_path$fastcgi_script_name;
include fastcgi_params;
fastcgi_param DOCUMENT_ROOT $root_path;
>
.
.
location ~ \.php$ proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
>
.
Проверяем и перезапускаем nginx:
Пробуем открыть в браузере http:// — должна открыться та же страница, что при проверке Apache (с добавлением 8080):
Apache Real IP
Запросы на apache приходят от NGINX, и они воспринимаются первым как от IP-адреса 127.0.0.1. На практике, это может привести к проблемам, так как некоторым сайтам необходимы реальные адреса посетителей. Для решения проблемы будем использовать модуль remoteip.
Создаем конфигурационный файл со следующим содержимым: