Nginx как веб-сервер и прокси-сервер для Apache в Ubuntu 18.04

Apache и Nginx– популярные веб-серверы с открытым исходным кодом, которые часто используются для работы с PHP. Их можно использовать на одной виртуальной машине для поддержки нескольких веб-сайтов с разными требованиями. Обычно два веб-сервера в одной системе используют для работы с несколькими IP-адресами или различными портами.

Серверы с поддержкой адресов IPv4 и IPv6 можно настроить для обслуживания Apache по одному протоколу и Nginx по другому. Но это не очень практично, так как IPv6 до сих пор не получил широкого распространения. Можно также установить для второго веб-сервера другой номер порта, но использовать порты в ссылках очень неудобно.

Данный мануал поможет настроить Nginx как веб-сервер и прокси-сервер для Apache на одном сервере Ubuntu 18.04.

При этом может понадобиться изменить код приложения, чтобы включить поддержку обратного прокси в Apache (особенно это касается сайтов с SSL). Чтобы избежать этого, можно установить специальный модуль Apache, mod_rpaf, который переопределяет некоторые переменные среды, благодаря чему Apache может напрямую обслуживать запросы клиентов.

В мануале показано, как разместить четыре домена на одном сервере. Два из них будут обслуживаться Nginx: example.com (стандартный виртуальный хост) и sample.org. Другие два – Apache: foobar.net и test.io. Мы также настроим Apache для поддержки PHP-приложений по PHP-FPM, что обеспечивает лучшую производительность по сравнению с mod_php.

Требования

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 прослушивают прокси-серверы, но это позволит установить loopback IP-адрес в качестве значения переменной окружения РНР server_addr вместо внешнего 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

Убедитесь, что порт изменился:

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.2.

Добавьте блок настроек для 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

Добавьте в конец блока <IfModule mod_fastcgi.c>. . .</IfModule> следующие строки:

<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.2-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>

Сохраните изменения и проверьте ошибки в файле:

sudo apachectl -t

Если команда вернула Syntax OK, перезапустите Apache.

sudo systemctl reload apache2

Если на экране появилось предупреждение:

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.

Проигнорируйте его. Имена серверов будут настроены позже.

4: Тестирование PHP

Убедитесь, что PHP работает должным образом. Создайте файл phpinfo() и откройте его в браузере.

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/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 для доменов foobar.net и test.io. Сначала создайте корневые каталоги для этих сайтов.

sudo mkdir -v /var/www/foobar.net /var/www/test.io

Создайте index-файлы для каждого сайта:

echo "<h1 style='color: green;'>Foo Bar</h1>" | sudo tee /var/www/foobar.net/index.html
echo "<h1 style='color: red;'>Test IO</h1>" | sudo tee /var/www/test.io/index.html

Чтобы протестировать PHP, создайте phpinfo() для каждого сайта.

echo "<?php phpinfo(); ?>" | sudo tee /var/www/foobar.net/info.php
echo "<?php phpinfo(); ?>" | sudo tee /var/www/test.io/info.php

Затем создайте файл виртуального хоста для домена foobar.net.

sudo nano /etc/apache2/sites-available/foobar.net.conf

Поместите в него следующий код:

<VirtualHost *:8080>
ServerName foobar.net
ServerAlias www.foobar.net
DocumentRoot /var/www/foobar.net
<Directory /var/www/foobar.net>
AllowOverride All
</Directory>
</VirtualHost>

Примечание: AllowOverride All включает поддержку .htaccess.

Теперь файл содержит базовые директивы виртуального хоста.

Читайте также: Настройка виртуальных хостов Apache в Ubuntu 16.04

Сохраните и закройте файл. Теперь создайте такой же файл для test.io.

sudo nano /etc/apache2/sites-available/test.io.conf
<VirtualHost *:8080>
ServerName test.io
ServerAlias www.test.io
DocumentRoot /var/www/test.io
<Directory /var/www/test.io>
AllowOverride All
</Directory>
</VirtualHost>

Сохраните и закройте файл.

Итак, теперь виртуальные хосты Apache готовы. Чтобы включить сайты, используйте команду a2ensite, которая создаст симлинки на виртуальные хосты в каталоге sites-enabled.

sudo a2ensite foobar.net
sudo a2ensite test.io

Проверьте синтаксис Apache:

sudo apachectl -t

Если ошибок нет, перезапустите веб-сервер:

sudo systemctl reload apache2

Чтобы убедиться, что сайты работают и каждый сайт отображает содержимое файла index.html, откройте в браузере:

http://foobar.net:8080
http://test.io:8080

На экране появится:

Foo Bar

и

Test IO

Убедитесь, что PHP работает. Для этого откройте файлы info.php каждого сайта в браузере. Эти файлы доступны по ссылкам:

http://foobar.net:8080/info.php
http://test.io:8080/info.php

На экране должен появиться список настроек PHP (как в шаге 4).

Теперь Apache обслуживает два сайта по порту 8080.

6: Установка и настройка Nginx

Теперь нужно установить Nginx и настроить виртуальные хосты для доменов example.comиsample.org.

Читайте также: Установка Nginx в Ubuntu 18.04

Установите Nginx:

sudo apt install nginx

Удалите симлинк стандартного виртуального хоста, он в дальнейшем не понадобится.

sudo rm /etc/nginx/sites-enabled/default

Теперь нужно создать новые виртуальные хосты для сайтов. Сначала создайте каталоги:

sudo mkdir -v /usr/share/nginx/example.com /usr/share/nginx/sample.org

Мы будем хранить веб-сайты Nginx в /usr/share/nginx, где Nginx ищет их по умолчанию. Вы можете разместить их в каталоге /var/www/html с сайтами Apache, но разделить сайты удобнее для настройки Nginx.

Затем создайте файлы index и phpinfo():

echo "<h1 style='color: green;'>Example.com</h1>" | sudo tee /usr/share/nginx/example.com/index.html
echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx/sample.org/index.html
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/example.com/info.php
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/sample.org/info.php

Теперь создайте виртуальный хост для example.com.

sudo nano /etc/nginx/sites-available/example.com

В этом файле создайте блок server для первого сайта, example.com. Директива default_server сделает этот файл виртуальным хостом по умолчанию. Он будет обрабатывать HTTP-запросы, которые не соответствуют другим виртуальным хостам.

Вставьте в файл следующие строки:

server {
listen 80 default_server;
root /usr/share/nginx/example.com;
index index.php index.html index.htm;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
include snippets/fastcgi-php.conf;
}
}

Сохраните и закройте файл. Теперь создайте виртуальный хост для sample.org.

sudo nano etc/nginx/sites-available/sample.org

Вставьте в него:

server {
root /usr/share/nginx/sample.org;
index index.php index.html index.htm;
server_name sample.org www.sample.org;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.2-fpm.sock;
include snippets/fastcgi-php.conf;
}
}

Сохраните и закройте файл. Чтобы включить сайты, создайте симлинки для них:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/example.com
sudo ln -s /etc/nginx/sites-available/sample.org /etc/nginx/sites-enabled/sample.org

Проверьте синтаксис Nginx:

sudo nginx -t

Если ошибок нет, перезапустите веб-сервер:

мsudo systemctl reload nginx

Теперь попробуйте открыть в браузере файлы phpinfo() для виртуальных хостов Nginx.

http://example.com/info.php
http://sample.org/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 foobar.net www.foobar.net test.io www.test.io;
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://foobar.net/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).

Сохраните файл 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 для foobar.net and test.io:

server {
listen 80;
server_name foobar.net www.foobar.net;
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 test.io www.test.io;
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 add-apt-repository ppa:certbot/certbot

Чтобы подтвердить действие, нажмите ввод. Затем обновите индекс пакетов.

sudo apt update

Теперь можно установить Certbot для Nginx:

sudo apt install python-certbot-nginx

Затем используйте команду certbot, чтобы сгенерировать сертификаты для foobar.net и www.foobar.net:

sudo certbot --nginx -d foobar.net -d www.foobar.net

С помощью этой команды Certbot сможет использовать плагин nginx; флаг –d позволяет указать домены, для которых предназначен сертификат.

Если это ваш первый запуск certbot, вам будет предложено ввести адрес электронной почты и согласиться с условиями обслуживания. После этого certbot свяжется с сервером Let’s Encrypt, а затем запустит проверку, чтобы убедиться, что домен, для которого вы запрашиваете сертификат, действительно принадлежит вам.

Затем Certbot спросит, нужно ли настроить HTTPS:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

Сделайте свой выбор и нажмите ввод. Конфигурации обновятся, а Nginx будет перезапущен. Теперь запустите команду для второго домена:

sudo certbot --nginx -d test.io -d www.test.io

Попробуйте открыть один из этих сайтов в браузере с префиксом https://.

https://foobar.net/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://example.com: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 test.io www.test.io;
root /var/www/test.io;
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 foobar.net www.foobar.net;
root /var/www/foobar.net;
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 test.io www.test.io;
root /var/www/test.io;
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/test.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.io/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
server {
listen 80;
server_name foobar.net www.foobar.net;
root /var/www/foobar.net;
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/foobar.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/foobar.net/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

Директива try_files позволяет Nginx просматривать файлы в document troot и сразу обслуживать их. Если у файла расширение .php, запрос будет передан Apache. Если файла нет в document root, запрос будет передан Apache.

Важно! Директива location ~ /\. очень важна. Она блокирует обслуживание файлов htaccess и .htpasswd.

Сохраните и закройте файл. Проверьте код на наличие ошибок:

sudo nginx -t

Перезапустите Nginx:

sudo service nginx reload

Убедитесь, что всё работает. Откройте лог-файлы Apache (/var/log/apache2) и просмотрите запросы GET для файлов info.php сайтов test.io и foobar.net. Команда tail выведет последние строки файла, а флаг –f покажет его изменения.

sudo tail -f /var/log/apache2/other_vhosts_access.log

Откройте в браузере:

http://test.io/info.php

А затем проверьте ответ лога. Apache вернёт:

test.io:80 your_server_ip - - [01/Jul/2016: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/47.0.2526.111 Safari/537.36"

Проверьте страницу index.html каждого сайта. Вы не увидите записей от Apache. Все запросы обрабатывает Nginx.

Чтобы остановить команду tail, нажмите CTRL+C.

Единственным недостатком этой настройки является то, что Apache не сможет ограничивать доступ к статическим файлам. Доступ можно ограничить с помощью файла виртуального хоста apache.

Tags: , , , , , ,