Apache и Nginx - это два самых популярных и наиболее часто используемых веб-серверов с открытым исходным кодом. Оба веб-сервера имеют свои преимущества и недостатки, вы можете ознакомиться с ними более подробно в статье Nginx vs Apache. Было бы отлично объединить эти программы, чтобы получить преимущества обоих и свести к минимуму недостатки. Это вполне возможно. Для этого достаточно использовать Nginx в качестве прокси для Apache, такая практика очень распространена среди системных администраторов.
В этой статье мы рассмотрим как выполняется настройка прокси Nginx, а также поговорим как заставить эту связку правильно обрабатывать HTTPS запросы и передадим управление статическими файлами Nginx.
Содержание статьи:
Как это будет работать?
Допустим, у нас есть несколько доменов example.com, sample.org, test.io. Первые два будут обрабатываться Apache, последний только Nginx. Все запросы будут поступать к Nginx, который работает на порту 80, если это запрос к одному из доменов Apache и он требует работы PHP, тогда он будет передан веб-серверу Apache, который работает на порту 8080.
Если же это запрос статического файла, то мы будем обрабатывать его тут же с помощью Nginx для увеличения производительности. Что касается поддержки SSL, то мы собираемся использовать модуль mod_pref чтобы заменить все необходимые заголовки для нормальной работы связки. Начнем с настройки Apache.
Настройка Apache для работы прокси
Мы не будем подробно рассматривать как настроить Apache в вашей системе, все это уже описано в статье настройка Apache, сегодня же мы остановимся на настройках, необходимых для работы прокси.
Мы будем использовать Apache с интерпретатором PHP, установленным в виде модуля php-fpm. Это обеспечит лучшую общую производительность системы. Сначала установим все нужные пакеты:
sudo apt install apache2 libapache2-mod-fastcgi php-fpm
Поскольку нам нужно, чтобы Apache работал на порту 8080 нужно изменить конфигурационные файлы веб-сервера:
sudo vi /etc/apache2/ports.conf
Замените значение строки Listen с 80 на 8080, затем сохраните изменения в файле. Далее изменим порт для веб-сайта по умолчанию:
sudo vi /etc/apache2/sites-available/000-default.conf
Точно так же замените значение порта с 80 на 8080. Затем сохраните изменения и перезапустите веб-сервер:
sudo systemctl reload apache2
Теперь вы можете проверить на каком порту будет ожидать соединений Apache, если все было сделано правильно, то это будет 8080:
sudo netstat -tlpn
Чтобы показать настройку прокси Nginx более наглядно, создадим один виртуальный хост (домен). Сначала создадим каталог для нашего хоста:
sudo mkdir /var/www/test.com/
Затем файлы index.html и phpinfo.php:
echo "<h1 style='color: green;'>Test com</h1>" | sudo tee /var/www/test.com/index.html
Затем настроим файлы конфигурации виртуальных хостов для каждого из доменов:
sudo vi /etc/apache2/sites-available/test.com.conf
Обратите внимание на порт, тут тоже нужно указать 8080. Для тестирования работы php нам понадобится скрипт с вызовом функции:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/test.com/phpinfo.php
Осталось включить конфигурацию для только что созданного сайта и перезапустить веб-сервер:
sudo a2ensite test.com
sudo apachectl -t
sudo systemctl reload apache2
Настройка Apache для php-fpm
По умолчанию в Apache используется модуль mod-php для выполнения php скриптов. Сначала необходимо его отключить:
sudo a2dismod php7.0
Затем мы настроим работу mod_fastcgi с помощью модуля mod_actions, для этого нужно его активировать:
sudo a2enmod actions
Затем создадим конфигурационный файл fastcgi.conf:
sudo vi /etc/apache2/mods-available/fastcgi.conf
Сохраните изменения, активируйте модуль и проверьте конфигурацию веб-сервера:
sudo a2enmod fastcgi
sudo apachectl -t
Вы увидите сообщение, что с синтаксисом конфигурационных файлов все хорошо. Если программа выдаст сообщение Could not reliably determine the server's fully qualified domain name, using 127.0.1.1, его можно игнорировать. Далее перезапустите Apache:
sudo systemctl restart apache2
Проверка работы Apache
Добавьте свои домены в файл hosts, если они не зарегистрированы и доступны только с локальной машины:
sudo vi /etc/hosts
Затем откройте сайт в браузере, чтобы убедится, в том что все работает:
Настройка прокси Nginx
Теперь, когда Apache полностью готов к работе в качестве веб-сервера, перейдем к настройке прокси сервера Nginx, мы можем заняться настройкой самого Nginx. Как я уже сказал, мы будем перенаправлять все динамические запросы к Apache, чтобы пользователь смог получить поддержку файлов htaccess и другие преимущества, а статические файлы будем обрабатывать в Nginx.
Сначала установите Nginx, если вы этого еще не сделали:
sudo apt install nginx
Дальше создадим виртуальный хост Nginx с несколькими доменами, с помощью которого и будет выполняться проксирование Nginx:
sudo vi /etc/nginx/sites-available/apache
Для использования nginx в качестве прокси мы передаем в команде proxy_pass адрес и порт веб-сервера, а в заголовках передаем те значения, которые будут нужны Apache для правильного формирования документа. Сохраните файл и активируйте его:
sudo ln -s /etc/nginx/sites-available/apache /etc/nginx/sites-enabled/apache
Затем проверьте конфигурацию и перезапустите Nginx:
sudo nginx -t
sudo systemctl reload nginx
Теперь вы можете проверить работу вашего сайта в браузере, если вы откроете скрипт phpinfo, то увидите, что он был обработан с помощью Apache, но возвращен Nginx.
Как вы могли убедится, теперь применяется nginx в качестве прокси. Теперь можно закрыть прямой доступ к Apache из сети с помощью iptables:
sudo iptables -I INPUT -p tcp --dport 8080 ! -s your_server_ip -j REJECT --reject-with tcp-reset
Настройка правильной работы SSL
Дальше рассмотрим как выполняется настройка https прокси Nginx. Как я уже сказал, для правильной работы SSL нам понадобится модуль Apache mod_rpaf. Он устанавливает заголовки и переменные таким образом, чтобы прокси мог без проблем использовать https. Его можно установить из официальных репозиториев:
sudo apt install libapache2-mod-rpaf
Затем создайте конфигурационный файл для этого модуля:
sudo vi /etc/apache2/mods-available/rpaf.conf
Строка RPAFProxyIPs задает IP адрес вашего прокси. После завершения настройки активируйте модуль:
sudo a2enmod rpaf
Осталось перезапустить Apache:
sudo systemctl reload apache2
Дальше нам нужно создать наши сертификаты с помощью OpenSSL:
sudo mkdir /etc/nginx/ssl/
sudo openssl req -x509 -sha256 -newkey rsa:2048 -keyout /etc/nginx/ssl/test.com-key.pem -out /etc/nginx/ssl/test.com-cert.pem -days 3650 -nodes
А файл виртуальных хостов с поддержкой SSL теперь будет выглядеть во так:
sudo nano /etc/nginx/sites-available/apache
Сохраните файл конфигурации и перезапустите Nginx:
nginx -t
sudo systemctl restart nginx
Теперь вы можете открыть наш домен в браузере по HTTS и убедится что прокси отлично работает. Обратите внимание, что если вы используете самоподписанный сертификат, то вам придется добавить его в исключения браузера:
Поддержка защищенного протокола включена и SERVER_PORT имеет значение 443, все работает прозрачно, как бы проксирование nginx не осуществляется, а мы направляем запросы непосредственно к Apache.
Статические файлы через Nginx
Чтобы уменьшить нагрузку на Apache мы можем обрабатывать все статические файлы в Nginx, как правило, это очень сильно увеличивает выдерживаемую нагрузку, поскольку Nginx способен работать быстрее с большим количеством подключений и занимать меньше ресурсов.
Нам нужно добавить несколько строк в /etc/nginx/sites-available/apache:
Мы устанавливаем корень сайта в /var/www/test.com, и пытаемся отдать оттуда все статические файлы, а файлы с расширением .php будем обрабатывать в Apache. Также дополнительно мы закрываем доступ ко всем скрытым файлам.
Теперь откройте несколько раз сайт в браузере, динамические страницы phpinfo.php и статическую index.html, а затем посмотрите в лог файл, где вы обнаружите что Apache обрабатывает только динамику:
cat /var/log/apache2/other_vhosts_access.log
Теперь проксирование Nginx работает так же как и на большинстве серверов интернета.
Выводы
В этой статье мы рассмотрели как выполняется настройка прокси Nginx, а точнее, как использовать nginx как прокси для Apache. Для новичков эти настройки могут показаться сложными, но если разобраться, то все обязательно получится. Если у вас остались вопросы, спрашивайте в комментариях.
Что за глупость? Если использовать php-fpm, то зачем вообще apache? Лишняя прослойка.
Статья интересная, но она ничем не отличается от миллиона подобный. Нового - ничего.
Автору я бы посоветовал настроить прокси на через корень, а в качестве отдельной ветки. Например, у вас сейчас http://localhost ссылается на http://localhost:8080, а попробуйте настроить, чтобы http://localhost указывал на один сайт (неважно какой), а http://localhost/site2 ссылался на http://localhost:8080.
Это намного сложнее сделать.
Подскажите новичку, какой адрес вводить в браузере, чтобы увидеть тестовый сайт test.com ?
(в статье пропущена информация после строчки
"Затем откройте сайт в браузере, чтобы убедится, в том что все работает:").
P.S.
Я работаю из дома с удалённым сервером через ssh.
На сервере стоит nginx и на нём настроен web-интерфейс для Юпитер-ноутбук (настроен на "IP-АДРЕС_СЕРВЕРА/" ).
Вижу phpinfo() по адресу
IP-АДРЕС_СЕРВЕРА:8080/info.php
Нужно вводить - http://test.com, но перед этим следует добавить алиас для этого домена в /etc/hosts.