Так как 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. Такой метод можно применять при более безопасном обслуживании статических сайтов.
Неверно переименовывать файл mv fastcgi.conf fastcgi_old.conf
2024-08-02 at 14:32Файл fastcgi_old.conf будет мешать проверке apachectl -t.
Его надо удалять.