Поиск по сайту:

Как настроить Nginx в качестве веб-сервера и обратного прокси-сервера для Apache на одной капле Ubuntu 14.04


Введение

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

Капли, которые имеют как IPv4, так и IPv6-адреса, могут быть настроены для обслуживания сайтов Apache по одному протоколу и сайтов Nginx по другому, но в настоящее время это нецелесообразно, поскольку внедрение IPv6 интернет-провайдерами все еще не получило широкого распространения. Наличие другого номера порта, такого как 81 или 8080 для второго веб-сервера, является еще одним решением, но совместное использование URL-адресов с номерами портов (например, http://example. com:81) не всегда разумно или идеально.

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

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

Предпосылки

  • Новая капля Ubuntu 14.04.
  • Стандартная учетная запись пользователя с привилегиями sudo. Вы можете настроить стандартную учетную запись, выполнив шаги 2 и 3 начальной настройки сервера с Ubuntu 14.04.
  • Желаемые доменные имена должны указывать на IP-адрес вашего дроплета в панели управления DigitalOcean. См. Шаг 3 в разделе «Как настроить имя хоста с помощью DigitalOcean» для примера того, как это сделать. Если вы размещаете DNS своих доменов в другом месте, вам следует создать соответствующие записи A там.

Дополнительные ссылки

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

  • Настройка виртуальных хостов в Apache
  • Настройка виртуальных хостов на Nginx
  • Настройка нескольких SSL-сертификатов на одном IP-адресе с помощью Nginx

Шаг 1 — Установка Apache и PHP5-FPM

В дополнение к Apache и PHP-FPM мы также должны установить модуль PHP FastCGI Apache. Это libapache2-mod-fastcgi, доступный в репозитории multiverse Ubuntu, который необходимо сначала включить в файле sources.list.

sudo nano /etc/apt/sources.list

Найдите следующие строки и раскомментируйте их, удалив символ решетки (#) в начале.

# deb http://mirrors.linux-console.net/ubuntu trusty multiverse

 . . .

# deb http://mirrors.linux-console.net/ubuntu trusty-updates multiverse

Это должно оставить вас с тем, что показано ниже.

 deb http://mirrors.linux-console.net/ubuntu trusty multiverse

 . . .

 deb http://mirrors.linux-console.net/ubuntu trusty-updates multiverse

Сохраните файл и обновите репозиторий apt.

sudo apt-get update

Затем установите необходимые пакеты.

sudo apt-get install apache2 libapache2-mod-fastcgi php5-fpm

Шаг 2 — Настройка Apache и PHP5-FPM

На этом шаге мы изменим номер порта Apache на 8080 и настроим его для работы с PHP5-FPM с помощью модуля mod_fastcgi. Отредактируйте файл конфигурации Apache и измените номер порта Apache.

sudo nano /etc/apache2/ports.conf

Найдите следующую строку:

Listen 80

Измените его на:

Listen 8080

Сохраните и закройте ports.conf.

Примечание. Веб-серверы обычно настроены на прослушивание 127.0.0.1:8080 при настройке обратного прокси-сервера, но это приведет к установке значения переменной среды PHP SERVER_ADDR на петлевой IP-адрес вместо общедоступного IP-адреса сервера. . Наша цель — настроить Apache таким образом, чтобы его сайты не видели перед собой обратный прокси. Итак, мы настроим его для прослушивания 8080 на всех IP-адресах.

Далее мы отредактируем файл виртуального хоста Apache по умолчанию. Директива в этом файле настроена на обслуживание сайтов только через порт 80.

sudo nano /etc/apache2/sites-available/000-default.conf

Первая строка должна быть:

<VirtualHost *:80>

Измените его на:

<VirtualHost *:8080>

Сохраните файл и перезагрузите Apache.

sudo service apache2 reload

Убедитесь, что Apache теперь прослушивает 8080.

sudo netstat -tlpn

Вывод должен выглядеть следующим образом: apache2 прослушивает :::8080.

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 — Настройка Apache для использования mod_fastcgi

Apache по умолчанию работает с mod_php, но для работы с PHP5-FPM требуется дополнительная настройка.

Примечание. Если вы пытаетесь выполнить это руководство на существующей установке LAMP с mod_php, сначала отключите ее с помощью:

sudo a2dismod php5

Мы добавим блок конфигурации для mod_fastcgi, который зависит от mod_action. mod-action по умолчанию отключен, поэтому сначала нам нужно его включить.

sudo a2enmod actions

Узнайте, какая версия Apache установлена на вашем дроплете, с помощью:

sudo apache2 -v

Отредактируйте файл конфигурации fastcgi соответствующим образом. Эти директивы конфигурации передают запросы на файлы .php в UNIX-сокет PHP5-FPM.

sudo nano /etc/apache2/mods-enabled/fastcgi.conf

Добавьте следующие строки в конец . . . Блок для Apache 2.4:

 AddType application/x-httpd-fastphp5 .php
 Action application/x-httpd-fastphp5 /php5-fcgi
 Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
 FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization
 <Directory /usr/lib/cgi-bin>
  Require all granted
 </Directory>

Apache 2.2 не требует раздела , поэтому добавьте следующее:

 AddType application/x-httpd-fastphp5 .php
 Action application/x-httpd-fastphp5 /php5-fcgi
 Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi
 FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi -socket /var/run/php5-fpm.sock -pass-header Authorization

По завершении в fastcgi.conf выполните тест конфигурации.

sudo apachectl -t

Перезагрузите Apache, если отображается Syntax OK. Если вы видите предупреждение Не удалось надежно определить полное доменное имя сервера, используя 127.0.1.1. Установите директиву ServerName глобально, чтобы подавить это сообщение., это нормально. Нас это сейчас не касается.

sudo service apache2 reload

Шаг 4 — Проверка функциональности PHP

Проверьте, работает ли PHP, создав файл phpinfo() и обратившись к нему из веб-браузера.

echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php

Чтобы просмотреть файл в браузере, перейдите по адресу http://111.111.111.111:8080/info.php, используя IP-адрес вашего дроплета. Это даст вам список спецификаций конфигурации, которые использует PHP.

В верхней части страницы убедитесь, что в Server API указано FPM/FastCGI. Примерно на двух третях пути вниз по странице в разделе «Переменные PHP» будет указано, что SERVER_SOFTWARE — это Apache в Ubuntu. Это подтверждает, что mod_fastcgi активен и Apache использует PHP5-FPM для обработки файлов PHP.

Шаг 5 — Создание виртуальных хостов для Apache

Мы создадим два файла виртуальных хостов Apache для доменов foobar.net и test.io. Это начинается с создания корневых каталогов документов для обоих сайтов.

sudo mkdir -v /var/www/{foobar.net,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

Затем файл 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 *:*>
	ServerName foobar.net
	ServerAlias www.foobar.net
	DocumentRoot /var/www/foobar.net
	<Directory /var/www/foobar.net>
		AllowOverride All
	</Directory>
</VirtualHost>

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

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

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

Примечание 2: Это только самые основные директивы. Полное руководство по настройке виртуальных хостов в Apache см. в разделе Как настроить виртуальные хосты Apache в Ubuntu 14.04 LTS.

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

sudo a2ensite foobar.net
sudo a2ensite test.io

Еще раз проверьте Apache на наличие ошибок конфигурации.

sudo apachectl -t

Перезагрузите его, если отображается Syntax OK.

sudo service apache2 reload

Чтобы убедиться, что сайты работают, откройте http://foobar.net:8080 и http://test.io: 8080 в браузере и убедитесь, что они отображают свои файлы index.html.

Тебе следует увидеть:

Также проверьте, работает ли PHP, обратившись к файлам info.php: http://foobar.net:8080/info.php и http:// test.io:8080/info.php.

Вы должны увидеть тот же список спецификаций конфигурации PHP на каждом сайте, что и на шаге 1. Теперь у нас есть два веб-сайта, размещенных на Apache с портом 8080.

Шаг 6 — Установка и настройка Nginx

На этом этапе мы установим Nginx и настроим домены example.com и sample.org в качестве виртуальных хостов Nginx. Полное руководство по настройке виртуальных хостов в Nginx см. в разделе Как настроить серверные блоки Nginx (виртуальные хосты) в Ubuntu 14.04 LTS.

Установите Нгинкс.

sudo apt-get install nginx

Затем удалите символическую ссылку виртуального хоста по умолчанию.

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

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

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

Как и в случае с виртуальными хостами Apache, мы снова создадим файлы 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

Nginx вызывает server {. . .} области конфигурационного файла серверных блоков. Создайте блок сервера для основного виртуального хоста example.com. Директива конфигурации default_server делает его виртуальным хостом по умолчанию, который обрабатывает HTTP-запросы, не соответствующие никакому другому виртуальному хосту.

Вставьте следующее в файл для example.com:

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$ {
		try_files $uri =404;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
	}
}

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

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

Блок сервера для 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$ {
		try_files $uri =404;
		fastcgi_pass unix:/var/run/php5-fpm.sock;
		fastcgi_index index.php;
		include fastcgi_params;
	}
}

Сохраните и закройте файл. Затем включите оба сайта, создав символические ссылки на каталог sites-enabled.

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 service nginx configtest

Затем перезагрузите Nginx, если отображается OK.

sudo service nginx reload

Теперь откройте файл phpinfo() ваших виртуальных хостов Nginx в веб-браузере по адресу http://example.com/info.php и http://sample.org/info.php. Посмотрите еще раз в разделе «Переменные PHP».

[\SERVER_SOFTWARE] должен указывать nginx, что указывает на то, что файлы были напрямую обслуживаются Nginx. [\DOCUMENT_ROOT] должен указывать на каталог, который вы создали ранее на этом шаге для каждого сайта Nginx.

На данный момент мы установили Nginx и создали два виртуальных хоста. Далее мы настроим дополнительный виртуальный хост для прокси-запросов, предназначенных для доменов, размещенных на Apache.

Шаг 7 — Настройка Nginx для виртуальных хостов Apache

В этом разделе мы создадим дополнительный виртуальный хост Nginx с несколькими доменными именами в директивах server_name. Запросы на эти доменные имена будут проксироваться в Apache.

Создайте новый файл виртуального хоста Nginx:

sudo nano /etc/nginx/sites-available/apache

Добавьте блок кода ниже. Это указывает имена обоих доменов виртуальных хостов Apache и проксирует их запросы к Apache. Не забудьте использовать общедоступный IP-адрес в proxy_pass.

server {
	listen 80;
	server_name foobar.net www.foobar.net test.io www.test.io;

	location / {
		proxy_pass http://111.111.111.111: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 service nginx configtest

Перезагрузите Nginx, если отображается OK.

sudo service nginx reload

Откройте браузер и войдите в http://foobar.net/info.php на одном из доменных имен Apache. Прокрутите вниз до раздела «Переменные PHP» и проверьте отображаемые значения.

Переменные SERVER_SOFTWARE и DOCUMENT_ROOT должны подтвердить, что этот запрос был обработан Apache. Переменные HTTP_X_REAL_IP и HTTP_X_FORWARDED_FOR были добавлены Nginx и должны показывать общедоступный IP-адрес компьютера, с которого вы получаете доступ к URL-адресу в своем браузере.

Мы успешно настроили Nginx для прокси-запросов для определенных доменов к Apache. Следующим шагом является настройка Apache для установки переменных REMOTE_ADDR, как если бы он обрабатывал эти запросы напрямую.

Шаг 8 — Установка и настройка mod_rpaf

На этом шаге мы установим модуль Apache с именем mod_rpaf, который перезаписывает значения REMOTE_ADDR, HTTPS и HTTP_PORT на основе значений, предоставленных обратным прокси-сервером. Без этого модуля некоторым PHP-приложениям потребовались бы изменения кода для бесперебойной работы из-за прокси-сервера. Этот модуль присутствует в репозитории Ubuntu как libapache2-mod-rpaf, но он устарел и не поддерживает определенные директивы конфигурации. Вместо этого мы установим его из исходного кода.

Установите пакеты, необходимые для компиляции и сборки модуля:

sudo apt-get install unzip build-essential apache2-threaded-dev

Загрузите последнюю стабильную версию с GitHub.

wget https://github.com/gnif/mod_rpaf/archive/stable.zip

Извлеките его с помощью:

unzip stable.zip

Перейдите в рабочий каталог.

cd mod_rpaf-stable

Затем скомпилируйте и установите модуль.

sudo 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

Добавьте следующий блок кода, обязательно добавив IP-адрес вашей капли.

<IfModule mod_rpaf.c>
        RPAF_Enable             On
        RPAF_Header             X-Real-Ip
        RPAF_ProxyIPs           111.111.111.111
        RPAF_SetHostName        On
        RPAF_SetHTTPS           On
        RPAF_SetPort            On
</IfModule>

Вот краткое описание каждой директивы. Дополнительные сведения см. в файле README mod_rpaf.

  • RPAF_Header — заголовок, используемый для реального IP-адреса клиента.
  • RPAF_ProxyIPs – IP-адрес прокси-сервера, для которого корректируются HTTP-запросы.
  • 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, если возвращается Syntax OK.

sudo service apache2 reload

Зайдите на страницу phpinfo() одного из веб-сайтов Apache в своем браузере и проверьте раздел «Переменные PHP». Переменная REMOTE_ADDR теперь также будет общедоступным IP-адресом вашего локального компьютера.

Шаг 9 — Настройка веб-сайтов HTTPS (необязательно)

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

Создайте каталог для SSL-сертификатов и их закрытых ключей.

sudo mkdir /etc/nginx/ssl

В этой статье мы будем использовать самоподписанные SSL-сертификаты со сроком действия 10 лет. Создайте самоподписанные сертификаты для foobar.net и test.io.

sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/foobar.net-key.pem -out /etc/nginx/ssl/foobar.net-cert.pem -days 3650 -nodes
sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/test.io-key.pem -out /etc/nginx/ssl/test.io-cert.pem -days 3650 -nodes

Каждый раз вам будет предложено ввести идентификационные данные сертификата.

Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:DigitalOcean Inc
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:

Теперь откройте файл виртуального хоста apache, который передает запросы от Nginx к Apache.

sudo nano /etc/nginx/sites-available/apache

Поскольку у нас есть отдельные сертификаты и ключи для каждого домена, нам нужно иметь отдельный server { . . . блоков для каждого домена. Вы должны удалить его текущее содержимое, и когда вы закончите, ваш виртуальный файл apache должен выглядеть примерно так, как показано ниже.

server {
	listen 80;
	listen 443 ssl;
	server_name test.io www.test.io;

	ssl on;
	ssl_certificate /etc/nginx/ssl/test.io-cert.pem;
	ssl_certificate_key /etc/nginx/ssl/test.io-key.pem;

	location / {
		proxy_pass http://111.111.111.111: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;
	listen 443 ssl;
	server_name foobar.net www.foobar.net;

	ssl on;
	ssl_certificate /etc/nginx/ssl/foobar.net-cert.pem;
	ssl_certificate_key /etc/nginx/ssl/foobar.net-key.pem;

	location / {
		proxy_pass http://111.111.111.111: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 service nginx configtest

Перезагрузите Nginx, если тест прошел успешно.

sudo service nginx reload

Получите доступ к одному из доменов Apache через браузер с префиксом https://: https://foobar.net/info.php

Посмотрите в разделе «Переменные PHP». Переменная SERVER_PORT имеет значение 443, а HTTPS включен, как если бы доступ к Apache осуществлялся напрямую через HTTPS. При установке этих переменных PHP-приложения не нужно специально настраивать для работы за обратным прокси-сервером.

Шаг 10 — Блокировка прямого доступа к Apache (необязательно)

Поскольку Apache прослушивает порт 8080 общедоступного IP-адреса, он доступен всем. Его можно заблокировать, выполнив следующую команду IPtables в наборе правил брандмауэра.

sudo iptables -I INPUT -p tcp --dport 8080 ! -s 111.111.111.111 -j REJECT --reject-with tcp-reset

Обязательно используйте IP-адрес вашей капли вместо примера, выделенного красным. Как только порт 8080 заблокирован в вашем брандмауэре, проверьте, что Apache недоступен на нем. Откройте веб-браузер и попробуйте получить доступ к одному из доменных имен Apache через порт 8080. Например: http://example.com:8080

Браузер должен отображать сообщение об ошибке «Невозможно подключиться» или «Веб-страница недоступна». С опцией tcp-reset в IPtables посторонний человек не увидит разницы между портом 8080 и портом, на котором нет службы.

Примечание. По умолчанию правила IPtables не сохраняются после перезагрузки системы. Существует несколько способов сохранить правила IPtables, но самый простой — использовать iptables-persistent в репозитории Ubuntu.

Шаг 11 — Обслуживание статических файлов с помощью Nginx (необязательно)

Когда Nginx проксирует запросы для доменов Apache, он отправляет каждый файловый запрос к домену в Apache. Nginx быстрее, чем Apache, обслуживает статические файлы, такие как изображения, JavaScript и таблицы стилей. Итак, в этом разделе мы настроим файл виртуального хоста Nginx apache для прямого обслуживания статических файлов и просто отправки PHP-запросов в Apache.

Откройте файл виртуального хоста apache.

sudo nano /etc/nginx/sites-available/apache

Добавьте два дополнительных блока location в каждый блок сервера, как показано красным в блоке кода ниже.

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://111.111.111.111: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 ~ /\. {
		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://111.111.111.111: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 ~ /\. {
		deny all;
	}
}

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

Сохраните файл и выполните тест конфигурации.

sudo service nginx configtest

Перезагрузите Nginx, если тест прошел успешно.

sudo service nginx reload

Чтобы убедиться, что это работает, вы можете просмотреть файлы журналов Apache в /var/log/apache2 и просмотреть запросы GET для файлов index.php из test. io и foobar.net. Единственное предостережение этой настройки заключается в том, что Apache не сможет ограничить доступ к статическим файлам. Контроль доступа к статическим файлам необходимо настроить в файле виртуального хоста Nginx apache.

Предупреждение: Очень важно включить директиву location ~ /\.. Это не позволяет Nginx печатать содержимое таких файлов, как .htaccess и .htpasswd.

Заключение

После завершения этого руководства у вас должна быть одна капля Ubuntu с Nginx, обслуживающая example.com и sample.org, а также Apache, обслуживающая foobar.net и test.io. Хотя Nginx выступает в качестве обратного прокси-сервера для Apache, прокси-служба Nginx является прозрачной, и кажется, что соединения с доменами Apache обслуживаются непосредственно из самого Apache.