使用nginx和iptables针对不同域名挂载维护页面

在现在的网站架构中经常会前端是LVS,中间是NGINX,后端才是真实服务器。在这种情况下,在用我之前的重定向维护方法就会比较麻烦。因为几乎所有域名都是都是指向在LVS上,而有时候wap和pc都会指向同一个lvs的虚拟IP。这个时候就需要结合iptables和nginx来做根据域名的重定向维护页面了。首先需要让LVS把NGINX服务器IP转向到新的NGINX服务器IP,也可以是同一IP,这样2个NGINX需要跑在不同的端口上。在本例中,正常的NGINX跑在80端口,而维护页面的NGINX在81端口上。
下面正式开工了。

首先在iptables中加入nat转向,目的是为了让测试人员和开发人员能够正常访问网站进行测试和调整,而普通用户只能看到静态维护页面。
下面的Iptables内容中1.1.1.1是我公司的出口ip,而2.2.2.2是网站的公网IP,10.2.2.2是网站的内网IP。为什么要把公网用户转到内网IP是为了不在防火墙上开放新的公网开放端口。而eth2就是网站的公网出口

 # Generated by iptables-save v1.3.5 on Fri Mar 26 12:59:51 2010 *nat :PREROUTING ACCEPT \[131:18361\] :POSTROUTING ACCEPT \[14:1169\] :OUTPUT ACCEPT \[14:1169\] #公司自己的访问转向到80口 -A PREROUTING -s 1.1.1.0/24 -i eth2 -p tcp --dport 80 -j DNAT --to-destination 2.2.2.2:80 #其它访问转向到81口 -A PREROUTING -s 0.0.0.0/0 -i eth2 -p tcp --dport 80 -j DNAT --to-destination 10.2.2.2:81 -A POSTROUTING -s 0.0.0.0/0 -p tcp --dport 81 -d 10.2.2.2/32 -j SNAT --to-source 2.2.2.2 -A POSTROUTING -s 0.0.0.0/0 -p tcp --dport 80 -d 10.2.2.2/32 -j SNAT --to-source 2.2.2.2 -A POSTROUTING -o eth2 -j MASQUERADE COMMIT 

修改/etc/sysctl.conf中的net.ipv4.ip_forward = 1,这一步是为了让内核支持转发。
执行

 sysctl -p /etc/sysctl.conf 

下面就是nginx登场了。新建一个新的nginx_81.conf文件。这样就能区分原来的。下面是这个nginx_81.conf的主要内容。其实主要就是其中的rewrite规则。由于我们域名所有所有wap域名都是m.abc.com, bb.m.abc.com这样形式。所以就只区分了wap和pc两种。但是为了防止有些pc域名如farm.abc.com存在,所以写了3条if规则。本来想用rewrite来进行重定性,但是一直写不好,不是这个有了问题就是出那个问题,还是直接用error_page来更直接一点。

 server { listen 81; location / { server_name_in_redirect off; index maintain.html; if ($host ~* ^(m).(abc).(com)) { root /opt/update/wap/; # rewrite !(html|css|gif|jpg|js|htm)$ http://$host/maintain.htm permanent; error_page 404 http://$host/maintain.html; break; } if ($host ~* (.*).(m).(abc).(com)) { root /opt/update/wap/; # rewrite !(html|css|gif|jpg|js|htm)$ http://$host/maintain.html permanent; error_page 404 http://$host/maintain.html; break; } if ($host ~* (.*).(abc).(com)) { root /opt/update/www/; # rewrite !(html|css|gif|jpg|js|htm)$ http://$host/maintain.html permanent; error_page 404 http://$host/maintain.html; break; } expires 0; access_log /data/log/nginx/maintain/access.log main; } } 

2010-04-13