Вступление
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 Droplet.
-
Учетная запись стандартного пользователя с привилегиями
sudo
. Вы можете настроить стандартную учетную запись, выполнив шаги 2 и 3Initial Server Setup with Ubuntu 14.04. -
Нужные доменные имена должны указывать на IP-адрес вашего Droplet в панели управления DigitalOcean. См. Шаг 3How To Set Up a Host Name with DigitalOcean для примера того, как это сделать. Если вы размещаете DNS своих доменов в другом месте, вам следует вместо этого создать соответствующиеA records.
Дополнительные ссылки
Это руководство требует базовых знаний виртуальных хостов в Apache и Nginx, а также создания и настройки SSL-сертификатов. Для получения дополнительной информации по этим темам см. Следующие статьи.
[[step-1 -—- install-apache-and-php5-fpm]] == Шаг 1. Установка Apache и PHP5-FPM
В дополнение к Apache и PHP-FPM, мы также должны установить модуль PHP FastCGI Apache. Этоlibapache2-mod-fastcgi
, доступный в репозитории Ubuntumultiverse, который сначала необходимо включить в файлеsources.list
.
sudo nano /etc/apt/sources.list
Найдите следующие строки и раскомментируйте их, удалив хэш-символ (#
) в начале.
# deb http://mirrors.digitalocean.com/ubuntu trusty multiverse
. . .
# deb http://mirrors.digitalocean.com/ubuntu trusty-updates multiverse
Это должно оставить вас с тем, что показано ниже.
deb http://mirrors.digitalocean.com/ubuntu trusty multiverse
. . .
deb http://mirrors.digitalocean.com/ubuntu trusty-updates multiverse
Сохраните файл и обновите репозиторий apt.
sudo apt-get update
Затем установите необходимые пакеты.
sudo apt-get install apache2 libapache2-mod-fastcgi php5-fpm
[[step-2 -—- configuring-apache-and-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
.
Веб-серверыNote: обычно настроены на прослушивание127.0.0.1:8080
при настройке обратного прокси-сервера, но это приведет к установке значения переменной среды PHPSERVER_ADDR на IP-адрес обратной связи вместо общедоступного IP-адреса сервера. . Наша цель - настроить Apache таким образом, чтобы его веб-сайты не видели обратного прокси-сервера перед ним. Итак, мы настроим его для прослушивания8080
на всех IP-адресах.
Далее мы отредактируем файл виртуального хоста по умолчанию Apache. Директива<VirtualHost>
в этом файле настроена для обслуживания сайтов только на порту80
.
sudo nano /etc/apache2/sites-available/000-default.conf
Первая строка должна быть:
Измените это на:
Сохраните файл и перезагрузите 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
[[step-3 -—- configuring-apache-to-use-mod_fastcgi]] == Шаг 3 - Настройка Apache для использования mod_fastcgi
Apache по умолчанию работает сmod_php
, но для работы с PHP5-FPM требуется дополнительная настройка.
Note: Если вы пытаетесь использовать это руководство на существующей установке LAMP с
mod_php
, сначала отключите его с помощью:sudo a2dismod php5
Мы добавим блок конфигурации дляmod_fastcgi
, который зависит отmod_action
. mod-action
по умолчанию отключен, поэтому сначала нужно включить его.
sudo a2enmod actions
Узнайте, какая версия Apache установлена на вашей Droplet с помощью:
sudo apache2 -v
Отредактируйте файл конфигурацииfastcgi
соответствующим образом. Эти директивы конфигурации передают запросы на файлы.php
в сокет PHP5-FPM UNIX.
sudo nano /etc/apache2/mods-enabled/fastcgi.conf
Добавьте следующие строки в конец блока<IfModule mod_fastcgi.c> . . . </IfModule>
для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
Require all granted
Apache 2.2 не требует раздела<Directory>
, поэтому добавьте следующее:
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. Если вы видите предупреждение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.
, ничего страшного. Это не влияет на нас сейчас.
sudo service apache2 reload
[[step-4 -—- verifying-php -function]] == Шаг 4. Проверка функциональности PHP
Проверьте, работает ли PHP, создав файлphpinfo()
и открыв его из своего веб-браузера.
echo "" | sudo tee /var/www/html/info.php
Чтобы просмотреть файл в браузере, перейдите кhttp://111.111.111.111:8080/info.php
, но используя IP-адрес вашего Droplet. Это даст вам список спецификаций конфигурации, которые использует PHP.
Убедитесь, что в верхней части страницыServer API написаноFPM/FastCGI. Примерно две трети пути вниз по странице разделPHP Variables сообщит вам, чтоSERVER_SOFTWARE - это Apache в Ubuntu. Они подтверждают, чтоmod_fastcgi
активен и Apache использует PHP5-FPM для обработки файлов PHP.
[[step-5 -—- Creating-virtual-hosts-for-apache]] == Шаг 5. Создание виртуальных хостов для Apache
Мы создадим два файла виртуального хоста Apache для доменовfoobar.net
иtest.io
. Это начинается с создания каталоговdocument root для обоих сайтов.
sudo mkdir -v /var/www/{foobar.net,test.io}
Теперь мы добавим два файла в каждый каталог для тестирования после завершения установки.
Сначала мы создадим файлindex
для каждого сайта.
echo "Foo Bar
" | sudo tee /var/www/foobar.net/index.html
echo "Test IO
" | sudo tee /var/www/test.io/index.html
Затем файлphpinfo()
.
echo "" | sudo tee /var/www/foobar.net/info.php
echo "" | sudo tee /var/www/test.io/info.php
Создайте файл виртуального хоста для доменаfoobar.net
.
sudo nano /etc/apache2/sites-available/foobar.net.conf
Поместите в него следующую директиву:
ServerName foobar.net
ServerAlias www.foobar.net
DocumentRoot /var/www/foobar.net
AllowOverride All
Сохраните и закройте файл. Затем проделайте то же самое дляtest.io
.
sudo nano /etc/apache2/sites-available/test.io.conf
ServerName test.io
ServerAlias www.test.io
DocumentRoot /var/www/test.io
AllowOverride All
Note 1:AllowOverride All
включает поддержку.htaccess
.
Note 2: Это только самые основные директивы. Полное руководство по настройке виртуальных хостов в Apache см. ВHow To Set Up Apache Virtual Hosts on 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
.
[[step-6 -—- install-and-configuring-nginx]] == Шаг 6 - Установка и настройка Nginx
На этом этапе мы установим Nginx и настроим доменыexample.com
иsample.org
в качестве виртуальных хостов Nginx. Полное руководство по настройке виртуальных хостов в Nginx см. ВHow To Set Up Nginx Server Blocks (Virtual Hosts) on Ubuntu 14.04 LTS.
Установите Nginx.
sudo apt-get install nginx
Затем удалите символическую ссылку виртуального хоста по умолчанию.
sudo rm /etc/nginx/sites-enabled/default
Теперь мы создадим виртуальные хосты для Nginx. Сначала создайте каталогиdocument root для обоих сайтов:
sudo mkdir -v /usr/share/nginx/{example.com,sample.org}
Как и в случае с виртуальными хостами Apache, мы снова создадим файлыindex
иphpinfo()
для тестирования после завершения установки.
echo "Example.com
" | sudo tee /usr/share/nginx/example.com/index.html
echo "Sample.org
" | sudo tee /usr/share/nginx/sample.org/index.html
echo "" | sudo tee /usr/share/nginx/example.com/info.php
echo "" | sudo tee /usr/share/nginx/sample.org/info.php
Теперь создайте файл виртуального хоста для доменаexample.com
.
sudo nano /etc/nginx/sites-available/example.com
Nginx вызываетserver {. . .}
области файла конфигурацииserver blocks. Создайте серверный блок для основного виртуального хоста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 Variables.
[“SERVER_SOFTWARE”] должен сказатьnginx, указывая на то, что файлы напрямую обслуживались Nginx. [“DOCUMENT_ROOT”] должен указывать на каталог, который вы создали ранее на этом шаге для каждого сайта Nginx.
На данный момент мы установили Nginx и создали два виртуальных хоста. Далее мы настроим дополнительный виртуальный хост для запросов прокси, предназначенных для доменов, размещенных на Apache.
[[step-7 -—- configuring-nginx-for-apache-39-s-virtual-hosts]] == Шаг 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 Variables и проверьте отображаемые значения.
ПеременныеSERVER_SOFTWARE иDOCUMENT_ROOT должны подтверждать, что этот запрос был обработан Apache. ПеременныеHTTP_X_REAL_IP иHTTP_X_FORWARDED_FOR были добавлены Nginx и должны отображать общедоступный IP-адрес компьютера, с которого вы получаете доступ к URL-адресу в браузере.
Мы успешно настроили Nginx для прокси-запросов для определенных доменов к Apache. Следующим шагом является настройка Apache для установки переменныхREMOTE_ADDR
, как если бы он обрабатывал эти запросы напрямую.
[[step-8 -—- install-and-configuring-mod_rpaf]] == Шаг 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-адрес вашей капли.
RPAF_Enable On
RPAF_Header X-Real-Ip
RPAF_ProxyIPs 111.111.111.111
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
Вот краткое описание каждой директивы. См. Файлmod_rpaf
README для получения дополнительной информации.
-
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
Если возвращаетсяSyntax OK, перезагрузите Apache.
sudo service apache2 reload
Откройте страницуphpinfo()
одного из веб-сайтов Apache в своем браузере и проверьте разделPHP Variables. ПеременнаяREMOTE_ADDR теперь также будет соответствовать общедоступному IP-адресу вашего локального компьютера.
[[step-9 -—- setting-up-https-sites-optional]] == Шаг 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 { . . . }
для каждого домена. Вы должны удалить его текущее содержимое, и когда закончите, ваш файл vhostapache
должен выглядеть примерно так, как показано ниже.
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 Variables. ПеременнаяSERVER_PORT была установлена на443, аHTTPS установлена наon, как если бы доступ к Apache осуществлялся напрямую через HTTPS. С этими установленными переменными приложениям PHP не нужно специально настраивать работу за обратным прокси-сервером.
[[step-10 -—- blocking-direct-access-to-apache-optional]] == Шаг 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-адрес вашего Droplet вместо примера красным. Как только порт8080
заблокирован вашим брандмауэром, проверьте, что Apache недоступен на нем. Откройте свой веб-браузер и попробуйте получить доступ к одному из доменных имен Apache через порт8080
. Например:http://example.com:8080
В браузере должно отображаться сообщение об ошибке «Невозможно подключиться» или «Веб-страница недоступна». При наличии параметра IPtablestcp-reset
посторонний не увидит разницы между портом8080
и портом, на котором нет службы.
ПравилаNote: IPtables по умолчанию не выдерживают перезагрузки системы. Есть несколько способов сохранить правила IPtables, но самый простой - использоватьiptables-persistent
в репозитории Ubuntu.
[[step-11 -—- serve-static-files-using-nginx-optional]] == Шаг 11 - Обслуживание статических файлов с помощью Nginx (необязательно)
Когда Nginx передает прокси-запросы на домены Apache, он отправляет каждый файловый запрос в домен Apache. Nginx быстрее, чем Apache, обслуживает статические файлы, такие как изображения, JavaScript и таблицы стилей. Итак, в этом разделе мы настроим файл виртуального хоста Nginxapache
для прямого обслуживания статических файлов и просто отправки запросов 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 искать файлы вdocument root и напрямую их обслуживать. Если файл имеет расширение.php
, запрос передается в Apache. Даже если файл не найден вdocument root, запрос передается в Apache, чтобы такие функции приложения, как постоянные ссылки, работали без проблем.
Сохраните файл и выполните тест конфигурации.
sudo service nginx configtest
Перезагрузите Nginx, если тест пройден успешно.
sudo service nginx reload
Чтобы убедиться, что это работает, вы можете проверить файлы журнала Apache в/var/log/apache2
и увидеть запросы GET для файловindex.php
дляtest.io
иfoobar.net
. Единственная оговорка этой настройки заключается в том, что Apache не сможет ограничить доступ к статическим файлам. Контроль доступа к статическим файлам необходимо настроить в файле виртуального хоста Nginxapache
.
Warning: Директиваlocation ~ /\.
очень важна для включения. Это не позволяет Nginx печатать содержимое таких файлов, как.htaccess
и.htpasswd
.
Заключение
После завершения этого руководства у вас должна быть одна капля Ubuntu с Nginx, обслуживающимexample.com
иsample.org
, а также Apache, обслуживающимfoobar.net
иtest.io
. Хотя Nginx действует как обратный прокси-сервер для Apache, прокси-служба Nginx прозрачна, и соединения с доменами Apache, по-видимому, обслуживаются непосредственно из самого Apache.