Установка Apache как обратного прокси с помощью mod_proxy

 Вступление

Apache – надежный и проверенный HTTP-сервер, имеющий доступ к очень широкому диапазону мощных расширений. Конечно, данный сервер может показаться не совсем подходящим вариантом обратного прокси (reverse proxy); но многие системные администраторы, зависящие от широкого инструментария и набора функций Apache, часто используют его в качестве шлюза для сервера приложений. Как правило, это приводит к необходимости удалить дополнительный уровень из настроек сервера или использовать еще один инструмент для  перенаправления соединений.

В данной статье речь пойдет об установке и настройке Apache на Ubuntu 13 и об использовании данного сервера в качестве обратного (или инвертированного) прокси, который будет принимать входящие соединения и перенаправлять их на сервер приложений, запущенный в той же сети. Для этого будут использоваться расширения mod_proxy и некоторые другие модули Apache.

Apache

Согласно некоторым источникам, Apache получил свое название потому, что он основан на патчах (patch), то есть, это своего рода набор патчей приложений (или модулей).

HTTP-сервер Apache, вероятно, самый известный и популярный веб-сервер из всех существующих. Apache можно без труда запустить на различных платформах и установках. Приложение поставляется со множеством сторонних модулей для обработки различного рода задач (mod_rewrite, например, нужен для перезаписи URL на основе правил), среди которых и пока что не очень популярный mod_proxy – модуль Apache для установки прокси (или шлюза) для внутренних серверов.

Установка Apache как обратного прокси

mod_proxy – это модуль Apache для перенаправления соединений (то есть, шлюз, пропускающий их). Он доступен для использования так же, как любой другой стандартный модуль или базовая конфигурация. В целом, mod_proxy – это не один модуль, а набор модулей, каждый из которых обладает особенными функциональными возможностями.

Некоторые из этих модулей:

  • mod_proxy: основной прокси-модуль Apache, который управляет соединениями и перенаправляет их.
  • mod_proxy_http: функции прокси-сервера для протоколов HTTP и HTTPS.
  • mod_proxy_ftp: функции прокси-сервера для протокола FTP.
  • mod_proxy_connect: тунеллирование SSL.
  • mod_proxy_ajp: взаимодействие с протоколом AJP.
  • mod_proxy_wstunnel: работа с веб-сокетами (например, WS и WSS).
  • mod_proxy_balancer: кластеризация и балансировка нагрузки.
  • mod_cache: кэширование.
  • mod_headers: управление заголовками HTTP.
  • mod_deflate: сжатие.

Примечание: чтобы получить дополнительную информацию о mod_proxy и Apache, читайте официальную документацию Apache.

Установка Apache и mod_proxy

Примечание: нижеприведенные инструкции по установке Apache сокращены, поскольку подразумевается, что пользователь уже установил Apache или знает, как это сделать. Тем не менее, следуя этим инструкциям, можно установить Apache на Ubuntu VPS в считанные минуты.

Обновление операционной системы

Для начала нужно подготовить виртуальный сервер. Обновите компоненты системы по умолчанию, чтобы обеспечить использование их последних версий.

Итак, сначала необходимо обновить список исходных кодов программного обеспечения, а затем – устаревшие версии приложений:

aptitude    update
aptitude -y upgrade

Установка инструментов build-essential

Затем нужно установить основной пакет для сборки приложений под названием the build-essential. Данный пакет содержит инструменты, необходимые для установки приложений из исходного кода.

Чтобы установить build-essential, выполните команду:

aptitude install -y build-essential

Установка модулей и зависимостей

Теперь необходимо установить модули и зависимости. Для этого запустите команду:

aptitude install -y libapache2-mod-proxy-html libxml2-dev

Настройка прокси-сервера Apache

Активация модулей

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

Сначала нужно убедиться в том, что все модули установлены верно и готовы к работе.

Запустите следующую команду, которая выведет список доступных модулей Apache:

a2enmod
# Будет выведен подобный результат:
# Your choices are: access_compat actions alias allowmethods asis auth_basic auth_digest auth_form authn_anon authn_core authn_dbd authn_dbm authn_file authn_socache authnz_ldap authz_core authz_dbd authz_dbm authz_groupfile authz_host authz_owner authz_user autoindex buffer cache cache_disk cache_socache cgi cgid charset_lite data dav dav_fs dav_lock dbd deflate dialup dir dump_io echo env expires ext_filter file_cache filter headers heartbeat heartmonitor include info lbmethod_bybusyness lbmethod_byrequests lbmethod_bytraffic lbmethod_heartbeat ldap log_debug log_forensic lua macro mime mime_magic mpm_event mpm_itk mpm_prefork mpm_worker negotiation proxy proxy_ajp proxy_balancer proxy_connect proxy_express proxy_fcgi proxy_fdpass proxy_ftp proxy_html proxy_http proxy_scgi proxy_wstunnel ratelimit reflector remoteip reqtimeout request rewrite sed session session_cookie session_crypto session_dbd setenvif slotmem_plain slotmem_shm socache_dbm socache_memcache socache_shmcb speling ssl status substitute suexec unique_id userdir usertrack vhost_alias xml2enc
# Which module(s) do you want to enable (wildcards ok)?

Выбрав необходимые модули, передайте нижеприведенную строку, перечисляющую имена этих модулей:

proxy proxy_ajp proxy_http rewrite deflate headers proxy_balancer proxy_connect proxy_html

Также можно выполнить следующие команды, чтобы активировать модули по одному:

a2enmod proxy
a2enmod proxy_http
a2enmod proxy_ajp
a2enmod rewrite
a2enmod deflate
a2enmod headers
a2enmod proxy_balancer
a2enmod proxy_connect
a2enmod proxy_html

Примечание: некоторые модули, скорее всего, активированы по умолчанию.  Повторная их активация просто гарантирует то, что они являются активными.

Изменение настроек по умолчанию

На данном этапе необходимо отредактировать конфигурационный файл по умолчанию (000-default.conf, расположенный в /etc/apache2/sites-enabled), чтобы настроить функции проксирования.

Чтобы отредактировать конфигурационный файл Apache с помощью nano:

nano /etc/apache2/sites-enabled/000-default.conf

Теперь нужно использовать модули mod_virtualhost и mod_proxy, чтобы задать прокси.

Скопируйте и вставьте приведенный ниже блок кода, внеся в него необходимые поправки:

<VirtualHost *:*>
ProxyPreserveHost On
# Servers to proxy the connection, or;
# List of application servers:
# Usage:
# ProxyPass / http://[IP Addr.]:[port]/
# ProxyPassReverse / http://[IP Addr.]:[port]/
# Example:
ProxyPass / http://0.0.0.0:8080/
ProxyPassReverse / http://0.0.0.0:8080/
ServerName localhost
</VirtualHost>

Нажмите CTRL+X, чтобы сохранить изменения и закрыть файл, а затем Y для подтверждения.

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

Активация балансировки нагрузки

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

Отредактируйте настройки виртуального хоста (как в предыдущем разделе), используя следующие конфигурации:

<Proxy balancer://mycluster>
# Define back-end servers:
# Server 1
BalancerMember http://0.0.0.0:8080/
# Server 2
BalancerMember http://0.0.0.0:8081/
</Proxy>
<VirtualHost *:*>
# Apply VH settings as desired
# However, configure ProxyPass argument to
# use "mycluster" to balance the load
ProxyPass / balancer://mycluster
</VirtualHost>

Активация SSL для поддержки обратного прокси

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

Listen 443
NameVirtualHost *:443
<VirtualHost *:443>
SSLEngine On
# Set the path to SSL certificate
# Usage: SSLCertificateFile /path/to/cert.pem
SSLCertificateFile /etc/apache2/ssl/file.pem
# Servers to proxy the connection, or;
# List of application servers:
# Usage:
# ProxyPass / http://[IP Addr.]:[port]/
# ProxyPassReverse / http://[IP Addr.]:[port]/
# Example:
ProxyPass / http://0.0.0.0:8080/
ProxyPassReverse / http://0.0.0.0:8080/
# Or, balance the load:
# ProxyPass / balancer://balancer_cluster_name
</VirtualHost>

Перезапуск Apache

Внеся все необходимые конфигурации, перезагрузите облачный сервер, чтобы изменения вступили в действие.

Чтобы перезапустить Apache, выполните команду:

service apache2 restart

Готово!

Теперь Apache будет проксировать соединения на внутренние сервероы приложений.

Tags: , , , , ,

3 комментария

  • Давид says:

    Здравствуйте
    Сделал как написанно в стате, часть proxy работает нормально а вот при
    Активация балансировки нагрузки, в логах выдает

    [Fri Jul 10 01:39:58.694175 2015] [proxy:crit] [pid 3317] AH02432: Cannot find LB Method: byrequests
    [Fri Jul 10 01:39:58.694216 2015] [proxy_balancer:emerg] [pid 3317] (22)Invalid argument: AH01183: Cannot share balancer
    [Fri Jul 10 01:39:58.694265 2015] [:emerg] [pid 3317] AH00020: Configuration Failed, exiting

    вот вывод команды
    apachectl -M
    Loaded Modules:
    core_module (static)
    so_module (static)
    watchdog_module (static)
    http_module (static)
    log_config_module (static)
    logio_module (static)
    version_module (static)
    unixd_module (static)
    access_compat_module (shared)
    alias_module (shared)
    auth_basic_module (shared)
    authn_core_module (shared)
    authn_file_module (shared)
    authz_core_module (shared)
    authz_host_module (shared)
    authz_user_module (shared)
    autoindex_module (shared)
    deflate_module (shared)
    dir_module (shared)
    env_module (shared)
    filter_module (shared)
    headers_module (shared)
    mime_module (shared)
    mpm_prefork_module (shared)
    negotiation_module (shared)
    php5_module (shared)
    proxy_module (shared)
    proxy_ajp_module (shared)
    proxy_balancer_module (shared)
    proxy_connect_module (shared)
    proxy_html_module (shared)
    proxy_http_module (shared)
    rewrite_module (shared)
    setenvif_module (shared)
    slotmem_shm_module (shared)
    socache_shmcb_module (shared)
    ssl_module (shared)
    status_module (shared)
    xml2enc_module (shared)

    proxy_balancer_module (shared) модуль есть. Подскажите пожалуйста как решить задачу

    Спасибо

  • Кирилл says:

    Здравствуйте, подскажите с настройкой.
    есть сервер который смотрит наружу, и есть сервис на внутреннем сервере.

    апач настроен так:
    ProxyRequests Off
    ProxyPass /test http://192.168.0.80/
    ProxyPassReverse /test http://192.168.0.80/

    перенаправление работает. Однако сразу приходит перенаправление на http://server.domain.local/service/ , браузер клиента честно пытается найти теперь server.domain.local и соответственно не может это сделать из вне.

    Как-то можно научить апач перехватывать подобные вещи?

Добавить комментарий для Станислав Отменить ответ