使用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

关于 Timo
XNIX SA & MYSQL DBA

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

  1. 阿权说道:

    我怎么看都记得搞复杂了,这不就是区分不同的ip访问不同的内容吗?
    根据ip地址,rewrite到相应的页面或者proxy到相应的服务器应该就可以了吧,何苦还要防火墙规则呢?

  2. Timo说道:

    有3个原因,之前写rewrite规则发现要考虑的东西非常多。稍微遗留点问题就会出现访问不正确
    在nginx上效率没在iptables上高。
    其次nginx要根据来源IP的话还得重新编译geo模块快进去。

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: