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

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

代理的概念

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

  • 代理

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

  • 正向代理

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

5520ac7c024a48e09701c75072b88e44.png

  • 反向代理

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

Nginx作为代理支持的协议

  http:超文本传输协议
  https:http/https协议
  tcp:tcp/udp协议
  websocket:长链接通讯协议
  GRPC:go语言远程过程调用
  pop/imap:邮件收发协议
  rtmp:流媒体

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

语法:

Syntax: proxy_pass URL;
Default:  —
Context:  location,if in location,limit_except

示例:

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

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

Nginx代理参数

  • proxy_set_header

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

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

原配置:

location / {
  proxy_pass http://192.168.10.10:80;
}

修改为:

location / {
  proxy_set_header Host $http_host;
  proxy_pass http://192.168.10.10:80;
}

这个配置直白来讲就是你访问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;
}
  • 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;
}
  • proxy_timeout
  • proxy_connect_timeout

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

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

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

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

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

Syntax: proxy_send_timeout time;
Default:  proxy_send_timeout 60s;
Context:  http,server,location
  • proxy_buffer
  • proxy_buffering

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

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

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

Syntax: proxy_busy_buffers_size size;
Default:  proxy_busy_buffers_size 8k|16k;
Context:  http,server,location
  • 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

如果超过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

然后在代理服务器上配置

location / {
  proxy_pass http://192.168.10.10;
  include proxy_params;
}

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

目录
相关文章
|
5天前
|
JavaScript Java 应用服务中间件
|
23天前
|
缓存 应用服务中间件 nginx
安装nginx-http-flv-module模块
本文介绍如何为Nginx安装`nginx-http-flv-module`模块。此模块基于`nginx-rtmp-module`二次开发,不仅具备原模块的所有功能,还支持HTTP-FLV播放、GOP缓存、虚拟主机等功能。安装步骤包括:确认Nginx版本、下载相应版本的Nginx与模块源码、重新编译Nginx并加入新模块、验证模块安装成功。特别注意,此模块已包含`nginx-rtmp-module`功能,无需重复编译安装。
64 1
|
27天前
|
负载均衡 应用服务中间件 Linux
在Linux中,常用的 Nginx 模块有哪些,常来做什么?
在Linux中,常用的 Nginx 模块有哪些,常来做什么?
|
27天前
|
缓存 负载均衡 应用服务中间件
Nginx 代理管理器强势登场!轻松设置反向代理,为你的网络安全与高效护航,快来探索!
【8月更文挑战第23天】Nginx 代理管理器(NPM)是一款强大的工具,用于简化反向代理的设置流程。反向代理能隐藏后端服务器的真实IP,提升安全性,实现负载均衡与缓存等功能。用户需先安装Nginx 代理管理器,然后通过其Web界面添加代理主机,指定代理名称、协议类型、服务器地址及端口等信息。对于HTTPS协议,还需上传SSL证书/密钥。完成设置后,可通过浏览器测试反向代理是否正常工作。Nginx 代理管理器还支持高级特性,如负载均衡、缓存及访问控制等。
49 1
|
30天前
|
负载均衡 应用服务中间件 Linux
"揭晓nginx的神秘力量:如何实现反向代理与负载均衡,拯救服务器于水火?"
【8月更文挑战第20天】在Linux环境下,nginx作为高性能HTTP服务器与反向代理工具,在网站优化及服务器负载均衡中扮演重要角色。本文通过电商平台案例,解析nginx如何解决服务器压力大、访问慢的问题。首先介绍反向代理原理,即客户端请求经由代理服务器转发至内部服务器,隐藏真实服务器地址;并给出配置示例。接着讲解负载均衡原理,通过将请求分发到多个服务器来分散负载,同样附有配置实例。实践表明,采用nginx后,不仅服务器压力得到缓解,还提升了访问速度与系统稳定性。
47 3
|
30天前
|
负载均衡 算法 应用服务中间件
在Linux中,nginx反向代理和负载均衡实现原理是什么?
在Linux中,nginx反向代理和负载均衡实现原理是什么?
|
29天前
|
缓存 负载均衡 应用服务中间件
如何配置 NGINX 反向代理
【8月更文挑战第21天】
128 0
如何配置 NGINX 反向代理
|
26天前
|
应用服务中间件 Linux nginx
【Azure 应用服务】App Service For Container 配置Nginx,设置/home/site/wwwroot/目录为启动目录,并配置反向代理
【Azure 应用服务】App Service For Container 配置Nginx,设置/home/site/wwwroot/目录为启动目录,并配置反向代理
|
28天前
|
缓存 负载均衡 安全
介绍一下Nginx的反向代理功能吧
【8月更文挑战第22天】介绍一下Nginx的反向代理功能吧
34 0
|
28天前
|
缓存 安全 应用服务中间件
Nginx的反向代理功能有哪些应用场景呢
【8月更文挑战第22天】Nginx的反向代理功能有哪些应用场景呢
88 0