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

Вступление

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.

phpinfo Server API

phpinfo PHP Variables

Убедитесь, что в верхней части страницы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.

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

foobar.net index page

test.io index page

Также проверьте, работает ли 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.

Nginx 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 и проверьте отображаемые значения.

phpinfo of Apache via Nginx

Переменные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_rpafREADME для получения дополнительной информации.

  • 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

phpinfo ssl

Посмотрите в разделе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.

Related