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

_Автор выбрал Electronic Frontier Foundation, чтобы получить пожертвование как часть Write для DOnations программа.

Вступление

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

Серверы, имеющие адреса как IPv4, так и IPv6, могут быть настроены для обслуживания сайтов Apache по одному протоколу и сайтов Nginx - по другим, но в настоящее время это нецелесообразно, поскольку принятие IPv6 провайдерами еще не получило широкого распространения. Использование другого номера порта, например + 81 + или + 8080 + для второго веб-сервера, является другим решением, но совместное использование URL-адресов с номерами портов (например, + http: //example.com: 81 +) isn не всегда разумно или идеально.

В этом руководстве вы настроите 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, настроенный по адресу Initial Setup Server с Ubuntu 18.04, с sudo, не пользователь root и брандмауэр.

  • Четыре полных доменных имени, настроенных для указания IP-адреса вашего сервера. См. Шаг 3 в How для установки имени хоста с помощью DigitalOcean для примера как это сделать Если вы размещаете DNS своего домена в другом месте, вам следует вместо этого создать соответствующие записи А.

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

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

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

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

sudo apt update

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

sudo apt install apache2 php-fpm

Модуль FastCGI Apache недоступен в репозитории Ubuntu, поэтому загрузите его с https://kernel.org [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

Далее, давайте изменим конфигурацию 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

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

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

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

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

sudo a2dissite 000-default

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

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

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

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

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

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:>
   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

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

sudo systemctl reload apache2

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

sudo netstat -tlpn

Вывод должен выглядеть следующим образом: + 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 :::22             :::*                 LISTEN   1086/sshd

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

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

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

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

sudo a2enmod actions

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

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

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

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

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

Перезагрузите Apache, если отображается * Синтаксис OK *:

sudo systemctl reload apache2

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

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

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

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

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

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

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

изображение: https: //assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/qQcGNe8.png [API сервера phpinfo]

изображение: https: //assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/eBuDnVU.png [phpinfo PHP-переменные]

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

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

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

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

sudo mkdir -v /var/www/ /var/www/

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

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

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

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

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

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

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

/etc/apache2/sites-available/foobar.net.conf

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

Строка + AllowOverride All + включает поддержку + .htaccess +.

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

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

sudo nano /etc/apache2/sites-available/test.io.conf

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

/etc/apache2/sites-available/test.io.conf

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

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

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

sudo a2ensite
sudo a2ensite

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

sudo apachectl -t

Вы увидите * Синтаксис ОК *, если ошибок нет. Если вы видите что-то еще, просмотрите конфигурацию и попробуйте снова.

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

sudo systemctl reload apache2

Чтобы убедиться, что сайты работают, откройте + http: //: 8080 + и + http: //: 8080 + в своем браузере и убедитесь, что каждый сайт отображает свой файл * index.html *.

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

изображение: https: //assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/2y1R8Zd.png [страница индекса foobar.net]

изображение: https: //assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/wr1pzEj.png [страница индекса test.io]

Также убедитесь, что PHP работает, получив доступ к файлам * info.php * для каждого сайта. Посетите + http: //: 8080 / info.php + и + http: //: 8080 / info.php + в своем браузере.

На каждом сайте вы увидите тот же список спецификаций конфигурации PHP, который вы видели в шаге 4.

Теперь у нас есть два веб-сайта, размещенных на Apache в порту + 8080 +. Давайте настроим Nginx дальше.

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

На этом шаге мы установим Nginx и настроим домены + example.com + и + sample.org + в качестве виртуальных хостов Nginx. Полное руководство по настройке виртуальных хостов в Nginx см. По адресу https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04#step-5-%E2%. 80% 93-setting-server-blocks- (рекомендуется) [Как настроить серверные блоки Nginx (виртуальные хосты) в Ubuntu 18.04].

Установите Nginx, используя менеджер пакетов:

sudo apt install nginx

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

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

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

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

sudo mkdir -v /usr/share/nginx/ /usr/share/nginx/

Мы будем хранить веб-сайты 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//index.html
echo "<h1 style='color: red;'>Sample.org</h1>" | sudo tee /usr/share/nginx//index.html
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx//info.php
echo "<?php phpinfo(); ?>" | sudo tee /usr/share/nginx//info.php

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

sudo nano /etc/nginx/sites-available/

Nginx вызывает + server {. , .} + `области файла конфигурации * серверные блоки *. Создайте блок сервера для основного виртуального хоста `++. Директива конфигурации + default_server + делает это виртуальным хостом по умолчанию, который обрабатывает HTTP-запросы, которые не соответствуют ни одному другому виртуальному хосту.

/etc/nginx/sites-available/example.com

server {
   listen 80 default_server;

   root /usr/share/nginx/;
   index index.php index.html index.htm;

   server_name ;
   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 +:

sudo nano etc/nginx/sites-available/

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

/etc/nginx/sites-available/sample.org

server {
   root /usr/share/nginx/;
   index index.php index.html index.htm;

   server_name ;
   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 +:

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

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

sudo nginx -t

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

sudo systemctl reload nginx

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

изображение: https: //assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/1FZeLUe.png [PHP-переменные Nginx]

  • [«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 и прокси их запросы в Apache. Не забудьте использовать публичный IP-адрес в + proxy_pass +:

/ И т.д. / Nginx / сайты Недоступные / апач

server {
   listen 80;
   server_name ;

   location / {
       proxy_pass http://: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;
   }
}

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

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

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

sudo nginx -t

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

sudo systemctl reload nginx

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

изображение: https: //assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/1XQi5kl.png [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, но устарел и не поддерживает определенные директивы конфигурации. Вместо этого мы установим его из источника.

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

sudo apt install unzip build-essential apache2-dev

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

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

Извлеките загруженный файл:

unzip stable.zip

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

cd mod_rpaf-stable

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

make
sudo make install

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

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

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

/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

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

/etc/apache2/mods-available/rpaf.conf

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

Вот краткое описание каждой директивы. Смотрите файл + mod_rpaf + README для получения дополнительной информации.

  • * 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 + и включите модуль:

sudo a2enmod rpaf

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

sudo apachectl -t

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

sudo systemctl reload apache2

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

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

Шаг 9 - Настройка сайтов HTTPS с возможностью шифрования (опционально)

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

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

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

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

/ И т.д. / Nginx / сайты Недоступные / апач

   server {
       listen 80;
       server_name ;

       location / {
           proxy_pass http://: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 ;

       location / {
           proxy_pass http://: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;
       }
   }

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

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

sudo add-apt-repository ppa:certbot/certbot

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

sudo apt update

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

sudo apt install python-certbot-nginx

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

sudo certbot --nginx -d  -d

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

Если вы впервые запускаете + certbot +, вам будет предложено ввести адрес электронной почты и принять условия обслуживания. После этого + certbot + свяжется с сервером Let 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  -d

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

изображение: https: //assets.digitalocean.com/articles/nginx_apache_ubuntu_1804/KK6AmWV.png [phpinfo ssl]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/ И т.д. / Nginx / сайты Недоступные / апач

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

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

   location ~ \.php$ {
       proxy_pass http://: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 ;
   root /var/www/;
   index index.php index.htm index.html;

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

   location ~ \.php$ {
       proxy_pass http://: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 был доступен, используйте следующую конфигурацию:

/ И т.д. / Nginx / сайты Недоступные / апач

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

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

   location ~ \.php$ {
       proxy_pass http://: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//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
   include /etc/letsencrypt/options-ssl-nginx.conf;
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

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

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

   location ~ \.php$ {
       proxy_pass http://: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//fullchain.pem;
   ssl_certificate_key /etc/letsencrypt/live//privkey.pem;
   include /etc/letsencrypt/options-ssl-nginx.conf;
   ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

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

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

sudo nginx -t

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

sudo service nginx reload

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

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

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

Output     - - [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.o +. Хотя Nginx действует как обратный прокси-сервер для Apache, прокси-служба Nginx прозрачна, и соединения с доменами Apache, по-видимому, обслуживаются непосредственно из самого Apache. Вы можете использовать этот метод для обслуживания безопасных и статических сайтов.

Related