24 нояб. 2011 г.

Настройка 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 /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

Усё, будет проксировать.

После долгого секса с Debian выяснил, что надо еще дополнительно сделать:


sudo a2enmod proxy_connect
sudo a2enmod proxy_html
sudo a2enmod proxy_ftp