Быстрая настройка nginx как обратного прокси для apache
Предположим, что у нас есть настроенный и функционирующий web сервер apache (httpd) и мы хотим убрать его за nginx. Не будем сейчас рассматривать причины, по которым мы хотим это сделать — они всегда найдутся. Например, мы хотим, что бы nginx отдавал статичное содержимое, оставляя apache обработку динамических страниц (php, например). Итак. У нас есть httpd. Он, естественно, слушает 80-й порт. Но на этот порт мы собираемся навесить nginx; соответственно, в настройках apache нужно изменить порт, который он слушает (здесь и далее пути к конфигурационным файлам указаны для RedHat/Centos etc):
/etc/httpd/conf/httpd.conf
... Listen XXX.XXX.XXX.XXX:8080 ... ... NameVirtualHost *:8080 ...
Следуя синтаксису httpd.conf, в директиве Listen вполне можно опустить ip адрес. А в NameVirtualHost его можно написать. Не буду сейчас останавливаться на этом подробно; мы договорились, что httpd у нас уже функционирует. Если интересно — напишу отдельную статью про виртуальные хосты.
Итак. Мы сказали apache слушать порт 8080. Теперь необходимо аналогичную процедуру провести со всеми виртуальными хостами, которые обслуживает наш httpd. Расположение этих конфигураций зависит от способа, которым мы их добавляли. Они могут быть как в основном файле конфигурации (неправильный метод, кроме случая, когда apache обслуживает один хост), так и в отдельных файлах, расположенных в отдельной директории (/etc/httpd/sites/my_wonderful_site.conf например ):
<VirtualHost *:8080> DocumentRoot /var/www/my_site ServerName my_wonderful_site.in ServerAlias www.my_wonderful_site.in <Directory /var/www/my_site> AllowOverride All Allow From All Options +Indexes </Directory> ErrorLog /var/log/httpd/my_site.error.log CustomLog /var/log/httpd/my_site.access.log combined </VirtualHost>
Теперь не забудем добавить правило для нашего параноидального iptables:
/etc/sysconfig/iptables
-A INPUT -p tcp -m tcp -s 127.0.0.1 --dport 8080 -j ACCEPT
Установим nginx.
yum install nginx
Теперь настроим nginx. Для быстрого старта достаточно в /etc/nginx/conf.d/ создать файл my_site.conf с примерно следующим содержимым:
server { listen 80; server_name my_wonderful_site.in www.my_wonderful_site.in; location / { proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080/; } location ~/\.ht { deny all; } location ~*\.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ { root /var/www/my_site/; } }
Здесь кроме непосредственно обратного прокси, мы делаем ещё две полезные вещи — запрещаем отдавать пользователю файл .htaccess, например, и настраиваем отдачу статического содержимого нашим nginx-ом.
Осталась самая малость — научить apache писать в логи реальный ip вместо 127.0.0.1. Для этого нам нужно установить пакет httpd-devel и mod_rpaf (reverse proxy add forward). Последовательность действий для RedHat/CentOS такова:
yum install httpd-devel unzip cd mkdir mod_rpaf cd mod_rpaf wget https://github.com/gnif/mod_rpaf/archive/stable.zip unzip stable.zip cd mod_rpaf_stable make make install
и создаём (редактируем) конфигурационный файл модуля /etc/httpd/conf.d/mod_rpaf.conf :
LoadModule rpaf_module modules/mod_rpaf.so RPAF_Enable On RPAF_ProxyIPs 127.0.0.1 RPAF_SetHostName On RPAF_SetHTTPS On RPAF_SetPort On RPAF_ForbidIfNotProxy Off
Теперь проверим наши конфиги на ошибки:
service httpd configtest
Если получили OK — перезапускаем всю нашу связку:
service iptables restart service httpd restart service nginx restart
Если, опять таки, не получили ошибок — можем радостно наблюдать за свершениями:
tail -f /var/log/httpd/my_site.access.log
Комментов пока нет