Настройка Nginx для использования в качестве веб-сервера и обратного прокси-сервера для Apache в One Ubuntu 18.04 Server

Содержание

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. Также мы настроим Apache для обслуживания приложений PHP с использованием PHP-FPM, что обеспечивает более высокую производительность по сравнению с mod_php .

Предварительные требования

Для прохождения данного обучающего руководства вам потребуется следующее:

  • Новый сервер Ubuntu 18.04, настроенный в соответствии с указаниями документа «Начальная настройка сервера с Ubuntu 18.04», с пользователем sudo non-root и брандмауэром.
  • Четыре полностью квалифицированных доменных имени, настроенных на указание на IP-адрес вашего сервера. В разделе «Шаг 3. Настройка имени хоста с DigitalOcean» показано, как можно это сделать. Если вы размещаете DNS ваших доменов в других местах, нужно создать соответствующие записи уровня A именно там.

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

Начнем с установки Apache и PHP-FPM.

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

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

Затем выполните установку пакетов Apache и PHP-FPM:

Модуль FastCGI Apache недоступен в хранилище Ubuntu, и поэтому вам следует загрузить его с kernel.org и установить с помощью команды dpkg .

Далее изменим конфигурацию Apache по умолчанию для использования PHP-FPM.

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

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

Создайте новый файл ports.conf и установите в нем порт 8080 :

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

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

Отключите виртуальный хост по умолчанию:

Затем создайте новый файл виртуального хоста, используя существующий сайт по умолчанию:

Откройте новый файл конфигурации:

Измените порт прослушивания на 8080:

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

Затем перезагрузите Apache:

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

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

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

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

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

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

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

Переименуйте существующий файл конфигурации FastCGI:

Создайте новый файл конфигурации:

Добавьте в файл следующие директивы для передачи запросов файлов .php в сокет PHP-FPM UNIX:

Сохраните изменения и проведите тест конфигурации:

Если отображается Syntax OK, перезагрузите Apache:

Если отображается предупреждение 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. , его можно игнорировать. Мы настроим имена серверов позднее.

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

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

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

Создайте файл /var/www/html/info.php , содержащий вызов функции phpinfo :

Чтобы просмотреть файл в браузере, откройте адрес http:// your_server_ip :8080/info.php . На странице появится перечень параметров конфигурации, используемых PHP. Результат будет выглядеть примерно так:

phpinfo Server API

phpinfo PHP Variables

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

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

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

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

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

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

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

Добавьте в файл следующий код для определения хоста:

Строка AllowOverride All активирует поддержку .htaccess.

Это только базовые указания. Полное руководство по по настройке виртуальных хостов в Apache можно найти в документе «Настройка виртуальных хостов Apache в Ubuntu 16.04».

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

Затем добавьте в файл конфигурацию:

Сохраните файл и выйдите из редактора.

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

Снова проверьте Apache на наличие ошибок конфигурации:

При отсутствии ошибок появится сообщение Syntax OK. Если появится любое другое сообщение, проверьте конфигурацию и повторите попытку.

Когда в конфигурации не останется ошибок, перезагрузите Apache, чтобы применить изменения:

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

Вы увидите следующие результаты:

страница индекса foobar.net

страница индекса test.io

Также попробуйте получить доступ к файлам info.php files каждого сайта, чтобы убедиться в работе PHP. Откройте адреса http:// foobar.net :8080/info.php и http:// test.io :8080/info.php в браузере.

Для каждого сайта вы увидите такой же перечень настроек PHP, что и на шаге 4.

Мы разместили два сайта на сервере Apache на порту 8080 . Теперь давайте настроим Nginx.

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

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

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

Затем удалите соединение symlink по умолчанию виртуального хоста, поскольку мы больше не будем его использовать:

Позднее мы создадим собственный сайт по умолчанию ( example.com ).

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

Мы будем хранить сайты Nginx в каталоге /usr/share/nginx , где Nginx требуется хранить их по умолчанию. Вы можете поместить их в каталог /var/www/html с сайтами Apache, но разделение поможет привязать сайты к Nginx.

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

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

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

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

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

Сохраните и закройте файл.

Затем активируйте оба сайта, создав символические ссылки на каталог sites-enabled :

Протестируйте конфигурацию Nginx и убедитесь в отсутствии проблем с конфигурацией:

При обнаружении ошибок перезагрузите Nginx:

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

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

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

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

Добавьте следующий блок кода, указывающий имена доменов виртуального хоста Apache и перенаправляющий их запросы в Apache. Обязательно используйте публичный IP-адрес в proxy_pass :

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

Протестируйте конфигурацию и убедитесь в отсутствии ошибок:

Если ошибок нет, перезагрузите Nginx:

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

phpinfo для Apache через Nginx

Переменные 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 , однако он устарел и не поддерживает некоторые директивы конфигурации. Поэтому мы установим его из источника.

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

Загрузите последний стабильный выпуск из GitHub:

Выполните извлечение загруженного файла:

Перейдите в новый каталог, содержащий файлы:

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

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

Добавьте в файл следующий код для загрузки модуля:

Сохраните файл и выйдите из редактора.

Создайте в этом каталоге другой файл с именем rpaf.conf , который будет содержать директивы конфигурации для mod_rpaf :

Добавьте следующий блок кода для настройки mod_rpaf и обязательно укажите IP-адрес своего сервера:

Здесь приведено краткое описание каждой директивы. Дополнительную информацию можно найти в файле README по модулю mod_rpaf .

  • RPAF_Header — заголовок, используемый для реального IP-адреса клиента.
  • RPAF_ProxyIPs — IP-адрес прокси-сервера для корректировки запросов HTTP.
  • RPAF_SetHostName — обновляет имя vhost так, чтобы работали параметры ServerName и ServerAlias .
  • RPAF_SetHTTPS — задает переменную среды HTTPS на основе значения, содержащегося в X-Forwarded-Proto .
  • RPAF_SetPort — задает переменную среды SERVER_PORT . Полезна для использования, когда сервер Apache находится за прокси-сервером SSL.

Сохраните rpaf.conf и активируйте модуль:

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

Если ошибок нет, перезагрузите Apache:

Откройте в браузере страницы phpinfo() по адресам http:// foobar.net /info.php и http:// test.io /info.php и проверьте раздел PHP Variables. Переменная REMOTE_ADDR также будет использоваться для публичного IP-адрса вашего локального компьютера.

Теперь настроим шифрование TLS/SSL для каждого сайта.

Шаг 9 — Настройка сайтов HTTPS с Let’s Encrypt (опционально)

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

Вначале мы разделим блоки server <. >обоих доменов так, что у каждого из них будет собственный сертификат SSL. Откройте в своем редакторе файл /etc/nginx/sites-available/apache :

Измените файл, чтобы он выглядел следующим образом, сайты foobar.net и test.io должны находиться в собственных server блоках:

Мы используем Certbot для генерирования сертификатов TLS/SSL. Плагин Nginx изменит конфигурацию Nginx и перезагрузит ее, когда это потребуется.

Прежде всего, добавьте официальное хранилище Certbot:

Нажмите ENTER в диалоге, чтобы подтвердить добавление нового хранилища. Обновите список пакетов, чтобы получить данные пакета нового хранилища:

Установите пакет Certbot’s Nginx с apt :

После установки используйте команду certbot для генерирования сертификатов для foobar.net и www.foobar.net :

Эта команда указывает Certbot, что нужно использовать плагин nginx , а параметр -d задает имена, для которых должен действовать сертификат.

Если это первый запуск certbot , вам будет предложено указать адрес эл. почты и принять условия обслуживания. После этого certbot свяжется с сервером Let’s Encrypt и отправит запрос с целью подтвердить, что вы контролируете домен, для которого запрашиваете сертификат.

Далее Certbot запросит желаемый вариант настройки HTTPS:

Выберите желаемый вариант и нажмите ENTER . Конфигурация будет обновлена, а затем будет выполнена перезагрузка Nginx для активации новых настроек.

Теперь выполните команду для второго домена:

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

phpinfo ssl

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

Теперь отключим прямой доступ к Apache.

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

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

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

Браузер должен вывести сообщение об ошибке Unable to connect (Не удается подключиться) или Webpage is not available (Страница недоступна). Если используется опция IPtables tcp-reset , сторонний наблюдатель не увидит разницы между портом 8080 и портом, где отсутствует какое-либо обслуживание.

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

Теперь настроим Nginx для обслуживания статических файлов для сайтов Apache.

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

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

Откройте в своем редакторе файл /etc/nginx/sites-available/apache :

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

Если вы решили не использовать сертификаты SSL и TLS, измените свой файл, чтобы он выглядел следующим образом:

Если вы также хотите обеспечить доступность HTTPS, используйте следующую конфигурацию:

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

Предупреждение. Директива location

/\.ht очень важна, поскольку она не дает Nginx выводить содержимое файлов конфигурации Apache с важными данными, таких как .htaccess и .htpasswd .

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

Если тест завершается успешно, перезагрузите Nginx:

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

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

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

Завершив изучение файла журнала, нажмите CTRL+C, чтобы остановить отслеживание.

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


Источник: www.digitalocean.com