Настройка mod_proxy в Apache

В общем, был такой таск: есть у нас локальная сетка и маршрутизатор Peplink. В локальной сетке на многих тазиках крутятся сайты, которые должны быть доступны извне. Как это сделать? Разносить по портам – не вариант, т. к. пользователю неудобно всё-таки набирать  URL типа блаблабла:8081. Решение – использовать HTTP-прокси, а на тазик с ним открыть в маршрутизаторе порты 80, 443. Для проксирования обычно используют nginx, но апач тоже отлично справляется с этой задачей.

Так сложилось, что тазик с прокси был Убунтой (клиент категорически н ехотел работать с другими дистрибутивами Linux), а “в Убунте всё не как у людей” (с) 🙂 потому конфигурация её несколько отличается от других дистрибутивов. Но, приняв философию Убунты, я понял, что многие решения в ней очень даже удобны, хотя некоторые мне не нравятся – например, отсутствие пользователя root. Но это уже философия, грозящая холиваром, потому перейдем к делу 🙂

В убунте манипулирование апачем происходит с помощью глобальных команд: включение/выключение виртуал хостов – a2ensite / a2dissite с одним аргументом – пути к конфигу, в котором прописан виртуал хост. Включение/выключение модов или расширений происводится командами a2enmod / a2dismod.

В общем, алгоритм работы такой:

1) Нужно включить необходимые модули апача. Устанавливаем модули:

sudo apt-get install libapache2-mod-proxy-html libapache2-mod-gnutls

Активируем модули:

sudo a2enmod proxy
sudo a2enmod ssl
sudo a2enmod cache
sudo a2enmod proxy_connect
sudo a2enmod proxy_html
sudo a2enmod proxy_ftp
sudo /etc/init.d/apache2 restart

2) Делаем конфиг виртуал хоста (по 1му файлу на 1 хост!) и помещаем его в /etc/apache2/sites-available. Пример HTTPS конфига проксирования на тазик с Confluence – это такая джавовская веб-морда для программистов и не только, работающая на Apache Tomcat (с портом 8444):

<VirtualHost *:443>
    ServerAdmin admin@mydomain.com
    DocumentRoot "/etc/httpd/docs/dummy-host.example.com"
    ServerName conf.mydomain.com
    ServerAlias www.conf.mydomain.com

    #настройки SSL - включение SSL и пути к файлам ключей
    SSLEngine On
    SSLCertificateFile /etc/ssl/server.crt
    SSLCertificateKeyFile /etc/ssl/server.key

    #включение прокси для данного виртуал хоста и некоторые настройки.
    SSLProxyEngine On
    ProxyRequests Off
    ProxyPreserveHost On
    ProxyVia full

    <proxy *>
    Order deny,allow
    Allow from all
    </proxy>

    #что и куда проксируем / означает что проксируются все запросы к сайту, начиная с корня
    ProxyPass        /  https://192.168.1.132:8444/
    ProxyPassReverse /  https://192.168.1.132:8444/

</VirtualHost>

Замечание: Не забываем создать ssl-сертификаты либо использовать готовые в папку /etc/ssl/ и выставить права (chmod 700 /etc/ssl/ и на файлы: chmod 600 /etc/ssl/server.crt и chmod 600 /etc/ssl/server.key)

Для HTTP virtual host убираются строчки, связанные с SSL и меняется порт 443 на 80, SSLProxyEngine On меняется наProxyEngine On. Ну и в директиве ProxyPass https на http – понятное дело.
Затем а ктивируем наш виртуал хост. После чего необходимо перезагрузить апач командой:

sudo a2ensite /etc/apache2/sites-available/конфиг_виртуал_хоста 
sudo /etc/init.d/apache2 reload

Для RHEL нужно установить модули:

yum install httpd mod_ssl openssh

И добавить нужные конфигурации в папку /etc/httpd/conf.d/

Для удобства все прокси для 80го порта добавим в файл /etc/httpd/conf.d/proxy-80.conf, а для 443 порта – в файл /etc/httpd/conf.d/proxy-443.conf. Где первый сайт сразу проксируется в конечную точку, а 2й сначала идёт на SSL-версию.

proxy-80.conf:

NameVirtualHost *:80
<VirtualHost *:80>
ServerName server1.example.com
ServerAlias www.server1.example.com
ServerAdmin admin@example.com
Options -Indexes

ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full

ProxyPass / http://192.168.0.10:8080/
ProxyPassReverse / http://192.168.0.10:8080/
ProxyPreserveHost On
</VirtualHost>

<VirtualHost *:80>
ServerName server2.example.com
ServerAlias www.server2.example.com
ServerAdmin admin@example.com
Redirect permanent / https://server2.example.com/
</VirtualHost>

proxy-443.conf:

# Path to certificate:
<IfModule mod_ssl.c>
SSLCertificateFile /etc/ssl/2025/server.crt
SSLCertificateKeyFile /etc/ssl/2025/server.key
SSLCertificateChainFile /etc/ssl/2025/bundle.crt
</IfModule>

<VirtualHost *:443>
ServerName webpage.example.com
ServerAlias www.webpage.example.com
ServerAdmin admin@example.com

SSLEngine On

Redirect permanent / https://website.com
</VirtualHost>

<VirtualHost *:443>
ServerName server2.example.com
ServerAlias www.server2.example.com
ServerAdmin admin@example.com
Options -Indexes

SSLEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

SSLProxyEngine On
ProxyRequests Off
ProxyPreserveHost On
ProxyVia Full

ProxyPass / https://192.168.0.11/
ProxyPassReverse / https://192.168.0.11/
ProxyPreserveHost On
</VirtualHost>

Leave a Reply

Your email address will not be published. Required fields are marked *