标题索引


  • 问题原因

  • 解决思路

  • 参数分析

  • 企业案例


问题原因

    现如今公网IP地址80端口管理较为严格,工信部防止搭建违规违法网站,企业在使用80端口时需向运营商网站备案管理处申请备案,备案流程通过运营商才能放行80端口,在备案时需提供资料如互联网信息安全保障责任书(负责人签字)、域名证书复印件、公司三证合一的复印件、网站负责人的生身份等相关资料,另外不同运营商业务业务不同具体链路带宽、IP地址数量和端口的放行都有所不同,如某市某运营商在100M带宽的链路绑定8个公网IP地址,只允许放行一个公网IP地址的80端口,而企业因业务需求需搭建多个站点,IP地址和80端口远远无法支持建站的业务需求。

解决思路

    主体思路为反向代理实现80端口的短缺问题(需提前与运营商做沟通,多个网站承载在一个公网IP地址之上),反向代理主流开源免费产品Apache和Nginx,从底层工作原理得知(可参考UNIX网络编程书籍):

    Apache在IO多路复用的模型中调用SELECT函数,举例说明,当http请求进入用户空间apache进程后,调用system call中的read函数时,apache进程优先会调用SELECT函数代理Apache相关进程或线程询问内核空间是否完成对磁盘的read,若尚未完成时,周期性的询问,直到完成后,apahce才会调用receform函数将内核空间执行的结果调入用户空间进行数据报的封装。

    Nginx在IO多路复用的模型中调用EPOLL函数,举例说明,当http请求进入用户空间Nginx进程后,调用system call中的read函数时,Nginx进程优先调用EPOLL函数,EPOLL再次调用epoll_createintepoll_ctlint epoll_wait函数,三种函数的执行功能为当数据从用户空间进入内核空间后,EPOLL处于等待期,内核空间完成对磁盘的read后主动通知EPOLL函数read读取完毕,从而Nginx可以迅速调用receform函数将数据从内核空间调入用户空间完成数据报的封装。

    对比二者底层工作原理决定采用Nginx产品做反向代理软件,具体解决业务逻辑拓扑图如下:

9340d82b64b1459a6a6afa9d152e0610.jpg

图1-1 反向代理业务逻辑

    当用户通过公网IP地址的80端口进入内网优先调度到方向代理服务器,反向代理服务器接收到http请求报文后,根据请求包头中的host解析到内网虚拟服务器的web站点,服务器回包时,先转发到代理服务器,由代理服务器再向客户端发起响应报文。

策略分析

    反向代理:反向代理和LVS负载均衡的本质区别为负载均衡经过系统时由PREROUTING---FORWARD-POSTROUTING仅仅是路由的转发,而反向代理通过PREROUTINGG-INPUT-OUNPUT-POSTROUTING,因此在服务器端看来数据的请求来自代理服务器。

    缓存原理:内存存储一张二维表,表中hash值和对应磁盘文件路径,其中hash值取自客户端访问服务器的URI,对URI做hash后进行存储,磁盘文件对应路径为磁盘某个指定目录,其子目录的够成一般意义分为三级子目录,具体目录数可自定义。举例说明:如第一级子目录的构成为取hash值数字的最后一位,根据hash的原理可知16进制计算,因此一级子目录为16个目录,第二级子目录的构成为取hash值数字的倒数第二位和第三位,根据hash的原理可知16进制计算16*16=256个子目录,因此二级子目录为256个子目录,同理三级子目录构成为取hast值数字的倒数第四位、第五位和第六位,根据hash的原理可知16进制计算16*16*16=4096个子目录,因此第三季子目录为256个子目录,因此统计子目为:16*256*4096。当客户端第二次进行访问数据时计算URI可知具体文件所在磁盘目录进而直接进行构建响应报文。

企业案例

    企业

    1.通过一个公网IP地址的80端口搭建多个独立站点,解决当下IP地址80端口不足问题;

    2.对部分业务实现缓存业务,缓存时长依据具体业务情况进行设定时间。

    逻辑拓扑在业务逻辑拓扑的设计时,结合企业文化实现节约地址的同时也要节约造价费用等的理念,引领环保绿色数据中心从我做起。企业现阶段逻辑拓扑如下:

e9fe3a01ac6458900effaf58c997066f.jpg

图1-2业务逻辑拓扑图  

    配置演

    依据业务逻辑,政务集群拥有多个站点,因此ngix代理启用虚拟主机,在虚拟主机中启用反向代理和缓存相关功能,实现业务逻辑的代理和缓存,具体配置如下:

[ root@nginxagent ~ ]#vim /etc/nginx/conf.d/virtual.conf
  server {
    listen 80;
    index index.html;
     server_name www.a.com
      root /app/website01/;
       #开启方向反向代理头部记录
      proxy_set_header realserver $remote_addr
       #开启反向多次代理头部记录
       proxy_set_header x-realserver $proxy_add_x_forwarded_for;
       #定义缓存,此项必须定义在http模块中
       #proxy_cache_path /data/cache/nginx/ levels=1:2:1 
       #keys_zone=cache_ngx:200m inactive=1d max_size=30g;
       location / {
             #开启反向代理
             proxy_pass http://192.168.40.1
             #使用Web缓存区cache_ngx
             proxy_cache cache_ngx ;
             #对不同HTTP状态码缓存设置不同的缓存时间
             proxy_cache_valid 200 304 12h ;
             proxy_cache_valid 301 302 1m ;
             proxy_cache_valid any 1m ;
             #设置Web缓存的Key值,Nginx根据Key值md5哈希存储缓存,根据URI定义key
             proxy_cache_key $uri
                
         }             
  }
 server {
     listen 80;
     server_name www.b.com;
     index index.html;
     root /app/website02/;
     location ~ \.(.jpg|.png)$ {
               #访问图片则跳转到     
               proxy_pass http://192.168.40.2;
     }
 }
 server {
     listen 80;
     server_name www.c.com;
     index index.html;
     root /app/website03/;
     location / {
              proxy_pass http://192.168.40.3
     }
 }
[ root@nginxagent ~ ]#vim /etc/nginx/nginx.conf
    #添加定义缓存
    proxy_cache_path /data/cache/nginx/ levels=1:2:1
    keys_zone=cache_ngx:200m inactive=1d max_size=30g;

    注意事项:

    1.当location匹配正则表达式时,proxy_pass配置选项不能加URI(即不能跟/或其他路径如/p_w_picpaths),经测试或官方文档中proxy_pass模块中有英文说明;

    2.当location中匹配路径时,proxy_pass配置选项不加URI时,代理实际路径为:http://IP/loacation路径;

[ root@nginxagent ~ ]#vim /etc/nginx/conf.d/virtual.conf
server {
    listen 80;
    index index.html;
     server_name www.a.com;
     root /app/website01/;
     location /p_w_picpaths {
              proxy_pass 192.168.40.1
         }
         location              
  }

    此时客户端访问www.a.com/p_w_picpaths/1.jgp时,访问真实物理机URI路径为:http://192.168.40.1/p_w_picpaths/1.jgp

    3.当location中匹配路径时,proxy_pass配置选项加RUI时,代理实际路径为:http://IP路径;

[ root@nginxagent ~ ]#vim /etc/nginx/conf.d/virtual.conf
server {
    listen 80;
    index index.html;
     server_name www.a.com;
     root /app/website01/;
     location /p_w_picpaths {
              proxy_pass 192.168.40.1/
              #或者
              #proxy_pass 192.168.40.1/html/
         }
         location              
  }

    此时客户端访问www.a.com/p_w_picpaths/1.jpg时,访问真实物理机RUI路径为:http://192.168.40.1,相当于alias或rewrite替换功能。