Так как Nginx и Apache – практически самые используемые веб-серверы, и для хостинга на одном VPS, имеющем один IP-адрес, сайтов с различной структурой и различными требованиями, при настройке доступа к ним применяют разные номера портов для каждого из веб-серверов. Но использование номеров портов в ссылках на ресурсы – не удобно. Поэтому существует метод, позволяющий настроить Nginx в качестве веб-сервера и обратного прокси-сервера для Apache на одном сервере Ubuntu, имеющим один единственный IP-адрес.
На примере, описанном ниже, будет реализовано размещение четырёх доменов на одном VPS. Два домена будут работать под управлением Apache, а ещё два – под управлением Nginx. В случае, если будете настраивать на своём сервере такую схему, вам понадобится четыре реальных доменных имени, запись А (A-record) которых соответствует IP-адресу вашего VPS. Имена доменов в данном руководстве будут прописаны как ap1.site, ap2.site, ng1.site и ng2.site соответственно.
Настройка Apache
В начале, необходимо проинсталлировать сервис Apache и пакет PHP-FPM:
$ sudo apt update
$ sudo apt install apache2 php-fpm
Также, понадобится модуль PHP FastCGI. Поскольку он недоступен для установки из стандартного репозитория Ubuntu, устанавливать его придётся при помощи dpkg
, предварительно загрузив дистрибутив из kernel.org:
$ wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
$ sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
Для Apache будем использовать порт 8080. Здесь необходимо настроить так, чтобы Apache при помощи mod_fastcgi
поддерживал PHP-FPM. Для чего переименуйте файл ports.conf
и создайте новый, указав в нём порт 8080:
$ sudo mv /etc/apache2/ports.conf /etc/apache2/ports_old.conf
$ echo "Listen 8080" | sudo tee /etc/apache2/ports.conf
Следующим шагом необходимо будет создать виртуальный хост на Apache. Для чего отключите дефолтный хост, создайте новый и откройте файл, в котором нужно изменить конфигурацию созданного хоста:
$ sudo a2dissite 000-default
$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf
$ sudo nano /etc/apache2/sites-available/001-default.conf
В этом файле измените значение порта на 8080 в строке <VirtualHost>
:

Закройте отредактированный файл с сохранением изменений, активируйте его и перезапустите сервис Apache:
$ sudo a2ensite 001-default
$ sudo systemctl reload apache2
И в завершение настройки, установите модуль net-tools и посмотрите, действительно ли на Apache доступен для прослушивания порт под номером 8080:
$ sudo apt install net-tools
$ sudo netstat -tlpn

Настройка mod_fastcgi
В данном разделе нужно будет настроить модуль mod_fastcgi
для корректной обработки веб-сервером страниц, написанных на PHP.
Сначала необходимо будет отключить модуль mod_php
:
$ sudo a2dismod php7.4

После этого необходимо включить mod_action
, и сохранив существующий файл FastCGI под другим именем, и создайте новый fastcgi.conf
:
$ sudo a2enmod actions
$ cd /etc/apache2/mods-enabled
$ sudo mv fastcgi.conf fastcgi_old.conf
$ sudo nano fastcgi.conf
Следующий текст вставьте в созданный файл:
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
FastCgiIpcDir /var/lib/apache2/fastcgi
AddType application/x-httpd-fastphp .php
Action application/x-httpd-fastphp /php-fcgi
Alias /php-fcgi /usr/lib/cgi-bin/php-fcgi
FastCgiExternalServer /usr/lib/cgi-bin/php-fcgi -socket /run/php/php7.4-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
Закройте файл сохранив изменения и протестируйте Apache на корректность синтаксиса:
$ sudo apachectl -t
Нижеуказанную ошибку следует проигнорировать:

Главное, что проверка сообщила, что Syntax OK
. Это значит, что необходимо перезапустить сервис Apache:
$ sudo systemctl reload apache2
Далее, в папке /var/www/html
нужно создать файл, который будет открывать страницу конфигурации PHP:
$ cd /var/www/html
$ sudo nano info.php
В этот файл необходимо вставить следующую фунцию:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
Теперь выполните настройку брандмауэра вашего VPS, которая позволит открыть доступ к нему по порту 8080:
$ sudo ufw allow 8080
А также, включите на UFW разрешение для Apache:
$ sudo ufw allow "Apache Full"
Проверьте статус, в котором находится ваш UFW:
$ sudo ufw status

И теперь, если вы откроете в браузере адрес http://
, где X.X.X.X
:8080/info.phpX.X.X.X
– это IP-адрес вашего VPS, то, скорее всего, увидите конфигурационную страницу PHP:

Обратите внимание, что на данной странице значения строк Server API
и $_SERVER['SERVER_SOFTWARE']
, как показано на скриншотах ниже, говорит о работоспособности модуля mod_fastcgi
и использовании PHP-FPM веб-сервером Apache для работы с php-страницами. Что, собственно, и было целью данного раздела.


Виртуальные хосты Apache
Следующий этап в настройке сервера – создание виртуальных хостов для ap1.site и ap2.site. Как было описано выше, эти домены будут работать под управлением Apache. Для этих сайтов нужно создать соответствующие директории и файлы index.html
:
$ sudo mkdir -v /var/www/ap1.site /var/www/ap2.site
$ echo "<title>ap1.site</title><h1>Apache Site - ap1.site</h1>" | sudo tee /var/www/ap1.site/index.html
$ echo "<title>ap2.site</title><h1>Apache Site - ap2.site</h1>" | sudo tee /var/www/ap2.site/index.html
Для каждого из ваших сайтов необходимо создать соответствующий файл info.php
. Так можно будет проверить корректность конфигурации PHP на каждом из хостов:
$ echo "<?php phpinfo(); ?>" | sudo tee /var/www/ap1.site/info.php
$ echo "<?php phpinfo(); ?>" | sudo tee /var/www/ap2.site/info.php
Далее, создайте файлы для каждого из ваших виртуальных хостов при помощи, например, текстового редактора nano. Будьте внимательны: ИМЯ_ДОМЕНА
– это доменное вашего сайта. Запустите команду сначала для первого вашего сайта (в примере это – ap1.site
):
sudo nano /etc/apache2/sites-available/ИМЯ_ДОМЕНА.conf
В открытый файл вставьте следующий текст, заменяя ИМЯ_ДОМЕНА
на имя вашего первого домена, который вы размещаете на Apache (в примере это – ap1.site
):
<VirtualHost *:8080>
ServerName ИМЯ_ДОМЕНА
ServerAlias www.ИМЯ_ДОМЕНА
DocumentRoot /var/www/ИМЯ_ДОМЕНА
<Directory /var/www/ИМЯ_ДОМЕНА
AllowOverride All
</Directory>
</VirtualHost>
Теперь нужно закрыть файл с сохраненим внесённых изменений (при использовании nano нужно нажать Ctrl-X
, Y
и Enter
). После этого, проделайте то же для второго вашего домена.
После чего, необходимо создать ссылки на созданные хосты:
$ sudo a2ensite ap1.site
$ sudo a2ensite ap2.site
Протестируйте Apache на корректность синтаксиса:
sudo apachectl -t
Если проверка сообщила, что Syntax OK
, нужно будет перезапустить сервис:
sudo systemctl reload apache2
Чтобы протеститровать доступность ваших сайтов, наберите в браузере http://ap1.site:8080
для первого сайта и http://ap2.site:8080
для второго.
Если, всё идёт правильно, в первом случае вы увидите:

А во втором:

А, набрав в браузере http://ap1.site:8080/info.php
и http://ap1.site:8080/info.php
, вы увидите конфигурационную страницу PHP:

Настройка Nginx
В этом разделе вам нужно будет установить Nginx и настроить на нём виртуальные хосты для двух других ваших доменов.
Запустите инсталляцию Nginx:
$ sudo apt install nginx
Созданный каталог дефолтного виртуального хоста нужно удалить:
$ cd /etc/nginx/sites-enabled
$ sudo rm default
Для новых хостов сначала создайте соответствующие директории:
$ sudo mkdir -v /usr/share/nginx/ng1.site
$ sudo mkdir -v /usr/share/nginx/ng2.site
Теперь создайте для них файлы index.html
и
:info.php
$ echo "<title>ng1.site</title><h1>Nginx Site - ng1.site</h1>" | sudo tee /usr/share/nginx/ng1.site/index.html
$ echo "<title>ng2.site</title><h1>Nginx Site - ng2.site</h1>" | sudo tee /usr/share/nginx/ng2.site/index.html
$ echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/ng1.site/info.php
$ echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/ng2.site/info.php
Далее, для каждого из ваших Nginx-сайтов создайте файл хоста, заменяя ИМЯ_ДОМЕНА
на имена ваших доменов, которые вы будете размещать на Nginx. В примере, это – ng1.site
и ng2.site
:
$ sudo nano /etc/nginx/sites-available/ИМЯ_ДОМЕНА
И вставьте в него следующий текст, также заменяя ИМЯ_ДОМЕНА
на имена ваших доменов, как, например, ng1.site
и ng2.site
:
server {
listen 80 default_server;
root /usr/share/nginx/ИМЯ_ДОМЕНА;
index index.php index.html index.htm;
server_name ИМЯ_ДОМЕНА www.ИМЯ_ДОМЕНА;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
Сохраняйте файлы перед закрытием. Проделайте процедуру для каждого из ваших доменов.
После этого, создайте ссылки для ваших виртуальных хостов:
$ sudo ln -s /etc/nginx/sites-available/ng1.site /etc/nginx/sites-enabled/ng1.site
$ sudo ln -s /etc/nginx/sites-available/ng2.site /etc/nginx/sites-enabled/ng2.site
Запустите тест корректности синтаксиса:
$ sudo nginx -t
Перезапустите сервис, если проверка синтаксиса ошибок не показала:
$ sudo systemctl reload nginx
И наконец, в браузере откройте по очереди ссылки на ваши сайты, работающие на Nginx: http://ng1.site/info.php
и http://ng1.site/info.php
:

Обратите внимание на строку, содержащую значение $_SERVER[‘SERVER_SOFTWARE’]. Если строка выглядит так же, как на скриншоте ниже, значит, ваш сайт работает на Nginx, другими словами, запуск второй пары ваших сайтов завершился успешно:

Соответственно, каждый из ваших доменов должен теперь открываться по ссылке на него. Например, набрав в браузере http://ng1.site
, вы должны получить следующую картинку:

Настройка Nginx для работы с Apache
Далее, необходимо создать дополнительный хост, работающий под Nginx, который будет перенаправлять запросы на веб-сервер Apache.
Для этого наберите:
$ sudo nano /etc/nginx/sites-available/apache
Вставьте в него следующий текст, где ap1.site
и ap2.site
– ваши домены, работающие на Apache, а X.X.X.X
– IP-адрес вашего VPS:
server {
listen 80;
server_name ap1.site www.ap1.site ap2.site www.ap2.site;
location / {
proxy_pass http://X.X.X.X:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Закройте файл с сохранение изменений.
Создайте ссылку командой:
$ sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache
Запустите тест сервиса на корректность:
$ sudo nginx -t
И в случае, если тест ошибок не нашёл, перезагрузите Nginx:
$ sudo systemctl reload nginx
Теперь, если вы в браузере откроете ссылку http://ap1.site/info.php
, браузер вернёт вам страницу конфигурации PHP.
Таким образом, вы настроили Nginx как обратный прокси для Apache.
Настройка mod_rpaf
Для того, чтобы не вносить коррективы в код PHP-приложений для корректной работы на вашем хостинге, необходимо установить и настроить модуль mod_rpaf.
Инсталляцию модуля рекомендуется производить скомпилировав его из исходного кода. Для начала нужно запустить установку командой:
$ sudo apt install unzip build-essential apache2-dev
После чего, загрузите из GitHub последний релиз инсталлируемого модуля:
$ wget https://github.com/gnif/mod_rpaf/archive/stable.zip
После чего, распакуйте его, перейдите в его директорию, соберите и проинсталлируйте модуль:
$ unzip stable.zip
$ cd mod_rpaf-stable
$ make
$ sudo make install
Теперь для установленного модуля необходимо создать следующий файл, для чего наберите:
$ sudo nano /etc/apache2/mods-available/rpaf.load
В него вставьте текст:
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so
Закройте файл с сохранением внесённых изменений.
Теперь создайте конфигурационный файл. Для чего наберите:
$ sudo nano /etc/apache2/mods-available/rpaf.conf
Вставьте в него текст:
<IfModule mod_rpaf.c>
RPAF_Enable On
RPAF_Header X-Real-Ip
RPAF_ProxyIPs your_server_ip
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
</IfModule>
Закройте файл, сохранив изменения. После чего, запустите модуль и тест на корректность синтаксиса:
$ sudo a2enmod rpaf
$ sudo apachectl -t
Если всё прошло без ошибок, перезапустите сервис:
$ sudo systemctl reload apache2
Теперь, при открытии конфигурационной страницы PHP, значение строки $_SERVER[‘REMOTE_ADDR’] должно содержать IP-адрес локальной рабочей станции.
Таким образом, вы произвели настройку своего сервера, на котором теперь сайты ap1.site
и ap2.site
работают под управлением Apache, в то время как сайты ng1.site
и
обслуживаются Nginx. И даже, если ваш Nginx используется как обратный прокси, этот прокси-сервер остаётся невидимым из внешней сети. Другими словами, все подключения к сайтам, размещённым на Apache, проходя через Nginx, выглядят работающими непосредственно с Apache.ng
2.site
И ещё из положительных моментов. Если у вас получилось настроить Nginx в качестве веб-сервера и обратного прокси-сервера для Apache на одном сервере Ubuntu, вы сможете запарковать по меньшей мере четыре домена на одном VPS. Такой метод можно применять при более безопасном обслуживании статических сайтов.