分地区访问解决方案
现有的服务有很多的情况对不同的地区对同一个域名,显示不同的内容。例如广告系统,针对一个不同的地域显示不同的广告内容。可以通过动态页面根据来源IP显示不同的内容,毕竟动态页面消耗的资源还是比较的高,另外一个做法根据来源IP作一个301跳转。这两种方式做法消耗资源还是有点大,另外的一种做法是从local dns方面进行的一个dns view的方式进行的地区访问限制,这种方式的好处就是不需要在应用程序和服务器端做任何的修改,只需要配置一个dns的view就可以了,缺点是误判太多。国内还是有很多用户采用国外的google或者opendns的提供的dns服务,这样误判就比较的多了。而无法达到既定的需求,其实有好的解决方案就是在webserver的前端加一个nginx或者采用haproxy打一个 cttproxy的补丁,本文说说采用nginx的负载均衡方式对来源ip进行访问区分,具体操作方法如下:
安装:
#./configure -user=www -group=www-prefix=/usr/local/nginx/ -with-http_stub_status_module -with-http_realip_module -with-http_geoip_module
#make
#make install
配置
user www;
worker_processes 8;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /usr/local/nginx/mime.types;
access_log/var/log/nginx/access.log;
sendfile on;
keepalive_timeout 65;
tcp_nodelay on;
gzip on;
geo $geo {
default default;
192.168.70.64/26 cnc;
192.168.70.192/26 cnc;
}
upstream default.server {
server 192.168.70.95:8080;
}
upstream cnc.server {
server 192.168.70.95:8081;
}
server {
listen 80;
server_name 192.168.70.95;
index index.html index.htm;
location / {
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;
proxy_pass http://$geo.server$request_uri;
}
}
server {
listen 8080;
server_name 192.168.70.95;
index index.html index.htm;
root /var/www1;
}
server {
listen 8081;
server_name 192.168.70.95;
index index.html index.htm;
root /var/www2;
}
}
在/var/www1下建立一个内容为8080的index.html文件,在/var/www2目录下建立一个内容为8081的index.html的文件
结果展示
从192.168.70.64/26、192.168.70.192/26段过去访问的结果是8081,从其它的ip访问过去时8080的结果,实现根据IP段进行负载均衡
该结构已经把客户端的IP以及请求等信息已经转发给了后端的真实webserver,所以基本算是一个透明的代理。它的缺点需要添加新的机器进行WEB的透明代理(高并发情况下),同时单台nginx代理的有上限,预估计能到4W/s的并发左右(我曾经优化过一个线上的nginx web server并发连接数达到了4.5W/s),由于并未在正式环境中使用过该结构(不过使用的两个模块都是nginx的核心模块故,问题不大),为保险起见,建议在使用前使用使用loadrunner,ab,webbench,tsung等压力测试工具进行相关的压力测试,并进行相关的功能性测试。该结构的优点是精确的判断,不需要应用程序作任何的修改。
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:zhou 来源: 周灵杰
- 标签: 分区访问 灰度
- 发布时间:2014-03-20 22:58:48
- [66] Oracle MTS模式下 进程地址与会话信
- [66] Go Reflect 性能
- [65] 如何拿下简短的域名
- [59] android 开发入门
- [59] 图书馆的世界纪录
- [59] IOS安全–浅谈关于IOS加固的几种方法
- [58] 【社会化设计】自我(self)部分――欢迎区
- [53] 视觉调整-设计师 vs. 逻辑
- [47] 界面设计速成
- [46] 读书笔记-壹百度:百度十年千倍的29条法则