一、常见内置变量
| 内置变量 | 说明 |
|---|---|
| $uri | 请求的URL,不包括主机和参数 |
| $request_uri | 请求的URL,包括主机和参数 |
| $host | 请求的主机名 |
| $http_user_agent | 客户端信息,浏览器和操作系统 |
| $remote_addr | 客户端IP地址 |
| $remote_port | 客户端端口 |
| $server_addr | 服务端IP地址 |
| $server_port | 服务端端口 |
| $request_method | 请求方式 |
| $scheme | 请求协议 |
| $request_filename | 请求的资源路径 |
| $doucument_root | 请求的资源根目录 |
| X-Real-IP | 客户端的真实IP地址 |
| X-Forwarded-For | 客户端IP地址和代理IP地址 |
二、代理
代理是客户端和服务端的中间人,客户端通过代理访问服务端。代理又分为正向代理和反向代理。从网络参考模型的角度来看,正向代理属于七层代理,反向代理包括四层代理和七层代理。
四层代理和七层代理的区别:
- 四层代理是基于TCP的代理转发,基于IP地址和端口的形式实现代理。四层代理无法获取HTTP请求中的URL信息,只能进行数据转发。四层代理是由内核进行转发,速度更快。
- 七层代理是基于HTTP的代理转发,可以处理HTTP的请求和响应,收到HTTP请求后,会根据代理方式将HTTP请求转发到服务端。可以对HTTP请求进行分析、处理,对请求内容做路由、流量控制、内容过滤等。七层代理是基于应用层代、用户态处理,速度较慢,但是更加安全可靠。
目前能够同时进行四层代理和七层代理的应用只有Nginx、Haproxy。
1. 正向代理
正向代理需要对请求进行处理,属于七层代理。正向代理是面向客户端的,代理客户端、隐藏客户端。客户端想要访问网页,但是无法直接访问,可以通过正向代理访问。服务端只知道代理IP地址,不知道客户端IP地址;客户端知道代理和服务端的IP地址。
1.1 固定地址正向代理
-
新增一个Nginx的server模块,具体配置如下。
server { listen 8888; server_name localhost; # 设置DNS解析地址 resolver 218.2.135.1 valid=300 ipv6=off; # 设置解析服务超时时间 resolver_timeout 3s; # 设置代理服务器读取数据超时时间 proxy_read_timeout 30s; # 设置代理服务器发送数据超时时间 proxy_send_timeout 30s; # 设置代理服务器连接服务端超时时间 proxy_connect_timeout 30s; # 固定代理地址 set $url "www.baidu.com"; location / { # 请求转发 proxy_pass http://$url; # 正向代理缓存配置 # 设置缓冲区的个数和单个大小 proxy_buffers 256 4k; # 不保存响应数据的临时文件,防止文件过多 proxy_max_temp_file_size 0; # 状态码是200和302的缓存有效期是1分钟 proxy_cache_valid 200 302 1m; # 状态码是301的缓存有效期是1小时 proxy_cache_valid 301 1h; # 其他状态码的缓存有效期是1分钟 proxy_cache_valid any 1m; } } -
保存文件后,检查配置语法是否存在问题,重启Nginx服务。
nginx -t systemctl restart nginx -
在主机的浏览器中输入本机IP和端口,或者使用curl命令获取网页,查看是否实现正向代理。
curl 192.168.1.128:8888
1.2 变化地址正向代理
-
新增一个Nginx的server模块,具体配置如下。
server { listen 8889; resolver 218.2.135.1; resolver_timeout 3s; location / { # 自动设置代理的请求地址 proxy_pass $scheme://$http_host$request_uri; # 在请求头中传递客户端的host信息 proxy_set_header Host $http_host; # 设置客户端请求中包含真实IP地址 proxy_set_header X-Real-IP $remote_addr; # 设置客户端经过的代理地址 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 传递客户端请求的协议信息 proxy_set_header X-Forwarded-Proto $scheme; # 传递客户端的主机名 proxy_set_header X-Forwarded-Host $host; # 传递客户端的请求端口 proxy_set_header X-Forwarded-Port $server_port; proxy_buffers 256 4k; proxy_max_temp_file_size 0; proxy_cache_valid 200 302 1m; proxy_cache_valid 301 1h; proxy_cache_valid any 1m; } } -
保存文件后,检查配置语法是否存在问题,重启Nginx服务。
nginx -t systemctl restart nginx -
使用curl命令通过传参的方式获取网页,查看是否实现正向代理。
# curl -x 代理URL 目标URL curl -x 192.168.1.128:8889 www.baidu.com
2. 反向代理
反向代理包含四层代理和七层代理,代理服务端、隐藏服务端。客户端向代理发起请求,代理根据一定的策略(负载)将请求发送到服务端。客户端不知道请求的服务端具体IP,代理服务器隐藏了服务端具体的IP地址。
负载均衡是一种流量分发机制,根据算法将流量分发到不同的后端服务器,以实现服务端的高可用,也就是备灾。
负载均衡的常见算法:
- 轮询:负载均衡默认算法,会将请求轮流分发给后端服务器,适用于后端服务器处理能力相近时。
- 加权轮询:根据后端服务器的处理能力赋予不同的权重,处理能力高的服务器权重高,处理能力低的服务器权重低。流量高峰时期可以实现流量分发优化,适用于后端服务器处理能力差异大时。
- IP Hash:请求后端服务器,会使用Hash算法计算出IP地址的Hash值,然后再把请求发送到对应的后端服务器。如果客户端IP地址一致,下一次的请求会再次发送到对应的服务端,保证会话的稳定。因此要实现会话保持可以使用ip Hash算法。
- 最小链接数:将请求发送到当前连接较少的后端服务器,这种算法适用于后端服务器处理任务耗时不同的情况,可以有效避免请求集中在处理能力更强的后端服务器。
- URL Hash:根据URL路径来计算Hash值,请求的URL路径相同,客户端的请求会被发送到同一台服务器上。
负载均衡的特点:
- 根据算法将流量分发给不同的后端服务器。
- 客户端访问的是代理地址,响应也是来自代理服务器。
- 客户端不了解后端服务器情况,不知道具体的IP地址。
- 提高了安全性,后端服务器是隐藏的。
- 负载均衡是有缓存的,可以直接访问缓存,提高响应速度。
2.1 七层反向代理
七层反向代理使用upstream语法,配置在http模块中,进行请求中的HTTP处理。
-
轮询基本配置。
在http模块中定义一个upstream模块,然后在location模块调用。轮询是负载均衡的默认策略,可以不用进行设置。
upstream backend { server 192.168.1.129; server 192.168.1.130; } location / { root html; index index.html index.htm; proxy_pass http://backend; } -
加权轮询基本配置。
在http模块中定义一个upstream模块,然后在location模块调用。通过weight设置权重。
upstream backend { server 192.168.1.129 weight=3; server 192.168.1.130 weight=1; } location / { root html; index index.html index.htm; proxy_pass http://backend; } -
IP Hash基本配置。
在http模块中定义一个upstream模块,然后在location模块调用。使用ip_hash开启IP Hash策略。
upstream backend { ip_hash; server 192.168.1.129; server 192.168.1.130; } location / { root html; index index.html index.htm; proxy_pass http://backend; } -
最小连接数基本配置。
在http模块中定义一个upstream模块,然后在location模块调用。使用least_conn开启最小连接数策略,通常还会和权重weight搭配使用。
upstream backend { least_conn; server 192.168.1.129 weight=3; server 192.168.1.130 weight=2; } location / { root html; index index.html index.htm; proxy_pass http://backend; } -
URL Hash基本配置。
在http模块中定义一个upstream模块,然后在location模块调用。使用hash设置根据URL路径计算hash值。
upstream backend { hash $request_uri; server 192.168.1.129; server 192.168.1.130; } location / { root html; index index.html index.htm; proxy_pass http://backend; }
2.2 四层反向代理
四层反向代理使用stream语法,配置全局模块中。用于流量的转发,不涉及请求的处理,所以只允许轮询、加权轮询和最小连接数等策略。
在配置文件的全局模块中新增一个stream模块,其中包括upstream模块和server模块。需要注意的是端口号不能够和http模块中的server模块设置的端口号相同,否则会产生端口占用,导致Nginx服务无法正常启动。
-
轮询基本配置。
stream { upstream backend { server 192.168.1.129:80; server 192.168.1.130:80; } server { listen 81; proxy_pass backend; } } -
加权轮询基本配置。
stream { upstream backend { server 192.168.1.129:80 weight=3; server 192.168.1.130:80 weight=1; } server { listen 81; proxy_pass backend; } } -
最小连接数基本配置。
stream { upstream backend { least_conn; server 192.168.1.129:80; server 192.168.1.130:80; } server { listen 81; proxy_pass backend; } }

1454

被折叠的 条评论
为什么被折叠?



