反向代理解决80端口数量问题

简介:

标题索引


  • 问题原因

  • 解决思路

  • 参数分析

  • 企业案例


问题原因

    现如今公网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代理启用虚拟主机,在虚拟主机中启用反向代理和缓存相关功能,实现业务逻辑的代理和缓存,具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
[ 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(即不能跟/或其他路径如/images),经测试或官方文档中proxy_pass模块中有英文说明;

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

1
2
3
4
5
6
7
8
9
10
11
[ root@nginxagent ~ ] #vim /etc/nginx/conf.d/virtual.conf
server {
     listen 80;
     index index.html;
      server_name www.a.com;
      root  /app/website01/ ;
      location  /images  {
               proxy_pass 192.168.40.1
          }
          location              
   }

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
[ root@nginxagent ~ ] #vim /etc/nginx/conf.d/virtual.conf
server {
     listen 80;
     index index.html;
      server_name www.a.com;
      root  /app/website01/ ;
      location  /images  {
               proxy_pass 192.168.40.1/
               #或者
               #proxy_pass 192.168.40.1/html/
          }
          location              
   }

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



本文转自 薛伟博 51CTO博客,原文链接:http://blog.51cto.com/weiboxue/1976707,如需转载请自行联系原作者


相关文章
|
9月前
|
应用服务中间件 nginx Windows
使用Nginx实现反向代理(80端口转发到Tomcat)
修改Nginx的配置文件,在Nginx安装目录中的conf文件夹中
|
10月前
|
JSON 前端开发 应用服务中间件
json-server的搭建及端口的反向代理
json-server的搭建及端口的反向代理
157 0
|
应用服务中间件 nginx 开发者
淘淘商城实现反向代理去掉端口号
淘淘商城实现反向代理去掉端口号
淘淘商城实现反向代理去掉端口号
|
应用服务中间件 nginx
【Nginx】一个项目一个配置文件,每个项目按端口区分开来,反向代理到本地
【Nginx】一个项目一个配置文件,每个项目按端口区分开来,反向代理到本地
89 0
【Nginx】一个项目一个配置文件,每个项目按端口区分开来,反向代理到本地
|
应用服务中间件 开发工具 nginx
最详细nginx反向代理之端口配置
最详细nginx反向代理之端口配置
|
应用服务中间件 Apache nginx
nginx 反向代理丢失端口问题
  nginx 反向代理丢失端口问题   本人在搭建 discuz 的时候,apache 起的服务,需要用nginx 配置外网 配置完成后发先 缺少静态文件, 查看元素后,发现丢失 端口     解决方法   proxy_set_header Host $host:...
1557 0
|
4月前
|
Ubuntu 关系型数据库 MySQL
百度搜索:蓝易云【ubuntu20.4服务器安装mysql社区版并开放3306端口】
现在,你已经在Ubuntu 20.04服务器上成功安装了MySQL社区版,并且已经开放了3306端口,可以通过该端口访问MySQL服务器了。请确保在生产环境中设置安全措施,例如设置强密码、限制访问等,以保护数据库的安全性。
95 2