反向代理
客户端 A 出于某种原因(如 GFW)无法访问服务器 B,但它能访问服务器 C,服务器 C 能访问服务器 A,那么客户端 A 可通过服务器 C 来访问服务器 B。此时服务器 C 就是一个代理服务器(即正向代理)。
首先将请求发送到服务器 C,服务器 C 将请求转发到服务器 B 并接收服务器 B 返回的响应,最后将响应返回给客户端 A。
客户端 A 请求某项服务器 B 上没有的资源,但服务器 C 上有此资源,服务器 B 请求服务器 C 上的资源,并将它返回给客户端 A。此时服务器 B 即是一个反向代理服务器。
客户端 A 并不知道服务器 B 上是否有它请求的资源,它只管请求、接收。
配置反向代理
将 Nginx 配置为一个反向代理服务器,只需在 location 上下文中设置 proxy_pass 指令即可。如下所示:
location / {
proxy_pass http://192.168.0.214/;
}
此配置会将对本 Nginx(假设为服务器 A)的请求全部转发到位于 192.168.0.214 上的 Nginx(假设为服务器 B)。
客户端对服务器 A 的访问全部被转发到服务器 B,但在服务器 B 的访问日志中记录的访问 IP 是服务器 A 的地址。
记录客户端 IP
若想要在服务器的 B 的访问日志中记录客户端而非服务器 A 的 IP 地址,则需要在服务器 A 和服务器 B 中进行一些配置。在服务器 A(即代理服务器)中的配置如下:
location / {
proxy_pass http://192.168.0.214/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
增加一个 $proxy_add_x_forwarded_for 变量到 X-Forwarded-For 中,$proxy_add_x_forwarded_for 变量包含客户端请求头中的 "X-Forwarded-For" 与 $remote_addr 两部分,它们之间用逗号分隔。
X-Forwarded-For 是一个 HTTP 扩展头部,用来表示 HTTP 请求端的真实 IP,其格式如下:
X-Forwarded-For: client, proxy1, proxy2
若一个 HTTP 请求在到达服务器之前经过了三个代理 Proxy1、 Proxy2 和 Proxy3,它们的 IP 地址分别为 IP1、IP2 和 IP3,客户端的 IP 地址为 IP0,那在服务器端接收到的 X-Forwarded-For 中的信息如下所示:
X-Forwarded-For: IP0, IP1, IP2
Proxy3 与服务器直接相连,它会给 X-Forwarded-For 追加 IP2,表示它是在帮 Proxy2 转发请求。
IP3 可在服务器中通过 $remote_addr 获得,$remote_addr 来自 TCP 连接,表示与服务器建立 TCP 连接的设备 IP。
在服务器 B 中的配置如下:
location / {
...
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
$proxy_add_x_forwarded_for 变量包含客户端请求头中的 X-Forwarded-For 与 $remote_addr 两部分,其中 X-Forwarded-For 包含客户端 IP,$remote_addr 则是与服务器直接相连的代理服务器的 IP。
http {
...
log_format main ‘$remote_addr - $http_x_forwarded_for‘;
...
$remote_addr 是与服务器直接相连的代理服务器的 IP。
$http_x_forwarded_for 变量即是 X-Forwarded-For。
负载均衡
负载均衡即是通过反向代理服务器将客户端的访问分配到不同的后端服务器。HTTP Upstream 模块(即负载均衡模块)通过一个简单的调度算法来实现后端服务器的负载均衡。它目前支持 4 种调度算法,如下所示:
- 轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,宕机的服务器会被自动剔除。
- ip_hash
每个请求按访问 IP 的 hash 结果分配,这使得来自同一个 IP 的访问固定到同一台后端服务器,有效解决了动态网页存在的 session 共享问题。
- fair(第三方)
此算法可以根据页面大小和加载时间长短智能地进行负载均衡,即根据后端服务器的响应时间来分配请求,响应时间短的优先分配。
Nginx 通过 upstream_fair 模块来支持 fair。
- url_hash(第三方)
此算法根据访问 url 的 hash 结果来分配请求,使得每个 url 定向到同一个后端服务器,这可以进一步提高后端缓存服务器的效率。
Nginx 通过 hash 软件包来支持 url_hash。
轮询算法
一个使用轮询算法(带权值)的负载均衡配置如下所示:
server {
...
location / {
proxy_pass http://webservers;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream webservers {
server 192.168.0.214 weight=1 down;
server 192.168.0.179 weight=1 max_fails=2 fail_timeout=2;
server 127.0.0.1:8080 backup;
}
在 upstream 上下文中,可通过 server 指令指定后端服务器的 IP 和端口,还可设定每个后端服务器在负载均衡调度中的状态。常用的状态如下所示:
down,表示当前的 server 暂时不参与负载均衡。
backup,预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时会请求 backup 机器。
max_fails,允许请求失败的次数,默认为 1。当超过最大次数时,返回 proxy_next_upstream 模块定义的错误。
fail_timeout(和 fail_timeout 一起使用),在经历了 max_fails 次失败后暂停服务的时间。
weight 参数用来指定轮询权值,其值越大,分配到的访问机率越高,它主要用于后端每个服务器性能不均的情况下。
ip_hash 算法
一个使用 ip_hash 算法的负载均衡配置如下所示:
server {
...
location / {
proxy_pass http://webservers;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream webservers {
ip_hash
server 192.168.0.214 weight=1 max_fails=2 fail_timeout=2;
server 192.168.0.179 weight=1 max_fails=2 fail_timeout=2;
}
调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能有 backup,也不能指定 weight 权值。
若存在 backup 服务器,且负载均衡将某个用户分配到该服务器,那么此用户将一直不能访问服务器。
原文地址:https://www.cnblogs.com/reghao/p/8536628.html