Введение
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.
Вначале обновите свой список пакетов и убедитесь, что у вас установлены последние версии пакетов.
sudo apt update
Copy
Затем выполните установку пакетов Apache и PHP-FPM:
sudo apt install apache2 php-fpm
Copy
Модуль FastCGI Apache недоступен в хранилище Ubuntu, и поэтому вам следует загрузить его с kernel.org и установить с помощью команды dpkg
.
wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
Copy
Далее изменим конфигурацию Apache по умолчанию для использования PHP-FPM.
Шаг 2 — Настройка Apache и PHP-FPM
На этом шаге мы изменим номер порта Apache на 8080
и настроим его для работы с PHP-FPM с использованием модуля mod_fastcgi
. Переименуйте файл конфигурации Apache ports.conf
:
sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default
Copy
Создайте новый файл ports.conf
и установите в нем порт 8080
:
echo "Listen 8080" | sudo tee /etc/apache2/ports.conf
Copy
Примечание. Веб-серверы обычно настраиваются на прослушивание адреса 127.0.0.1:8080
при настройке в качестве обратного прокси-сервера, однако при этом для переменной среды PHP SERVER_ADDR будет установлено значение циклического IP-адреса, а не публичного IP-адреса сервера. Наша цель — настроить сервер Apache так, чтобы сайты не видели обратный прокси-сервер перед ним. Поэтому мы настроим его для прослушивания порта 8080
на всех IP-адресах.
Далее мы создадим файл виртуального хоста для Apache. Директива <VirtualHost>
этого файла будет установлена для обслуживания только сайтов на порту 8080
.
Отключите виртуальный хост по умолчанию:
sudo a2dissite 000-default
Copy
Затем создайте новый файл виртуального хоста, используя существующий сайт по умолчанию:
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/001-default.conf
Copy
Откройте новый файл конфигурации:
sudo nano /etc/apache2/sites-available/001-default.conf
Copy
Измените порт прослушивания на 8080:
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:8080>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Сохраните файл и активируйте новый файл конфигурации:
sudo a2ensite 001-default
Copy
Затем перезагрузите Apache:
sudo systemctl reload apache2
Copy
Убедитесь, что Apache прослушивает порт 8080
:
sudo netstat -tlpn
Copy
Результат должен выглядеть как в следующем примере, где apache2
прослушивает порт 8080
:
OutputActive 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, вначале выполните отключение с помощью команды sudo a2dismod php7.2
.
Мы добавим блок конфигурации для mod_fastcgi,
зависящий от mod_action
. По умолчанию mod_action
отключен, и предварительно его нужно включить:
sudo a2enmod actions
Copy
Переименуйте существующий файл конфигурации FastCGI:
sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default
Copy
Создайте новый файл конфигурации:
sudo nano /etc/apache2/mods-enabled/fastcgi.conf
Copy
Добавьте в файл следующие директивы для передачи запросов файлов .php
в сокет PHP-FPM UNIX:/etc/apache2/mods-enabled/fastcgi.conf
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
FastCgiIpcDir /var/lib/apache2/fastcgi
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.2-fpm.sock -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
Сохраните изменения и проведите тест конфигурации:
sudo apachectl -t
Copy
Если отображается Syntax OK, перезагрузите Apache:
sudo systemctl reload apache2
Copy
Если отображается предупреждение 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
:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/html/info.php
Copy
Чтобы просмотреть файл в браузере, откройте адрес 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 для обоих сайтов и разместим в эти каталоги файлы, чтобы можно было легко протестировать нашу конфигурацию.
Вначале создайте корневые каталоги документа:
sudo mkdir -v /var/www/foobar.net /var/www/test.io
Copy
Затем создайте файл index
для каждого сайта:
echo "<h1 style='color: green;'>Foo Bar</h1>" | sudo tee /var/www/foobar.net/index.html
echo "<h1 style='color: red;'>Test IO</h1>" | sudo tee /var/www/test.io/index.html
Copy
Далее создайте файл phpinfo()
для каждого сайта, чтобы мы могли протестировать правильность конфигурации PHP.
echo "<?php phpinfo(); ?>" | sudo tee /var/www/foobar.net/info.php
echo "<?php phpinfo(); ?>" | sudo tee /var/www/test.io/info.php
Copy
Теперь создайте файл виртуального хоста для домена foobar.net
:
sudo nano /etc/apache2/sites-available/foobar.net.conf
Copy
Добавьте в файл следующий код для определения хоста:/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
. Сначала создайте файл:
sudo nano /etc/apache2/sites-available/test.io.conf
Copy
Затем добавьте в файл конфигурацию:/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
:
sudo a2ensite foobar.net
sudo a2ensite test.io
Copy
Снова проверьте Apache на наличие ошибок конфигурации:
sudo apachectl -t
Copy
При отсутствии ошибок появится сообщение Syntax OK. Если появится любое другое сообщение, проверьте конфигурацию и повторите попытку.
Когда в конфигурации не останется ошибок, перезагрузите Apache, чтобы применить изменения:
sudo systemctl reload apache2
Copy
Чтобы подтвердить работу сайтов, откройте в браузере адреса 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 с помощью диспетчера пакетов:
sudo apt install nginx
Copy
Затем удалите соединение symlink по умолчанию виртуального хоста, поскольку мы больше не будем его использовать:
sudo rm /etc/nginx/sites-enabled/default
Copy
Позднее мы создадим собственный сайт по умолчанию (example.com
).
Теперь мы создадим виртуальные хосты для Nginx, используя ту же процедуру, что использовалась для Apache. Вначале необходимо создать корневые каталоги документов для обоих сайтов:
sudo mkdir -v /usr/share/nginx/example.com /usr/share/nginx/sample.org
Copy
Мы будем хранить сайты Nginx в каталоге /usr/share/nginx
, где Nginx требуется хранить их по умолчанию. Вы можете поместить их в каталог /var/www/html
с сайтами Apache, но разделение поможет привязать сайты к Nginx.
Как и в случае с виртуальными хостами Apache, после завершения настройки следует создать файлы index
и phpinfo()
для тестирования:
echo "<h1 style='color: green;'>Example.com</h1>" | sudo tee /usr/share/nginx/example.com/index.html
echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx/sample.org/index.html
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/example.com/info.php
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/sample.org/info.php
Copy
Теперь создайте файл виртуального хоста для домена example.com
:
sudo nano /etc/nginx/sites-available/example.com
Copy
Nginx вызывает области серверных блоков файла конфигурации server {. . .}.
Создайте серверный блок для главного виртуального хоста, example.com
. Директива default_server configuration
делает его виртуальным хостом по умолчанию для обработки запросов HTTP, не соответствующих никакому другому виртуальному хосту./etc/nginx/sites-available/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.2-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
Copy
Сохраните и закройте файл. Создайте файл виртуального хоста для второго домена Nginx, sample.org
:
sudo nano etc/nginx/sites-available/sample.org
Copy
Добавьте в файл следующее:/etc/nginx/sites-available/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.2-fpm.sock;
include snippets/fastcgi-php.conf;
}
}
Copy
Сохраните и закройте файл.
Затем активируйте оба сайта, создав символические ссылки на каталог 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
Copy
Протестируйте конфигурацию Nginx и убедитесь в отсутствии проблем с конфигурацией:
sudo nginx -t
Copy
При обнаружении ошибок перезагрузите Nginx:
sudo systemctl reload nginx
Copy
Получите доступ к файлу 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:
sudo nano /etc/nginx/sites-available/apache
Copy
Добавьте следующий блок кода, указывающий имена доменов виртуального хоста Apache и перенаправляющий их запросы в Apache. Обязательно используйте публичный IP-адрес в proxy_pass
:/etc/nginx/sites-available/apache
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;
}
}
Copy
Сохраните файл и активируйте новый файл виртуального хоста, создав символическую ссылку:
sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache
Copy
Протестируйте конфигурацию и убедитесь в отсутствии ошибок:
sudo nginx -t
Copy
Если ошибок нет, перезагрузите Nginx:
sudo systemctl reload nginx
Copy
Откройте в браузере 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
, однако он устарел и не поддерживает некоторые директивы конфигурации. Поэтому мы установим его из источника.
Установите пакеты, необходимые для построения модуля:
sudo apt install unzip build-essential apache2-dev
Copy
Загрузите последний стабильный выпуск из GitHub:
wget https://github.com/gnif/mod_rpaf/archive/stable.zip
Copy
Выполните извлечение загруженного файла:
unzip stable.zip
Copy
Перейдите в новый каталог, содержащий файлы:
cd mod_rpaf-stable
Copy
Скомпилируйте и установите модуль:
make
sudo make install
Copy
Затем создайте в каталоге mods-available
файл, который будет загружать модуль rpaf
,
sudo nano /etc/apache2/mods-available/rpaf.load
Copy
Добавьте в файл следующий код для загрузки модуля:/etc/apache2/mods-available/rpaf.load
LoadModule rpaf_module /usr/lib/apache2/modules/mod_rpaf.so
Сохраните файл и выйдите из редактора.
Создайте в этом каталоге другой файл с именем rpaf.conf
, который будет содержать директивы конфигурации для mod_rpaf
:
sudo nano /etc/apache2/mods-available/rpaf.conf
Copy
Добавьте следующий блок кода для настройки mod_rpaf
и обязательно укажите IP-адрес своего сервера:/etc/apache2/mods-available/rpaf.conf
<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 — обновляет имя vhost так, чтобы работали
параметры ServerName
иServerAlias
. - RPAF_SetHTTPS — задает переменную среды
HTTPS
на основе значения, содержащегося вX-Forwarded-Proto
. - RPAF_SetPort — задает переменную среды
SERVER_PORT
. Полезна для использования, когда сервер Apache находится за прокси-сервером SSL.
Сохраните rpaf.conf
и активируйте модуль:
sudo a2enmod rpaf
Copy
При этом создаются символические ссылки файлов rpaf.load
и rpaf.conf
в каталоге mods-enabled
. Теперь протестируем конфигурацию:
sudo apachectl -t
Copy
Если ошибок нет, перезагрузите Apache:
sudo systemctl reload apache2
Copy
Откройте в браузере страницы 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
:
sudo nano /etc/nginx/sites-available/apache
Copy
Измените файл, чтобы он выглядел следующим образом, сайты foobar.net
и test.io
должны находиться в собственных server
блоках:/etc/nginx/sites-available/apache
server {
listen 80;
server_name foobar.net www.foobar.net;
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;
server_name 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;
}
}
Copy
Мы используем Certbot для генерирования сертификатов TLS/SSL. Плагин Nginx изменит конфигурацию Nginx и перезагрузит ее, когда это потребуется.
Прежде всего, добавьте официальное хранилище Certbot:
sudo add-apt-repository ppa:certbot/certbot
Copy
Нажмите ENTER
в диалоге, чтобы подтвердить добавление нового хранилища. Обновите список пакетов, чтобы получить данные пакета нового хранилища:
sudo apt update
Copy
Установите пакет Certbot’s Nginx с apt
:
sudo apt install python-certbot-nginx
Copy
После установки используйте команду certbot
для генерирования сертификатов для foobar.net
и www.foobar.net
:
sudo certbot --nginx -d foobar.net -d www.foobar.net
Copy
Эта команда указывает Certbot, что нужно использовать плагин nginx
, а параметр -d
задает имена, для которых должен действовать сертификат.
Если это первый запуск certbot
, вам будет предложено указать адрес эл. почты и принять условия обслуживания. После этого certbot
свяжется с сервером Let’s Encrypt и отправит запрос с целью подтвердить, что вы контролируете домен, для которого запрашиваете сертификат.
Далее Certbot запросит желаемый вариант настройки HTTPS:
OutputPlease choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
Выберите желаемый вариант и нажмите ENTER
. Конфигурация будет обновлена, а затем будет выполнена перезагрузка Nginx для активации новых настроек.
Теперь выполните команду для второго домена:
sudo certbot --nginx -d test.io -d www.test.io
Copy
Откройте один из доменов Apache в браузере с помощью префикса https://
; откройте https://foobar.net/info.php
, и вы увидите следующее:
Посмотрите раздел PHP Variables. Для переменной SERVER_PORT задано значение 443 и протокол HTTPS включен, как если бы осуществлялся прямой доступ к Apache через HTTPS. При такой настройке переменных не нужно специально настраивать приложения PHP для работы за обратным прокси-сервером.
Теперь отключим прямой доступ к Apache.
Шаг 10 — Блокировка прямого доступа к Apache (опционально)
Поскольку Apache прослушивает порт 8080
на публичном IP-адресе, он доступен кому угодно. Его можно заблокировать с помощью следующей команды IPtables в наборе правил брандмауэра.
sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset
Copy
Обязательно используйте 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
:
sudo nano /etc/nginx/sites-available/apache
Copy
Вам потребуется добавить два дополнительных блока location
в каждый блок server, а также изменить существующие разделы location
. Кроме того, вам нужно будет указать Nginx, где можно найти статические файлы для каждого сайта.
Если вы решили не использовать сертификаты SSL и TLS, измените свой файл, чтобы он выглядел следующим образом:/etc/nginx/sites-available/apache
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_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;
}
location ~ /\.ht {
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 ~ /\.ht {
deny all;
}
}
Copy
Если вы также хотите обеспечить доступность HTTPS, используйте следующую конфигурацию:/etc/nginx/sites-available/apache
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_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;
}
location ~ /\.ht {
deny all;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/test.io/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test.io/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
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 ~ /\.ht {
deny all;
}
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/foobar.net/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/foobar.net/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}
Copy
Директива try_files
указывает Nginx искать файлы в корне документа document root и выводить их напрямую. Если файл имеет расширение .php
, запрос перенаправляется в Apache. Даже если файл отсутствует в document root, запрос перенаправляется в Apache, чтобы функции приложения (например, постоянные ссылки) работали без проблем.
Предупреждение. Директива location ~ /\.ht
очень важна, поскольку она не дает Nginx выводить содержимое файлов конфигурации Apache с важными данными, таких как .htaccess
и .htpasswd
.
Сохраните файл и проведите тест конфигурации:
sudo nginx -t
Copy
Если тест завершается успешно, перезагрузите Nginx:
sudo service nginx reload
Copy
Чтобы убедиться, что все работает, вы можете просмотреть файлы журнала Apache в каталоге /var/log/apache2
и посмотреть запросы GET
для файлов info.php
сайтов test.io
и foobar.net
. Используйте команду tail
для просмотра последних нескольких строк файла и параметр -f
для просмотра изменений файла:
sudo tail -f /var/log/apache2/other_vhosts_access.log
Copy
Теперь откройте в браузере http://test.io/info.php
и посмотрите на результаты вывода журнала. Вы увидите ответ Apache:
Output 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 не сможет ограничивать доступ к статическим файлам. Контроль доступа к статическим файлам должен быть настроен в файле apache
виртуального хоста Nginx, однако это не входит в содержание настоящего обучающего руководства.
Заключение
Вы настроили один сервер Ubuntu, где Nginx обслуживает сайты example.com
и sample.org
, а Apache обслуживает сайты foobar.net
и test.io
. Хотя Nginx выступает в качестве обратного прокси-сервера Apache, прокси-служба Nginx невидима, и подключение к доменам Apache выглядит так, как если бы оно напрямую обслуживалось Apache. Вы можете использовать этот метод для вывода защищенных и статичных сайтов.
Свежие комментарии