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

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


Автор выбрал программу Write for DOnations.

Введение

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

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

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

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

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

  1. sudo apt update

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

  1. sudo apt install apache2 php-fpm

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

  1. wget https://mirrors.edge.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb
  2. sudo dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb

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

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

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

  1. sudo mv /etc/apache2/ports.conf /etc/apache2/ports.conf.default

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

  1. echo "Listen 8080" | sudo tee /etc/apache2/ports.conf

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

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

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

  1. sudo a2dissite 000-default

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

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

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

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

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

<VirtualHost *:8080>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

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

  1. sudo a2ensite 001-default

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

  1. sudo systemctl reload apache2

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

  1. sudo netstat -tlpn

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

Output
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, сначала отключите ее с помощью sudo a2dismod php7.2.

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

  1. sudo a2enmod actions

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

  1. sudo mv /etc/apache2/mods-enabled/fastcgi.conf /etc/apache2/mods-enabled/fastcgi.conf.default

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

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

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

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

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

  1. sudo apachectl -t

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

  1. sudo systemctl reload apache2

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

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

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

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

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

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

Обратите внимание, что если вы выполнили первоначальную настройку сервера в разделах «Предварительные требования», то вы, вероятно, включили брандмауэр Apache. Давайте продолжим и убедимся, что мы можем получить доступ к нашему IP-адресу через порт 8080, который в настоящее время недоступен. Мы ограничим публичный доступ к этому порту на шаге 10.

Сначала разрешите порт 8080 через брандмауэр:

  1. sudo ufw allow 8080

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

Разрешить Apache Full разрешать трафик через порты 80 и 443:

  1. sudo ufw allow "Apache Full"

Теперь проверьте состояние вашего брандмауэра:

  1. sudo ufw status

Если вы выполнили предварительные условия, вывод будет выглядеть так:

Output
To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache Full ALLOW Anywhere 8080 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache Full (v6) ALLOW Anywhere (v6) 8080 (v6) ALLOW Anywhere (v6)

Вы увидите, что порт 8080 и Apache Full разрешены вместе с любыми другими правилами брандмауэра. Теперь давайте посмотрим на нашу страницу 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 /var/www/test.io

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

  1. echo "<h1 style='color: green;'>Foo Bar</h1>" | sudo tee /var/www/foobar.net/index.html
  2. 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
  2. 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
  2. sudo a2ensite test.io

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

  1. sudo apachectl -t

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

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

  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. Давайте настроим Nginx дальше.

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

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

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

  1. sudo apt install nginx

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

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

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

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

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

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

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

  1. echo "<h1 style='color: green;'>Example.com</h1>" | sudo tee /usr/share/nginx/example.com/index.html
  2. echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx/sample.org/index.html
  3. echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx/example.com/info.php
  4. 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-запросы, не соответствующие никакому другому виртуальному хосту.

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;
    }
}

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

  1. sudo nano 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;
    }
}

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

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

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

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

  1. sudo nginx -t

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

  1. sudo systemctl reload nginx

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

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

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

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

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

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

  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:

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

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

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

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

Добавьте следующий блок кода для настройки mod_rpaf, обязательно указав 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, если ошибок нет:

  1. sudo systemctl reload apache2

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

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

Шаг 9 — Настройка веб-сайтов HTTPS с помощью Let’s Encrypt (необязательно)

На этом этапе мы настроим сертификаты TLS/SSL для обоих доменов, размещенных на Apache. Мы получим сертификаты через [Let's Encrypt](https://letsencrypt.org]. Nginx поддерживает терминацию SSL, поэтому мы можем настроить SSL без изменения файлов конфигурации Apache. Модуль mod_rpaf обеспечивает требуемую Переменные среды устанавливаются в Apache, чтобы приложения могли беспрепятственно работать за обратным прокси-сервером SSL.

Сначала мы разделим блоки server {...} обоих доменов, чтобы каждый из них мог иметь свои собственные SSL-сертификаты. Откройте файл /etc/nginx/sites-available/apache в вашем редакторе:

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

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

    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;
        }
    }

Мы будем использовать Certbot для создания наших сертификатов TLS/SSL. Его плагин Nginx позаботится о перенастройке Nginx и перезагрузке конфигурации при необходимости.

Сначала добавьте официальный репозиторий Certbot:

  1. sudo add-apt-repository ppa:certbot/certbot

Нажмите ENTER, когда будет предложено подтвердить, что вы хотите добавить новый репозиторий. Затем обновите список пакетов, чтобы получить информацию о пакете нового репозитория:

  1. sudo apt update

Затем установите пакет Certbot Nginx с помощью apt:

  1. sudo apt install python-certbot-nginx

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

  1. sudo certbot --nginx -d foobar.net -d www.foobar.net

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

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

Затем Certbot спросит, как вы хотите настроить параметры HTTPS:

Output
Please 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 перезагрузится, чтобы принять новые настройки.

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

  1. sudo certbot --nginx -d test.io -d www.test.io

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

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

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

Шаг 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.

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

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

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

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

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

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

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

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;
    }
}

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

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;
}

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

Предупреждение: директива location ~ /\.ht очень важна; это не позволяет Nginx обслуживать содержимое файлов конфигурации Apache, таких как .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 действительно отвечает:

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 не сможет ограничивать доступ к статическим файлам. Контроль доступа к статическим файлам необходимо будет настроить в файле виртуального хоста Nginx apache, но это выходит за рамки данного руководства.

Заключение

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