Как стать автором
Обновить

directadmin + nginx и о том как их подружить

Время на прочтение4 мин
Количество просмотров1.4K
Как известно, apache хорошая штука, но его тяжеловестность, сильно ограничивает возможности.
Для решения проблемы используется связка frontend + backend. В качестве backend сервера выступает apache, а в качестве frontend сервера, любой другой легковестный. В статье мы рассмотрим связку, в которой nginx выступает в роли вронт-энд сервера.
В интернете полно статей, о том, как настроить nginx, но я не столкнулся ни с одной, как заставить работать nginx вместе с панелью управления directadmin.


Как всё было.


Задача была, но пути решения, сразуже в голову не приходили. Немного погуглив, появилось несколько вариантов решения:
1) заворачивать прослушивание 80 порта на какойто другой, а там уже слушать nginx`ом. Такое решение мне сильно не понравилось, из-за того что накладывает определенные играничения.
2) каким либо образом заставить апачу слушать другой порт (не 80), а там уже всё просто.

Если в обычной ситуации, когда у нас нету панели управления хостинингом, всё просто — идём и правим ручками конфиги аппача, то с панелью управления, так неполучится. Каждый раз после небольших изменений настроек сайта через директадмин, переписывается целиком, вся секция конфига аппачи, относящаяся к измененному сайту.

Просветление


Полазив немного по директории в которой у меня установлен directadmin, а это: /usr/local/directadmin, выяснилось, что существуют темплейты по которым создаются виртуальные хосты. Вуаля… счастью небыло границ. Оказывается всё проще чем могло быть!

Реализация


Нужно скопировать файлы из директории $DIRECTADMIN_HOME/data/templates/, относящиеся к вируальным хостам, в директорию $DIRECTADMIN_HOME/data/templates/custom.
Это делается для того, чтоыб при апдейте версии директадмина, измененные Вами темплейты, небыли затёрты стандартными.

#cd $DIRECTADMIN_HOME/data/templates/
#cp virtual_host.conf custom/virtual_host.conf
#cp virtual_host2.conf custom/virtual_host2.conf
#cp virtual_host_sub.conf custom/virtual_host_sub.conf
#cp virtual_host2_sub.conf custom/virtual_host2_sub.conf

Теперь в скопированных нами файлах, нужно поправить порт. В каждом файле, строку:
<VirtualHost |IP|:80>
заменить на:
<VirtualHost |IP|:8181>
Теперь у нас apache будет слушать виртуальные хосты на 8181 порту. А уж чтобы до него был доставлен трафик, мы позаботимся. Точнее позаботится об этом nginx.

Установка nginx


Делается это элементарно.
Можно установить его из репозиториев(но я бы не посоветовал это делать):
#apt-get install nginx
Почему не посоветовал бы устанавливать из репозиториев? Потому что выпуск новых стабильных версий, происходит очень часто, и лучше скачать новую версию с сайта разроботчика.
На момент написания статьи, последняя стабильная версия была 0.6.35, а последняя текущая версия 0.7.42, и для сравнения в репозиториях доступна версия 0.4.13.

Так, начнем установку. Процесс описываю в кратце, точнее даже сказать только в коммандах, т.к. более развернутое описание Вы без проблем найдете по следующей ссылке.

#mkdir /root/nginxsrcs && cd /root/nginxsrcs
#wget http://sysoev.ru/nginx/nginx-0.7.42.tar.gz
#tar zxf nginx-0.7.42.tar.gz
#cd nginx-0.7.42
#./configure
#make
#make install
#cd /usr/local/nginx/conf
#vim nginx.conf

Нам нужно настроить nginx в качестве кеширующего прокси сервера.
Вы спросите, почему бы не отдавать статику(картинки, JS файлы, html) без участия apache? Всё просто — nginx не умеет работать с ".htaccess" (если честно, то я этому только рад). Но Вы можете настроить как Вам удобнее.

Далее конфиг, с пометкой ключевых мест:

worker_processes 3;
pid logs/nginx.pid;
events {
worker_connections 1024;
}

http {
access_log off;
error_log off;
include mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent"';
server {
access_log off;
error_log off;
listen 1.2.3.4:80; # IP:port которые будут слушаться
server_name *.*; #нам нет никакого различия на какой вирт-хост пришел запрос. Всё обрабатывает apache

charset windows-1251;

location /
{
proxy_pass http://1.2.3.4:8181/; # адрес который слушает apache.
proxy_redirect off;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

client_max_body_size 10m;
client_body_buffer_size 8k; #128k

proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;

proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}


Сохраним конфиг и попытаемся запустить nginx.
Если у Вас уже запущен apache, то скорее всего nginx не запустится, так как 80 порт занят apache`ем.

Нужно поправить файл /etc/httpd/conf/httpd.conf.
Строку «Listen 80» заменить на «Listen 8181».
И «NameVirtualHost 1.2.3.4:80» на «NameVirtualHost 1.2.3.4:8181».
Перезапускаем apache. Запускаем nginx.
Вуаля! Всё работает. Мы можем обратится к любому вирт-хосту.

Реальные IP


Мы можем заметить, что IP клиента будет 1.2.3.4.
Это происходит в следствии того, что реальный IP клиента получает nginx, а когда трафик форварлится apache, то он уже идет с нашего внутреннего IP.
Но это не проблема. Для apache существует замечательный модуль mod_rpaf.
Устанавливается он элементарно.

#cd /root/nginxsrcs
#wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
#tar xzf mod_rpaf-0.6.tar.gz
#cd mod_rpaf-0.6
#apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c

Создаем файл конфигурации mod_rpaf.conf:
LoadModule rpaf_module /usr/lib/apache/mod_rpaf-2.0.so
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1 1.2.3.4
RPAFheader X-Real-IP


Перезапускаем apache.

Всё, теперь мы имеем полностью рабочую связку nginx + apache + directadmin.
Теги:
Хабы:
Всего голосов 8: ↑6 и ↓2+4
Комментарии11

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань