IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

分地区访问解决方案

周灵杰 2014-03-20 22:58:48 累计浏览 2,062 次
本机暂存

   现有的服务有很多的情况对不同的地区对同一个域名,显示不同的内容。例如广告系统,针对一个不同的地域显示不同的广告内容。可以通过动态页面根据来源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等压力测试工具进行相关的压力测试,并进行相关的功能性测试。该结构的优点是精确的判断,不需要应用程序作任何的修改。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 如何拿下简短的域名 (累计阅读 16,933)
  2. 从输入 URL 到页面加载完成的过程中都发生了什么事情? (累计阅读 15,932)
  3. 自建DNS以防止GFW干扰 (累计阅读 13,125)
  4. 强制刷新本地 DNS 缓存记录 (累计阅读 10,915)
  5. 从谷歌宕机事件认识互联网工作原理 (累计阅读 8,746)
  6. 2014年1月21日中国互联网DNS瘫痪事件原因分析 (累计阅读 8,445)
  7. 域名相关的一些基本概念总结 (累计阅读 8,092)
  8. 关于 SOCKS 代理的远端 DNS 解析 (累计阅读 7,983)
  9. DNS 隧道 (累计阅读 7,258)
  10. 获取指定(访客)IP的所有信息,地址、邮政编码、国家、经纬度等的API (累计阅读 6,454)