我是靠谱客的博主 淡然钢笔,最近开发中收集的这篇文章主要介绍Nginx之代理模块 ngx_http_proxy_module,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

正向代理

正向代理是指位于客户机(A)和站点服务器(B)之间的代理服务器(C),为了从站点服务器(B)获取资源,客户机(A)向代理服务器(C)发送请求并指定站点服务器(B),然后代理服务器(C)向站点服务器(B)转交请求并将获取的资源返回给客户机(A)。
在这里插入图片描述

上述这样的代理模式称为正向代理,正向代理最大的特点

  • 客户端非常明确要访问的服务器地址;
  • 服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;
  • 正向代理模式屏蔽或者隐藏了真实客户端信息。

反向代理

客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。

反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。

在这里插入图片描述
代理区别: 区别在于代理的对象不一样

  • 正向代理代理的对象是客户端
  • 反向代理代理的对象是服务端(常用)

Nginx代理服务支持协议

Nginx作为代理服务,可支持的代理协议非常的多,具体如下图:
在这里插入图片描述
如果将Nginx作为反向代理服务,常常会用到如下几种代理协议,如下图所示:
在这里插入图片描述
反向代理模式与Nginx代理模块:

反向代理模式Nginx配置模块
http、websocket、httpsngx_http_proxy_module
fastcgingx_http_fastcgi_module
uwsgingx_http_uwsgi_module
grpcngx_http_v2_module

ngx_http_proxy_module 模块

Nginx 基于http协议的代理功能是通过 ngx_http_proxy_module 模块来实现的。默认在安装 Nginx 时已经安装了ngx_http_proxy_module模块,因此可直接使用 ngx_http_proxy_module 模块。

相关参数

  1. proxy_pass
proxy_pass URL; 
将请求转发到另一台服务器,在实际的反向代理工作中,会通过 location 功能匹配指定的 URI,然后把接收到的符合匹配 URI 的请求通过 proxy_pass 抛给定义好的upstream节点池(后端服务节点)。
    可用位置:location, if in location, limit_except 
    
   proxy_pass转发的路径问题
    第一种:proxy_pass后面的url加/,表示绝对根路径,不会代理location后的路径;
    	假设用URL:http://localhost/web/test.html 进行访问。
		location /web/ {
   		 	proxy_pass http://192.168.1.2:8080/;
		}
		# 代理到URL:http://192.168.1.2:8080/test.html

    第二种:相对于第一种,最后少一个 / ,则会把location后的路径代理进去	
		location /web/ {
    		proxy_pass http://192.168.1.2:8080;
		}
		# 代理到URL:http://192.168.1.2:8080/web/test.html

    第三种:
		location /web/ {
    		proxy_pass http://192.168.1.2:8080/aaa/;
		}
		# 代理到URL:http://192.168.1.2:8080/aaa/test.html

    第四种:相对于第三种,最后少一个 /
		location /web/ {
    		proxy_pass http://192.168.1.2:8080/aaa;
		}
		# 代理到URL:http://192.168.1.2:8080/aaatest.html

location 后的uri可以使用正则,location内部还可以使用if语句做判断
  1. proxy_set_header
proxy_set_header field value; 
	field :为要更改的项目,也可以理解为变量的名字,比如host;value :为变量的值
    用来设定被代理服务器接收到的header信息,如果不设置proxy_set_header,则默认host的值为proxy_pass后面跟的那个域名或者IP
    可用位置:http, server, location 
	
	当后端web服务器存在多个虚拟主机时,该模块是用来区分前端请求,是给反向代理的后端的哪个虚拟主机(即将代理的server_name传递到后端的域名为代理的server_name的虚拟主机上)
	proxy_set_header Host $host;
	
	用来设置被代理端接收到的远程客户端IP,如果不设置,则header信息中并不会透传远程真实客户端的IP地址。
	proxy_set_header X-Real-IP $remote_addr;
	和
	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    此时后端服务器记录日志格式要添加:"$http_x_real_ip""$http_x_forwarded_for"变量,才能在访问日志中查看到效果
    # 只有一级代理的情况下两者是等效的;如果有多级代理,X-Forwarded-For效果是大于X-Real-IP的,可以记录完整的代理链路吧vhg

在这里插入图片描述

3. proxy_http_version
	设置代理的HTTP协议版本。默认情况下,使用版本1.0。
	可用位置:http, server, location
	proxy_http_version 1.0 | 1.1;
	 

4. proxy_cache_path; 
    定义可用于proxy功能的缓存;
    可用位置:http 
     proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];

5. proxy_cache zone | off;   
    默认off指明调用的缓存,或关闭缓存机制;
    可用位置:http, server, location

6. proxy_cache_key string; 
    缓存中用于“键”的内容默认值:proxy_cache_key $scheme $proxy_host $request_uri;
    可用位置:http, server, location

7. proxy_cache_valid [code ...] time; 
    定义对特定响应码的响应内容的缓存时长 
    定义在http{...}中 
    可用位置:http, server, location
    示例:
    proxy_cache_valid200 302 10m; 

示例:在http配置定义缓存信
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2:2 keys_zone=proxycache:20m inactive=120s max_size=1g; 
    调用缓存功能,需要定义在相应的配置段,如server{...};
    proxy_cache proxycache;
    proxy_cache_key $request_uri; 
    proxy_cache_valid 200 302 301 1h; 
    proxy_cache_valid any 1m;

8. proxy_cache_use_stale; 
    proxy_cache_use_staleerror | timeout | invalid_header| updating | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ... 
    在被代理的后端服务器出现哪种情况下,可以真接使用过期的缓存响应客户端
    可用位置:http, server, location

9. proxy_cache_methods GET | HEAD | POST ...; 
    对哪些客户端请求方法对应的响应进行缓存,GET和HEAD方法总是被缓存
    可用位置:http, server, location

10. proxy_hide_header field; 
    默认nginx在响应报文不传递后端服务器的首部字段Date, Server, X-Pad,  X-Accel-等,用于隐藏后端服务器特定的响应首部
    可用位置:http, server, location

11. proxy_connect_timeout time; 
    定义与后端服务器建立连接的超时时长,如超时会出现502错误,默认为60s,一般不建议超出75s,
    可用位置:http, server, location

12. proxy_send_timeout time; 
    将请求发送给后端服务器的超时时长;默认为60s
    可用位置:http, server, location

13. proxy_read_timeout time; 
    等待后端服务器发送响应报文的超时时长,默认为60s
    可用位置:http, server, location

14. proxy_buffering on | off;
	代理会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
	Default: proxy_buffering on;
	Context: http, server, location
 
15. proxy_buffer_size size;
	设置nginx代理保存用户头信息的缓冲区大小
	Default: proxy_buffer_size 4k|8k;	
	Context: http, server, location

16. proxy_buffers number size; 
	设置proxy_buffers缓冲区大小
	Default: proxy_buffers 8 4k|8k;		# 8*4=32k 8*8=64k
	Context: http, server, location

常用优化配置

Proxy代理网站常用优化配置如下,将配置写入新文件,调用时使用include引用即可(简化配置,阅读性更高)

[root@nginx ~]# vim /etc/nginx/proxy_params
proxy_http_version 1.1;		# 设置代理的HTTP协议版本
proxy_set_header Host $http_host;	# 代理向后端主机请求时携带host域名
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	# 获取客户端真实IP以及全链路IP
 
proxy_connect_timeout 30;	# 代理连接后端超时时间
proxy_send_timeout 60;		# 后端传递数据至代理的超时时间
proxy_read_timeout 60;		# 后端响应代理的超时时间
 
proxy_buffering on;			# 代理会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传
proxy_buffer_size 32k;		# 代理保存用户头信息的缓冲区大小
proxy_buffers 4 128k;		# 设置代理的缓冲区大小

# 重复使用配置

代理配置location时调用方便后续多个Location重复使用

location / {
    proxy_pass http://IP:PORT;
    include proxy_params;    # 此文件为相对路径,默认会在/etc/nginx/目录下找对应文件
}

nginx代理的局限性,一个location仅能代理后端的一台主机

最后

以上就是淡然钢笔为你收集整理的Nginx之代理模块 ngx_http_proxy_module的全部内容,希望文章能够帮你解决Nginx之代理模块 ngx_http_proxy_module所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部