В общем, был такой таск: есть у нас локальная сетка и маршрутизатор 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>