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

Как настроить Nginx в качестве веб-сервера и обратного прокси-сервера для Apache на одном сервере Ubuntu 16.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 16.04.
  • Стандартная учетная запись пользователя с правами sudo. Вы можете настроить стандартную учетную запись, выполнив шаги 2 и 3 начальной настройки сервера с Ubuntu 16.04.
  • Имена доменов должны указывать на IP-адрес вашего дроплета в панели управления DigitalOcean. См. Шаг 3 в разделе «Как настроить имя хоста с помощью DigitalOcean» для примера того, как это сделать. Если вы размещаете DNS своих доменов в другом месте, вам следует создать соответствующие записи A там.

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

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

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

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

В дополнение к Apache и PHP-FPM мы также должны установить модуль PHP FastCGI Apache, который называется libapache2-mod-fastcgi.

Сначала обновите репозиторий apt, чтобы убедиться, что у вас установлены последние пакеты.

  1. sudo apt-get update

Далее устанавливаем необходимые пакеты:

  1. sudo apt-get install apache2 libapache2-mod-fastcgi php-fpm

Далее давайте изменим конфигурацию Apache по умолчанию.

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

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

  1. 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, поэтому нам придется изменить и это. Откройте файл виртуального хоста по умолчанию.

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

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

<VirtualHost *:80>

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

<VirtualHost *:8080>

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

  1. sudo systemctl reload apache2

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

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

Убедившись, что Apache прослушивает правильный порт, вы можете настроить поддержку PHP и FastCGI.

Шаг 3 — Настройка Apache для использования mod_fastcgi

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

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

  1. sudo a2dismod php7.0

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

  1. sudo a2enmod actions

Эти директивы конфигурации передают запросы на файлы .php в сокет PHP-FPM UNIX.

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

Добавьте следующие строки в . . . под существующими элементами в этом блоке:

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

Сохраните изменения, внесенные в fastcgi.conf, и выполните тест конфигурации.

  1. sudo apachectl -t

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

  1. sudo systemctl reload apache2

Теперь давайте убедимся, что мы можем обслуживать PHP из Apache.

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

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

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

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

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

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

Давайте создадим файлы виртуального хоста Apache для доменов foobar.net и test.io. Для этого мы сначала создадим корневые каталоги документов для обоих сайтов и поместим в эти каталоги несколько файлов по умолчанию, чтобы мы могли легко протестировать нашу конфигурацию.

Сначала создайте корневые каталоги:

  1. sudo mkdir -v /var/www/{foobar.net,test.io}

Затем создайте файл index для каждого сайта.

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

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

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

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

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

Поместите следующую директиву в этот новый файл:

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

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

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

Сохраните и закройте файл. Затем создайте аналогичную конфигурацию для test.io.

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

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

  1. sudo a2ensite foobar.net
  1. sudo a2ensite test.io

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

  1. sudo apachectl -t

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

  1. sudo systemctl reload apache2

Чтобы убедиться, что сайты работают, откройте 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 на каждом сайте, что и на шаге 4. Теперь у нас есть два веб-сайта, размещенных на Apache с портом 8080.

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

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

Установите Nginx с помощью менеджера пакетов.

  1. sudo apt-get install nginx

Затем удалите символическую ссылку виртуального хоста по умолчанию, поскольку мы больше не будем ее использовать. Позже мы создадим собственный сайт по умолчанию (example.com).

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

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

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

Как и в случае с виртуальными хостами Apache, мы снова создадим файлы index и phpinfo() для тестирования после завершения установки.

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

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

  1. 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$ {
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

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

  1. 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$ {
        fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        include snippets/fastcgi-php.conf;
    }
}

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

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

Проведите тест конфигурации Nginx:

  1. sudo nginx -t

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

  1. sudo systemctl reload nginx

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

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

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

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

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

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

  1. 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://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

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

  1. sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache

Проведите тест конфигурации:

  1. sudo nginx -t

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

  1. sudo systemctl reload nginx

Откройте браузер и перейдите по URL-адресу http://foobar.net/info.php в своем браузере. Прокрутите вниз до раздела «Переменные 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, но он устарел и не поддерживает определенные директивы конфигурации. Вместо этого мы установим его из исходного кода.

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

  1. sudo apt-get install unzip build-essential apache2-dev

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

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

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

  1. unzip stable.zip

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

  1. cd mod_rpaf-stable

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

  1. make
  1. sudo make install

Создайте файл в каталоге mods-available, который загружает модуль rpaf.

  1. sudo nano /etc/apache2/mods-available/rpaf.load

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

LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so

Создайте еще один файл в этом каталоге. Он будет содержать директивы конфигурации.

  1. sudo nano /etc/apache2/mods-available/rpaf.conf

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

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

Вот краткое описание каждой директивы. Дополнительные сведения см. в файле 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 и включите модуль.

  1. sudo a2enmod rpaf

Это создает символические ссылки на файлы rpaf.load и rpaf.conf в каталоге mods-enabled. Теперь проведите тест конфигурации.

  1. sudo apachectl -t

Перезагрузите Apache, если возвращается Syntax OK.

  1. sudo systemctl reload apache2

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

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

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

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

  1. sudo mkdir /etc/nginx/ssl

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

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

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

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) []:foobar.net
Email Address []:

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

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

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

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://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    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://your_server_ip:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

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

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

  1. sudo nginx -t

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

  1. sudo systemctl reload nginx

Теперь войдите в один из доменов Apache в своем браузере, используя префикс https://. Сначала посетите https://foobar.net/info.php, и вы увидите следующее:

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

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

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

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

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

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

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

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

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

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

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

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

Вам нужно будет добавить два дополнительных блока местоположений к каждому серверному блоку и изменить существующие блоки местоположений. (Если у вас есть только один серверный блок из предыдущего шага, вы можете полностью заменить содержимое вашего файла, чтобы оно соответствовало содержимому, показанному ниже.) Кроме того, вам нужно указать Nginx, где найти статические файлы для каждого сайта. . Эти изменения показаны красным цветом в следующем коде:

server {
    listen 80;
    server_name test.io www.test.io;
    root /var/www/test.io;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_ip_address:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\. {
        deny all;
    }
}

server {
    listen 80;
    server_name foobar.net www.foobar.net;
    root /var/www/foobar.net;
    index index.php index.htm index.html;

    location / {
        try_files $uri $uri/ /index.php;
    }

    location ~ \.php$ {
        proxy_pass http://your_ip_address:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location ~ /\. {
        deny all;
    }
}

Если вы также хотите, чтобы HTTPS был доступен, сохраните строку listen 443 ssl; и другие настройки SSL из шага 9.

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

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

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

  1. sudo nginx -t

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

  1. sudo service nginx reload

Чтобы убедиться, что это работает, вы можете изучить файлы журналов Apache в /var/log/apache2 и просмотреть запросы GET для файлов info.php test. io и foobar.net. Используйте команду tail, чтобы просмотреть несколько последних строк файла, и используйте переключатель -f, чтобы просмотреть файл на наличие изменений.

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

Посетите http://test.io/info.php в своем браузере и посмотрите на вывод журнала. Вы увидите, что Apache действительно отвечает:

 test.io:80 your_server_ip - - [01/Jul/2016:18:18:34 -0400] "GET /info.php HTTP/1.0" 200 20414 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36"

Затем посетите страницу index.html для каждого сайта, и вы не увидите никаких записей журнала от Apache. Их обслуживает Nginx.

Когда вы закончите просмотр файла журнала, нажмите CTRL+C, чтобы остановить его.

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

Заключение

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