🍉1.Nginx代理服务基本概述
1.代理一次往往我们并不陌生,该服务我们常常用到。(比如:代理理财,代理租房,代理收获等等)
2.在没有代理模式的情况下,都是客户端直接请求服务端,服务端直接响应客户端。但是遇到高并发的请求之后,单台服务器难以支撑海量的用户请求,甚至可能造成服务瘫痪。
3.在有代理模式的情况下,客户端往往无法直接向服务端发起请求,而是需要使用到代理服务,来实现客户端和服务通信。
🍉2.Nginx代理服务常见模式
2.1正向代理
2.1正向代理:为客户端提供服务(内部上网)客户端<---->代理服务—>服务端
2.1.2客户端加速
比如:游戏加速器
2.1.3客户端缓存
比如:下载资源,可以查看代理服务是否有,如果有直接通过代理获取。
2.1.4客户端授权
很多公司为了安全,连接外网需要通过防火墙,防火墙可以配置规则,允许谁可以上网,谁不可上网
2.2 反向代理
2.2反向代理。用于公司集群架构中,用于提供服务器功能。客户端—>代理<—>服务端
2.2.1路由功能
根据用户请求的URI调度到不同的功能的服务器进行处理
2.2.2负载均衡
将用户发送的请求,通过负载均衡调度算法挑选一台合适的节点进行请求处理
2.2.3动静分离
根据用户请求的URI进行区分,将动态资源调度至应用服务器处理,将静态资源调度至静态资源服务器处理
2.2.4 数据缓存
将后端查询的资源存储至反向代理上缓存,可以加速用户获取资源
2.3正向代理和反向代理的区别
区别在与形式上的服务的“对象”不一样,其次架设的位置点不一样
正向代理代理的对象是客户端,为客户端服务
反向代理代理的对象是服务度,为服务端服务
🍉3.Nginx代理服务支持的协议
3.1Nginx作为代理服务,可支持的代理协议非常的多。
3.2 但通常情况下,我们将Nginx作为反向代理,常常回用到如下几种代理协议
3.3最后我们将企业常用的方向代理模式与nginx反向代理模块对应关系总结如下表格
反向代理模式 | Nginx反向代理模块 |
---|---|
http websocket https | ngx_http_proxy_module |
fastcgi | ngx_http_fastcgi_module |
uwcgi | ngx_http_uwsgi_module |
grpc | ngx_http_v2_module |
🍉4.Nginx反向代理场景实践
4.1.Ngix反向代理配置语法示列
Syntax(语法): proxy_pass(v.达到什么位置) URL
Default(默认): -
Context(环境): location ,if in location ,limit_except
http://localhost:8000/uri/
http://192.168.56.11:8000/uri/
http://unix:/tmp/backend.socket:/uri/
4.2.Nginx反向代理配置实列
角色 | 外网IP(NAT) | 内网IP(NAT) | 主机名 |
---|---|---|---|
Proxy | eth0:10.0.0.5 | eth1:172.16.1.5 | lb01 |
web01 | eth1:172.16.1.7 | web01 |
4.2.1(为了方便抓包分析可以统一使用 10.0.0.0/24网段来配置代理)
①先配置后端一台web节点
配置后端web节点,域名是web.cry.com 端口是8080
[root@web01 ~]# cat /etc/nginx/conf.d/web.cry.com.conf
server {
listen 8080;
server_name web.cry.com;
root /web;
location / {
index index.html;
}
}
配置完配置文件,检查语句,重启服务
nginx -t
systemctl reload nginx
为站点增加一个索引文件
② 再配置Nginx反向代理,代理后端的web节点
[root@lb01 ~]# gzip /etc/nginx/conf.d/default.conf
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_web.com.conf
server {
listen 80;
#server_name web.cry.com;
location / {
proxy_pass http://10.0.0.7:8080; #为抓包用外网网卡
}
}
1.修改后端的web_Server为80端口
2.修改代理服务器,代理的后端为80端口
返回 的结果应该是 web… 返回的结果没有 达到预期? 原因是:proxy_pass 后面跟的是 IP地址:端口,后端只知道你要请求80端口 ,但并不知道你要请求的是哪个域名?(加上如下配置可解决问题)
③ 再反向代理配置文件中加入代理参数
server {
listen 80;
server_name web.cry.com;
location / {
proxy_pass http://10.0.0.7:80;
proxy_set_header Host $http_host; #将用户请求的域名信息赋值给Host 请求头信息。
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #把客户端的真实IP告诉后端的web节点
}
}
④ 配置后端web配置
vim /etc/nginx/conf.d/web.cry.com.conf
server {
listen 80;
server_name web.cry.com;
root /web;
location / {
index index.html;
}
}
⑤ 配置本地劫持
⑥ 浏览器访问web.cry.com
抓包分析
查看日志文件分析(/var/log/nginx/access.log)
tail -f /var/log/nginx/access.log
我们先查看反向代理lb01这台机器的访问日记可以看到10.0.0.0访问到我们10.0.0.5
再查看web01这台机器的访问日记可以看到10.0.0.5反向代理机器的ip访问到我们10.0.0.7web机器上面 最后一列显示真实访问的ip这是因为我们添加了 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
访问日志的格式由/etc/nginx/nginx.conf中的log_format所定义
4.3 nginx反向代理配置参数
①添加发往后端服务器头信息
Syntax(语法):proxy_set_header fied value;
Default: proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
Context: http,server,location
(1) proxy_set_header Host $http_host;
客户端请求HOST的值是web.cry.com那么代理服务会像后端请求时携带host变量为web.cry.com
(2) proxy_set_header X-Forward-For $proxy_add_x_forward_for;
客户端通过代理服务访问后端服务,后端服务会通过变量记录真实客户端地址
(3)proxy_set_header x-Real-IP
将$remote_addr的值放进变量X-Real-IP中,$remote_addr的值为客户端的ip
②代理的向后端请求时使用的HTTP协议,默认1.0版本。如果使用长连接,建议调整为1.1版本协议
Syntax: proxy_http_version 1.0 | 1.1;
Default: proxy_http_version 1.0;
Context: http, server, location
This directive appeared in version 1.1.4.
(4)proxy_http_version 1.1;
③代理到后端的TCP连接,响应,返回等超时时间
#nginx代理与后端服务器连接超时时间(代理连接超时)
Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;
Context: http, server, location
#nginx代理等待后端服务器的响应时间
Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;
Context: http, server, location
#后端服务器数据回传给nginx代理超时时间
Syntax:
proxy_send_timeout time;
Default: proxy_send_timeout 60s;
Context: http, server, location
④proxy_buffer代理缓冲区
4.1启用缓冲,nginx代理服务器将尽快的响应Header以及响应报文,并将其保存到proxy_buffer_size(headers)和proxy_buffers(data)设置的缓冲区中
Syntax: proxy_buffering on | off;
Default: proxy_buffering on;
Context: http, server, location
如果响应的报文过大无法存储至内存,则会将其中部分保存到磁盘上的临时文件中,
写入临时文件由
proxy_temp_path
(控制临时存储目录)
proxy_max_temp_file_size
(控制临时存储目录大小)
proxy_temp_file_write_size
(控制一次写入临时文件的数据大小)限制,
临时文件最大大小由proxy_buffer_size
和proxy_buffers
限制。
temp英语单词缩写
但当禁用缓冲时,nginx代理服务器会在接受到响应时立即同步传递给客户端。nginx代理服务器不会读取整个响应过程
4.2 proxy_buffer_size用于控制代理服务器读取后端第一部分响应header的缓冲区大小
Syntax: proxy_buffers_size size;
Default: proxy_buffers_size 4k|8k;
Context: ``http, server, location
#proxy_buffer_size 64k
4.3 proxy_buffers是代理服务器为单个连接设置响应缓冲区“数量”和“大小”.如果一个后端服务所返回的页面大小为256kb,那么会为其分配4个64KB的缓冲区来缓存,如果页面大小大于256kb,那么大于256kb的部分会缓存到proxy_temp_path指定的路径中。但是这并不是好方法,因为内存中的数据处理速度要快于硬盘,所以这个值一般建议设置为站点响应所产生的页面大小中间值,如果站点大部分脚本所产生的页面大小为256kb,那么可以把这个值设置为“16 16k" 等
Syntax: proxy_buffers number size;
Default: proxy_buffers 8 4k|8k;
Context: http, server, location
⑤代理的局限性
1.代理仅能代理一台后端节点(引入了负载均衡的技术)
2.如果代理需要代理多个后端节点,需要多个locaiton
那么这个时候代理的参数我们为了防止重复书写就把我们需要的代理参数整合到一个文件中,在配置文件中用icloud proxy_params;
调用文件中的代理参数
5.1统一把代理参数放在nginx默认目录(/etc/nginx)下proxy_params文件
[root@lb01 ~]# cat /etc/nginx/proxy_params
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_connect_timeout 60s; # nginx连接后端的超时时间 TCP
proxy_read_timeout 60s; # 响应头部超时时间
proxy_send_timeout 60s; # 响应数据主体的超时时间
proxy_buffering on; # 开启缓冲区
proxy_buffer_size 8k; # 缓冲区Header大小
proxy_buffers 4 64k; # 缓冲区数量 * 大小 = 最大接收
5.2Nginx代理最终配置 —> include proxy_params
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_web.cry.com.conf
server {
listen 80;
server_name web.cry.com;
location / {
proxy_pass http://172.16.1.7:80;
include proxy_params;
}
}