Nginx как веб и прокси-сервер для Apache в Ubuntu 20.04
LAMP Stack, LEMP Stack, Ubuntu | Комментировать запись
Apache и Nginx – два самых популярных веб-сервера с открытым исходным кодом. Они которые часто используются для работы с PHP. Их можно использовать для поддержки нескольких веб-сайтов с разными требованиями на одной виртуальной машине. Обычно два веб-сервера в одной системе используют для работы с несколькими IP-адресами или различными портами.
Серверы с поддержкой адресов IPv4 и IPv6 можно настроить для обслуживания веб-сервера Apache по одному протоколу и Nginx – по другому. Но это не очень практично, так как IPv6 до сих пор не получил широкого распространения. Можно также установить другой номер порта для второго веб-сервера, но использовать порты в ссылках очень неудобно (http://your_domain:81).
Этот мануал поможет настроить Nginx как веб-сервер и прокси-сервер для Apache на одном сервере Ubuntu 20.04.
При этом вам может понадобиться изменить код приложения, чтобы включить поддержку обратного прокси в Apache (особенно это касается сайтов с поддержкой SSL). Чтобы избежать этого, можно установить специальный модуль Apache, mod_rpaf, который переопределяет некоторые переменные среды, благодаря чему Apache может напрямую обслуживать запросы клиентов.
Мы покажем, как разместить четыре домена в рамках одного сервера. Два из них будут обслуживаться Nginx: nginx1.your_domain (стандартный виртуальный хост) и nginx2.your_domain. Другие два обслуживаются Apache: apache1.your_domain и apache2.your_domain. Мы также настроим Apache для поддержки PHP-приложений по PHP-FPM, что обеспечивает лучшую производительность по сравнению с mod_php.
Требования
- Новый сервер Ubuntu 20.04, настроенный по этому мануалу.
- 4 домена, направленные на IP-адрес вашего сервера. Читайте мануал Как настроить имя хоста, чтобы создать необходимые записи А.
1: Установка Apache и PHP-FPM
Сначала нужно установить Apache и PHP-FPM. Также для работы вам понадобится модуль Apache для PHP FastCGI под названием libapache2-mod-fastcgi.
Обновите индекс пакетов:
sudo apt update
Установите необходимые пакеты:
sudo apt install apache2 php-fpm
Модуль Apache FastCGI недоступен в репозитории Ubuntu, поэтому загрузите его с kernel.org и установите с помощью команды dpkg.
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
2: Настройка Apache и PHP-FPM
Теперь нужно настроить порт Apache (8080) и подготовить веб-сервер к поддержке PHP-FPM с помощью модуля mod_fastcgi. Переименуйте конфигурационный файл Apache ports.conf:
sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default
Создайте новый файл ports.conf и укажите в нем порт 8080.
echo "Listen 8080" | sudo tee /etc/apache2/ports.conf
Примечание: Обычно адрес 127.0.0.1:8080 прослушивают прокси-серверы, но в нашем случае это позволит установить в качестве значения переменной РНР SERVER_ADDR loopback IP-адрес вместо внешнего IP-адреса сервера. Нашей целью является такая настройка Apache, при которой веб-сайты, поддерживаемые Apache, не увидят обратного прокси-сервера. Таким образом, Apache нужно настроить для прослушивания порта 8080 на всех IP-адресах.
После этого нужно отредактировать стандартный виртуальный хост Apache. Директива <VirtualHost> в этом файле обслуживает сайты только на порт 80, это нужно изменить.
Отключите стандартный файл:
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 *:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Сохраните и закройте файл. Включите новый файл:
sudo a2ensite 001-default
Перезапустите Apache.
sudo systemctl reload apache2
Установите пакет net-tools:
sudo apt install net-tools
Убедитесь, что веб-сервер прослушивает нужный порт:
sudo netstat -tlpn
Вывод команды должен выглядеть так:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1086/sshd
tcp6 0 0 :::8080 :::* LISTEN 4678/apache2
tcp6 0 0 :::22 :::* LISTEN 1086/sshd
3: Настройка модуля mod_fastcgi
По умолчанию Apache обслуживает PHP-страницы с помощью модуля mod_php. Но в данном случае нам нужен дополнительный модуль для PHP-FPM.
Примечание: Если вы выполняете мануал на сервере со стеком LAMP и включенным модулем mod_php, сначала отключите его:
sudo a2dismod php7.4
Добавьте блок настроек для mod_fastcgi. Он зависит от mod_action. Чтобы включить mod_action, введите:
sudo a2enmod actions
Переименуйте существующий конфигурационный файл FastCGI:
sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default
Создайте новый файл:
sudo nano /etc/apache2/mods-enabled/fastcgi.conf
Добавьте в файл следующие директивы для передачи запросов к файлам .php на сокет PHP-FPM UNIX:
<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>
Сохраните изменения и проверьте ошибки в файле:
sudo apachectl -t
Примечание: Если вы получили предупреждение
Could not reliably determine the server's fully /
qualified domain name, using 127.0.1.1. Set the /'ServerName' directive globally/
to suppress this message.
Проигнорируйте его пока что. Мы настроим директиву ServerName чуть позже.
Если команда вернула Syntax OK, перезапустите Apache.
sudo systemctl reload apache2
4: Тестирование PHP
Убедитесь, что PHP работает должным образом. Для этого создайте файл /var/www/html/info.php и откройте его в браузере.
В файл нужно поместить функцию:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
Обратите внимание: если вы выполнили начальную настройку сервера согласно этому мануалу, вы, вероятно, включили брандмауэр для Apache. Давайте откроем доступ к нашему IP-адресу через порт 8080, который в настоящее время заблокирован. Мы ограничим общий доступ к этому порту в разделе 10.
Чтобы открыть порт в брандмауэре, введите команду:
sudo ufw allow 8080
Поскольку мы собираемся защитить наши домены Apache, давайте проверим, поддерживает ли брандмауэр трафик TLS на порт 443.
Включите профиль Apache Full, чтобы разрешить трафик на порты 80 и 443:
sudo ufw allow "Apache Full"
Теперь проверьте статус вашего брандмауэра:
sudo ufw status
Если вы выполнили предварительные требования к мануалу, результат будет выглядеть так:
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
8080 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
8080 (v6) ALLOW Anywhere (v6)
Теперь откройте info.php в браузере:
http://your_ip_address:8080/info.php
На экране появится список настроек PHP.
В верхней части страницы найдите Server API, в этой строке должно быть указано FPM/FastCGI. Затем найдите раздел PHP Variables, строку SERVER_SOFTWARE. Она должна содержать Apache и Ubuntu. Это подтверждает, что mod_fastcgi включен и Apache поддерживает PHP-FPM для обработки файлов PHP.
5: Создание виртуального хоста Apache
Создайте виртуальные хосты Apache для доменов apache1.your_domain и apache2.your_domain. Сначала создайте корневые каталоги для этих сайтов.
sudo mkdir -v /var/www/apache1.your_domain /var/www/apache2.your_domain
Создайте index-файлы для каждого сайта:
echo "<h1 style='color: green;'>Apache 1</h1>" | sudo tee /var/www/apache1.your_domain/index.html
echo "<h1 style='color: red;'>Apache 2</h1>" | sudo tee /var/www/apache2.your_domain/index.html
Чтобы протестировать PHP, создайте файл phpinfo() для каждого сайта.
echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache1.your_domain/info.php
echo "<?php phpinfo(); ?>" | sudo tee /var/www/apache2.your_domain/info.php
Затем создайте файл виртуального хоста для домена apache1.your_domain.
sudo nano /etc/apache2/sites-available/apache1.your_domain.conf
Поместите в него следующие строки:
<VirtualHost *:8080>
ServerName apache1.your_domain
ServerAlias www.apache1.your_domain
DocumentRoot /var/www/apache1.your_domain
<Directory /var/www/apache1.your_domain>
AllowOverride All
</Directory>
</VirtualHost>
Строка AllowOverride All включает поддержку .htaccess.
Теперь файл содержит базовые директивы виртуального хоста.
Читайте также: Настройка виртуальных хостов Apache в Ubuntu 18.04
Сохраните и закройте файл. Теперь создайте такой же файл для apache2.your_domain.
sudo nano /etc/apache2/sites-available/apache2.your_domain.conf
Вставьте в него такие строки:
<VirtualHost *:8080>
ServerName apache2.your_domain
ServerAlias www.apache2.your_domain
DocumentRoot /var/www/apache2.your_domain
<Directory /var/www/apache2.your_domain
AllowOverride All
</Directory>
</VirtualHost>
Сохраните и закройте файл.
Итак, теперь виртуальные хосты Apache готовы. Чтобы включить сайты, используйте команду a2ensite, которая создаст симлинки на виртуальные хосты в каталоге sites-enabled.
sudo a2ensite apache1.your_domain
sudo a2ensite apache2.your_domain
Проверьте синтаксис Apache:
sudo apachectl -t
Если ошибок нет, перезапустите веб-сервер:
sudo systemctl reload apache2
Если в синтаксисе обнаружены ошибки, сначала исправьте их.
Чтобы убедиться, что сайты работают и каждый сайт отображает содержимое файла index.html, откройте в браузере:
http://apache1.your_domain:8080
http://apache2.your_domain:8080
На экране появится:
Apache 1
и
Apache 2
Теперь убедитесь, что PHP работает. Для этого откройте файлы info.php каждого сайта в браузере. Эти файлы доступны по ссылкам:
http://apache1.your_domain:8080/info.php
http://apache2.your_domain:8080/info.php
На экране должен появиться список настроек PHP (как в шаге 4).
Теперь Apache обслуживает два сайта по порту 8080. Перейдем к настройке Nginx.
6: Установка и настройка Nginx
Теперь нужно установить Nginx и настроить виртуальные хосты для доменов nginx1.your_domain и nginx2.your_domain.
Читайте также: Установка Nginx в Ubuntu 20.04
Установите Nginx:
sudo apt install nginx
Удалите симлинк стандартного виртуального хоста, он в дальнейшем не понадобится нам.
sudo rm /etc/nginx/sites-enabled/default
Теперь нужно создать новые виртуальные хосты для сайтов. Мы будем следовать той же процедуре, которую использовали для настройки Apache. Сначала создайте каталоги для них:
sudo mkdir -v /usr/share/nginx/nginx1.your_domain /usr/share/nginx/nginx2.your_domain
Мы будем хранить сайты Nginx в /usr/share/nginx, где Nginx ищет их по умолчанию. Вы можете разместить их в каталоге /var/www/html вместе с сайтами Apache, но для настройки Nginx удобнее разделить сайты.
Затем создайте файлы index и phpinfo():
echo "<h1 style='color: green;'>Nginx 1</h1>" | sudo tee /usr/share/nginx/nginx1.your_domain/index.html
echo "<h1 style='color: red;'>Nginx 2</h1>" | sudo tee /usr/share/nginx/nginx2.your_domain/index.html
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx1.your_domain/info.php
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/nginx2.your_domain/info.php
Теперь создайте виртуальный хост для nginx1.your_domain.
sudo nano /etc/nginx/sites-available/nginx1.your_domain
Nginx называет области server {. . .} конфигурационного файла блоками server, которые являются виртуальными хостами. Создайте блок server для первого сайта, nginx1.your_domain. Директива default_server сделает этот файл виртуальным хостом по умолчанию. Он будет обрабатывать HTTP-запросы, которые не соответствуют другим виртуальным хостам.
server {
listen 80 default_server;
root /usr/share/nginx/nginx1.your_domain;
index index.php index.html index.htm;
server_name nginx1.your_domain www.nginx1.your_domain;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
Сохраните и закройте файл. Теперь создайте виртуальный хост для nginx2.your_domain.
sudo nano /etc/nginx/sites-available/nginx2.your_domain
Вставьте в этот файл такие строки:
server {
root /usr/share/nginx/nginx2.your_domain;
index index.php index.html index.htm;
server_name nginx2.your_domain www.nginx2.your_domain;
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/nginx1.your_domain /etc/nginx/sites-enabled/nginx1.your_domain
sudo ln -s /etc/nginx/sites-available/nginx2.your_domain /etc/nginx/sites-enabled/nginx2.your_domain
Проверьте синтаксис Nginx:
sudo nginx -t
Если ошибок нет, перезапустите веб-сервер:
sudo systemctl reload nginx
Теперь попробуйте открыть в браузере файлы phpinfo() для виртуальных хостов Nginx.
http://nginx1.your_domain/info.php
http://nginx2.your_domain/info.php
Проверьте раздел PHP Variables.
Строка [“SERVER_SOFTWARE”] должна показывать nginx (это значит, что файлы обслуживаются сервером Nginx). В [“DOCUMENT_ROOT”] должен находиться путь к root-каталогу сайта.
Теперь веб-сервер Nginx установлен и поддерживает два сайта.
7: Настройка Nginx для поддержки виртуальных хостов Apache
Теперь нужно создать дополнительный виртуальный хост Nginx для нескольких доменов в директиве server_name. Запросы к этим доменам будут проксироваться на Apache.
Создайте новый файл:
sudo nano /etc/nginx/sites-available/apache
Добавьте в него следующий блок настроек. Он задаёт имена сайтов Apache и проксирует их запросы. В proxy_pass укажите внешний IP.
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain apache2.your_domain www.apache2.your_domain;
location / {
proxy_pass http://your_server_ip: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://apache1.your_domain/info.php
Найдите раздел PHP Variables. Переменные SERVER_SOFTWARE и DOCUMENT_ROOT подтверждают, что запрос был обработан Apache. Переменные HTTP_X_REAL_IP и HTTP_X_FORWARDED_FOR были добавлены сервером Nginx и отображают внешний IP-адрес текущей машины.
Теперь Apache использует Nginx в качестве обратного прокси-сервера. Нужно установить переменную Apache, REMOTE_ADDR. Она позволяет «скрыть» прокси-сервер.
8: Установка и настройка модуля mod_rpaf
Теперь нужно установить модуль mod_rpaf, который будет переопределять значения REMOTE_ADDR, HTTPS и HTTP_PORTс помощью значений, предоставленных обратным прокси-сервером. Без этого модуля некоторые приложения PHP
могут потребовать изменений в коде. Модуль можно найти в репозитории Ubuntu, его пакет называется libapache2-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
В каталоге mods-available создайте файл для модуля rpaf.
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>
Этот файл содержит следующие настройки:
- RPAF_Header: заголовок для клиентского IP-адреса.
- RPAF_ProxyIPs: IP прокси-сервера, для которого нужно отредактировать запросы.
- RPAF_SetHostName: обновление имени виртуального хоста для ServerNameиServerAlias.
- RPAF_SetHTTPS: настраивает переменную среды HTTPS на основе значения X-Forwarded-Proto.
- RPAF_SetPort: устанавливает переменную среды SERVER_PORT (эта настройка полезна для Apache на SSL).
Примечание: Подробную информацию о настройках вы найдете в README модуля.
Сохраните файл rpaf.conf и включите модуль:
sudo a2enmod rpaf
Эта команда создаст символьную ссылку файлов rpaf.load и rpaf.conf в каталоге mods-enabled. Проверьте настройки:
sudo apachectl -t
Перезапустите Apache, если ошибок не обнаружено.
sudo systemctl reload apache2
Откройте страницу phpinfo() одного из сайтов Apache и найдите раздел PHP Variables. Переменная REMOTE_ADDR теперь должна содержать IP локального сервера.
9: Поддержка HTTPS с помощью Let’s Encrypt (опционально)
Теперь нужно создать SSL-сертификаты для сайтов Apache. Получите бесплатные доверенные сертификаты от Let’s Encrypt.
Nginx поддерживает терминацию SSL, потому можно настроить SSL, не изменяя настроек Apache.
Модуль mod_rpaf установит все переменные Apache, необходимые для поддержки SSL.
Для начала создайте для обоих доменов блок server {…}, чтобы у каждого из них был свой сертификат. Откройте /etc/nginx/sites-available/apache:
sudo nano /etc/nginx/sites-available/apache
Отредактируйте файл, создав блок server для apache1.your_domain and apache2.your_domain:
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain;
location / {
proxy_pass http://your_server_ip: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;
}
}
server {
listen 80;
server_name apache2.your_domain www.apache2.your_domain;
location / {
proxy_pass http://your_server_ip: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;
}
}
Сертификаты TLS/SSL можно сгенерировать с помощью клиента Certbot. Его плагин для Nginx автоматически перенастроит веб-сервер и обновит конфигурационный файл.
Установите Certbot:
sudo snap install --classic certbot
Затем используйте команду certbot, чтобы сгенерировать сертификаты для apache1.your_domain и www.apache1.your_domain:
sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d apache1.your_domain -d www.apache1.your_domain
С помощью этой команды Certbot сможет использовать плагин nginx; флаг –d позволяет указать домены, для которых предназначен сертификат.
Выполните следующую команду для второго домена:
sudo certbot --agree-tos --no-eff-email --email your-email --nginx -d your_domain -d www.apache2.your_domain
Попробуйте открыть один из этих сайтов в браузере с префиксом https://.
https://apache1.your_domain/info.php
На появившейся странице найдите раздел PHP Variables. Для переменной SERVER_PORT установлено значение 443, а HTTPS – on, как если бы веб-сервер Apache был напрямую доступен через HTTPS.
Теперь давайте отключим прямой доступ к Apache.
10: Блокирование прямого доступа к Apache (опционально)
Apache слушает порт 8080 на внешнем IP-адресе, потому доступ к нему может получить любой желающий. Этот доступ можно заблокировать с помощью брандмауэра IPtables.
sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset
Примечание: Вместо your_server_ip укажите IP-адрес сервера.
Теперь порт 8080 блокируется брандмауэром, и доступ к Apache закрыт.
Откройте браузер и попробуйте получить доступ к одному из сайтов Apache.
http://apache1.your_domain:8080
Браузер должен выдать сообщение об ошибке «Unable to connect» или «Webpage is not available». Директива tcp-reset позволяет скрыть от посторонних разницу между портами.
Примечание: Правила IPtables сбрасываются при каждой перезагрузке сервера. Чтобы сохранить их, используйте iptables-persistent.
Читайте также: Настройка фаервола с помощью IPTables на Ubuntu 14.04
11: Обслуживание статических файлов с помощью Nginx (опционально)
Когда Nginx проксирует запросы доменов Apache, он отправляет Apache запрос каждого файла. Nginx быстрее, чем Apache, обслуживает статические файлы (изображения, JavaScript, стили). Отредактируйте виртуальный хост apache, чтобы настроить отправку PHP-запросов.
Откройте файл apache:
sudo nano /etc/nginx/sites-available/apache
Добавьте два блока location в каждый блок server и отредактируйте существующие блоки location.
Примечание: Вы можете просто заменить содержимое файла предложенными ниже конфигурациями.
Также нужно указать Nginx, где хранятся статические файлы каждого сайта.
server {
listen 80;
server_name apache2.your_domain www.apache2.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_server_ip: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;
}
location ~ /\.ht {
deny all;
}
}
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_ip_address: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;
}
location ~ /\.ht {
deny all;
}
}
Чтобы настроить поддержку HTTPS, используйте такую конфигурацию:
server {
listen 80;
server_name apache2.your_domain www.apache2.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_server_ip: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;
}
location ~ /\.ht {
deny all;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
listen 80;
server_name apache1.your_domain www.apache1.your_domain;
root /var/www/your_domain;
index index.php index.htm index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
proxy_pass http://your_ip_address: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;
}
location ~ /\.ht {
deny all;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
Директива try_files позволяет Nginx просматривать файлы в document root и сразу обслуживать их. Если файл имеет расширение .php, запрос будет передан Apache. Даже если файл не найден в корневом каталоге, запрос будет передан Apache, чтобы такие функции приложения, как постоянные ссылки, работали без проблем.
Внимание! Директива location ~ /\. очень важна. Она блокирует обслуживание файлов .htaccess и .htpasswd.
Сохраните и закройте файл. Проверьте код на наличие ошибок:
sudo nginx -t
Перезапустите Nginx:
sudo service nginx reload
Убедитесь, что всё работает. Откройте лог-файлы Apache (/var/log/apache2) и просмотрите запросы GET для файлов info.php сайтов apache2.your_domain и apache1.your_domain. Команда tail выведет последние строки файла, а флаг –f покажет его изменения.
sudo tail -f /var/log/apache2/other_vhosts_access.log
Откройте в браузере:
http://apache2.your_domain/info.php
А затем проверьте ответ лога. Apache вернёт:
apache2.your_domain:80 your_server_ip - - [27/Aug/2020:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36"
Проверьте страницу index.html каждого сайта. Вы не увидите записей от Apache. Все запросы обрабатывает Nginx.
Чтобы остановить команду tail, нажмите CTRL+C.
Единственным недостатком этой настройки является то, что Apache не сможет ограничивать доступ к статическим файлам. Доступ можно ограничить с помощью файла виртуального хоста apache.
Tags: Apache, Let's Encrypt, NGINX, PHP, php-fpm, Ubuntu, Ubuntu 20.04