Как настроить 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.