• 【2022】Nginx使用ngx_http_proxy_module模块实现七层反向代理


    代理的概念

    Nginx就是有一个很重要的使用场景是反向代理。我们经常可以看到代理、正向代理和反向代理这样的概念,那么他们的用途是什么?

    • 代理

    在计算机中,代理的意思是代表真实服务器与客户端进行通信的服务器。他可以拦截客户端请求和给客户端返回后端服务器的响应内容,可能仅作转发请求,也可以对请求内容进行修改。常见的代理有正向代理和反向代理

    • 正向代理

    通常是代理请求方或客户端,并封装他们的原始信息。可以用于绕开被屏蔽站点的限制,作为缓存服务器。

    在这里插入图片描述

    • 反向代理

    反向代理是代理后端服务器响应客户端的请求,反向代理会隐藏服务器的真实信息,通常用于服务器之间的负载均衡、路由功能、动静分离、数据缓存。

    • Nginx作为代理支持的协议

        http:超文本传输协议
        https:http/https协议
        tcp:tcp/udp协议
        websocket:长链接通讯协议
        GRPC:go语言远程过程调用
        pop/imap:邮件收发协议
        rtmp:流媒体
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    • Nginx作为反向代理常用的协议

        ngx_http_proxy_module:代理http server、socket、Tomcat
        ngx_http_fastcgi_module:代理PHP server
        ngx_http_uwcgi_module:代理Python server
        ngx_http_v2_module:代理GRPC server
      
      • 1
      • 2
      • 3
      • 4
    • Nginx代理实例

    语法:

    Syntax:	proxy_pass URL;
    Default:	—
    Context:	location,if in location,limit_except
    
    • 1
    • 2
    • 3

    示例:

    proxy_pass http://localhost:8000/uri/;
    
    • 1

    设置代理服务器的协议和地址以及应将位置映射到的可选 URI。

    Nginx代理参数

    • proxy_set_header

    允许将字段重新定义或追加到传递给代理服务器的请求标头

    场景1:如果后端服务器有多个站点(www,blog,bbs),而我们代理是写的后端服务器IP,那么如果我们客户端访问www,怎么确保传递正确。

    原配置:

    location / {
    	proxy_pass http://192.168.10.10:80;
    }
    
    • 1
    • 2
    • 3

    修改为:

    location / {
    	proxy_set_header Host $http_host;
    	proxy_pass http://192.168.10.10:80;
    }
    
    • 1
    • 2
    • 3
    • 4

    这个配置直白来讲就是你访问www,就会通过代理去找后端的www。

    场景2:以上的方式虽然可以准确的找到要访问的站点,但是看日志可以发现,后端服务器只能看到来自代理服务器的请求,而不能发现来自真实客户端的IP,如果想获取客户端真实IP该怎么做?

    location / {
    	proxy_set_header Host $http_host;
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_pass http://192.168.10.10:80;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • prxoy_http_version

    设置用于代理的 HTTP 协议版本。默认情况下,使用版本 1.0。
    1.1版本比1.0版本增加了保持连接和NTLM 身份验证功能。

    场景1:保持长链接配置

    location / {
    	proxy_http_version 1.1;
    	proxy_set_header Host $http_host;
    	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	proxy_set_header Connection "";
    	proxy_pass http://192.168.10.10:80;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • proxy_timeout
    • proxy_connect_timeout

    定义与代理服务器建立连接服务端的超时。应该注意的是,此超时通常不能超过 75 秒。

    Syntax:	proxy_connect_timeout time;
    Default:	proxy_connect_timeout 60s;
    Context:	http,server,location
    
    • 1
    • 2
    • 3
    • proxy_read_timeout

    定义从代理服务器读取响应的超时,如果代理服务器在此时间内未传输任何内容,则连接将关闭。(后端返回header,如果超时未返回则失败)

    Syntax:	proxy_read_timeout time;
    Default:	proxy_read_timeout 60s;
    Context:	http,server,location
    
    • 1
    • 2
    • 3
    • proxy_send_timeout

    设置将请求传输到代理服务器的超时。(后端返回数据,如果超时未完成则失败,建议将超时时间按场景适当调大)

    Syntax:	proxy_send_timeout time;
    Default:	proxy_send_timeout 60s;
    Context:	http,server,location
    
    • 1
    • 2
    • 3
    • proxy_buffer

    • proxy_buffering

    启动或者禁止缓冲功能,开启时代理服务器会尽快接收响应header和响应报文,并存放至缓冲区。

    Syntax:	proxy_buffering on | off;
    Default:	proxy_buffering on;
    Context:	http,server,location
    
    • 1
    • 2
    • 3
    • proxy_buffer_size

    用于设置缓冲区的大小,用于读取后端第一部分响应header,一般设置4k或8k

    Syntax:	proxy_busy_buffers_size size;
    Default:	proxy_busy_buffers_size 8k|16k;
    Context:	http,server,location
    
    • 1
    • 2
    • 3
    • proxy_buffers

    代理服务器为单个连接设置的响应缓冲区数量和大小,8 8k代表64k,只是分成8个8k,比如一个页面大小32k,就可以设置4 8k。

    Syntax:	proxy_buffers number size;
    Default:	proxy_buffers 8 4k|8k;
    Context:	http,server,location
    
    • 1
    • 2
    • 3

    如果超过32k,达到35、37k怎么办?超出的部分会存放至磁盘上的临时文件中。对临时文件的写入由proxy_max_temp_file_size和proxy_temp_file_write_size指令控制。一般不建议,最好都放置内存中,这块不说了。

    还有很多的参数没说,有兴趣可以在官网看看:https://nginx.org/en/docs/http/ngx_http_proxy_module.html

    proxy_params

    一个代理就要加这么多的参数,如果多了可能会看起来很臃肿,所以可以创建一个proxy_params文件,将所有的参数放进去。

    vim /etc/nginx/proxy_params
    
    • 1

    然后在代理服务器上配置

    location / {
    	proxy_pass http://192.168.10.10;
    	include proxy_params;
    }
    
    • 1
    • 2
    • 3
    • 4

    因为文件是存放在nginx目录下,所以可以写相对路径直接调用。

  • 相关阅读:
    C# 关于sendtoback()和bringtofront() 的特点说明
    Python——LeetCode刷题——【383. 赎金信】
    华纳云:linux怎么查看Raid磁盘阵列信息
    Linux Job Control: bg, fg & Ctrl+Z
    java计算机毕业设计快滴预约平台源码+系统+mysql数据库+lw文档+部署
    vue - 组件通信:关于v-model语法糖
    dropwizard介绍
    6.DApp-用Web3实现前端与智能合约的交互
    Java 之 IO流
    vue打包压缩
  • 原文地址:https://blog.csdn.net/qq_42527269/article/details/126065668