Настройка Nginx для использования в качестве веб-сервера и обратного прокси-сервера для Apache в One Ubuntu 18.04 Server
Содержание
- Предварительные требования
- Шаг 1 — Установка Apache и PHP-FPM
- Шаг 2 — Настройка Apache и PHP-FPM
- Шаг 3 — Настройка Apache для использования mod_fastcgi
- Шаг 4 — Проверка функционала PHP
- Шаг 5 — Создание виртуальных хостов для Apache
- Шаг 6 — Установка и настройка Nginx
- Шаг 7 — Настройка Nginx для виртуальных хостов Apache
- Шаг 8 — Установка и настройка mod_rpaf
- Шаг 9 — Настройка сайтов HTTPS с Let’s Encrypt (опционально)
- Шаг 10 — Блокировка прямого доступа к Apache (опционально)
- Шаг 11 — Обслуживание статических файлов с помощью Nginx (необязательно)
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. Результат будет выглядеть примерно так:
Убедитесь, что в 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.
Вы увидите следующие результаты:
Также попробуйте получить доступ к файлам 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.
[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 и проверьте отображаемые значения.
Переменные 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 , и вы увидите следующее:
Посмотрите раздел 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, однако это не входит в содержание настоящего обучающего руководства.
Источник: