概述
正向代理
正向代理是指位于客户机(A)和站点服务器(B)之间的代理服务器(C),为了从站点服务器(B)获取资源,客户机(A)向代理服务器(C)发送请求并指定站点服务器(B),然后代理服务器(C)向站点服务器(B)转交请求并将获取的资源返回给客户机(A)。
上述这样的代理模式称为正向代理,正向代理最大的特点:
- 客户端非常明确要访问的服务器地址;
- 服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;
- 正向代理模式屏蔽或者隐藏了真实客户端信息。
反向代理
客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色。
反向代理,主要用于服务器集群分布式部署的情况下,反向代理隐藏了服务器的信息。
代理区别: 区别在于代理的对象不一样
- 正向代理代理的对象是客户端
- 反向代理代理的对象是服务端(常用)
Nginx代理服务支持协议
Nginx作为代理服务,可支持的代理协议非常的多,具体如下图:
如果将Nginx作为反向代理服务,常常会用到如下几种代理协议,如下图所示:
反向代理模式与Nginx代理模块:
反向代理模式 | Nginx配置模块 |
---|---|
http、websocket、https | ngx_http_proxy_module |
fastcgi | ngx_http_fastcgi_module |
uwsgi | ngx_http_uwsgi_module |
grpc | ngx_http_v2_module |
ngx_http_proxy_module 模块
Nginx 基于http协议的代理功能是通过 ngx_http_proxy_module 模块来实现的。默认在安装 Nginx 时已经安装了ngx_http_proxy_module模块,因此可直接使用 ngx_http_proxy_module 模块。
相关参数
- 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语句做判断
- 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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复