反向代理
// nginx/conf/nginx.conf
http {
// ......
upstream local { # 配置上游服务器
server 127.0.0.1:8080; --> 转发给本机上的监听8080端口的服务
}
server {
server_name test.abc.cn;
listen 80;
location / {
proxy_redirect off; # 禁用所有 proxy_redirect 指令
# 让上游服务器获得真实的用户IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://local; #Nginx代理转发给上游服务器
}
}
}
- 配置了反向代理之后,浏览器是和
Nginx
服务器直接建立的连接,Nginx
又和上游服务器建立连接,那么上游服务器获取的域名和IP
其实是Nginx
服务器的,而不是浏览器的;# 把浏览器的域名和`IP`转交给上游服务器的配置 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
-
proxy_cache
:缓存配置,让Nginx
缓存一些不常变化的数据,利用Nginx
的高性能,高效处理请求;proxy_cache_path /tmp/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { //... location / { //...... proxy_cache my_cache; #缓存的共享内存名 proxy_cache_key $host$uri$is_args$args; proxy_cache_valid 200 304 302 ld; #指定不返回的响应 proxy_pass http://local; #反向代理 } }
-
proxy_cache_path
设置缓存路径,大小,文件命名方式等信息;共享内存命名为my_cache
,大小为10M
,路径为/tmp/nginx
-
proxy_cache_key
设置缓存的key
,同一个URL
对不同用户的展示内容可能是不同的,用户作为一个变量,以key-value
的形式缓存共享内存中; -
proxy_cache_valid
状态为200 304 302
的缓存内容,在1天
后过期; -
proxy_ignore_headers Set-Cookie Cache-Control;
尤其要忽略set-cookie
-
-
proxy_redirect
在做反向代理功能时,有时会出现重定向的url
不是期望的,使用proxy_redirect
可以设置url
重定向,其作用是对发送给客户端的URL
进行修改。# 语法:proxy_redirect [ default|off|redirect replacement ]; # 配置块:http、server、location proxy_redirect default; # 默认
负载均衡
反向代理引出了服务器集群的负载均衡
http {
upstream nodes {
// ...
}
server {
// ...
}
}
-
upstream
指令用于配置上游服务器,可以有多个upstream
指令,一个upstream
指令又可以配置多个上游服务器; -
upstream
指令对配置的上游服务器按照默认的轮询方式进行请求。如果上游服务器挂掉,能自己主动剔除,无需手动干预; - 但如果上游服务器在配置不均衡的情况下,是解决不了负载均衡的,所以还需要
nginx
的其他配置。
负载均衡的常用算法
-
轮循
轮询是负载均衡中较为基础也较为简单的算法,它不需要配置额外参数。
假设配置文件中共有M
台服务器,该算法遍历服务器节点列表,并按节点次序每轮选择一台服务器处理请求。当所有节点均被调用过一次后,该算法将从第一个节点开始重新一轮遍历。
特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。 -
加权轮询
为了避免普通轮询带来的弊端,加权轮询应运而生。在加权轮询中,每个服务器会有各自的weight
。一般情况下,weight
的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。
特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。 -
IP
哈希
ip_hash
依据发出请求的客户端IP
的hash
值来分配服务器,该算法可以保证同IP
发出的请求映射到同一服务器,或具有相同hash
值的不同IP
映射到同一服务器。
特点:该算法在一定程度上解决了集群部署环境下Session
不共享的问题。Session
不共享问题是说,假设用户已经登录过,此时发出的请求被分配到了A
服务器,但A
服务器突然宕机,用户的请求则会被转发到B
服务器。但由于Session
不共享,B
无法直接读取用户的登录信息来继续执行其他操作。实际应用中,我们可以利用
ip_hash
,将一部分IP
下的请求转发到运行新版本服务的服务器,另一部分转发到旧版本服务器上,实现灰度发布。再者,如遇到文件过大导致请求超时的情况,也可以利用ip_hash
进行文件的分片上传,它可以保证同客户端发出的文件切片转发到同一服务器,利于其接收切片以及后续的文件合并操作。
4、其他算法
-
URL hash
url_hash
是根据请求的URL
的hash
值来分配服务器。
特点:相同URL
的请求会分配给固定的服务器,当存在缓存的时候,效率一般较高。然而Nginx
默认不支持这种负载均衡算法,需要依赖第三方库。 - 最小连接数
(Least Connections)
假设共有M
台服务器,当有新的请求出现时,遍历服务器节点列表并选取其中连接数最小的一台服务器来响应当前请求。连接数可以理解为当前处理的请求数。
upstream配置
- 权重配置
-
weight
和请求数量成正比,主要用于上游服务器配置不均衡的情况下
upstream nodes { server 192.168.10.1:8668 weight=5; server 192.168.10.2:8668 weight=10; }
-
192.168.10.2
机器的请求量是192.168.10.1
机器的2
倍。
-
-
ip_hash
配置
每一个请求按照请求ip
的hash
结果分配,这样每一个请求固定访问同一个上游服务器,能够解决ip
会话session
在同一台服务器的问题。upstream nodes { ip_hash; server 192.168.10.1:8668 weight=5; server 192.168.10.2:8668 weight=10; }
-
fair
配置
按上游服务器的响应时间来分配请求,响应时间短的优先分配upstream nodes { server 192.168.10.1:8668 weight=5; server 192.168.10.2:8668 weight=10; fair; }
-
url_hash
配置
按照访问url
的hash
结果来分配请求,使每一个url
定向到同一个上游服务器upstream nodes { server 192.168.10.1:8668 weight=5; server 192.168.10.2:8668 weight=10; hash $request_uri; hash_method crc32; #使用的hash算法 }
upstream的常用配置项
-
down
:表示当前的server
不參与负载均衡 -
weight
:默认1
,weight
越大,负载的权重就越大,分配到请求的几率越大 -
max_fails
:请求失败的次数,默认1
-
fail_timeout
:max_fails
次失败后,暂停请求此台服务器的时间 -
backup
:其他全部的非backup
机器down
或者忙的时候,请求backup
机器。所以这台机器压力会最轻upstream nodes { ip_hash; server 192.168.10.1:8668 down; server 192.168.10.2:8668 weight=2; server 192.168.10.3:8668; server 192.168.10.4:8668 backup; }
server指令节点
server {
listen 80; #Nginx监听的端口号
server_name www.test.com; # 访问的域名
location / {
root /root; #定义服务器的默认网站根目录位置
index index.php index.html index.htm; #定义首页索引文件的名称
#以下是一些反向代理的配置可删除.
proxy_redirect off;
#让上游Web服务器可以获取用户的真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存大小,大于这个值,将从upstream服务器传
......
proxy_pass http://nodes; #请求转向
proxy_connect_timeout 500ms; #Nginx连接上游服务器的超时时间,默认60s
}
location /buy {
proxy_pass http://172.18.144.23:5789/; # 转发到指定服务器
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
- 为了便于管理,可以在
nginx/conf
下创建目录如vhost
- 在
vhost
目录下新建一些文件,如a.conf,b.conf,c.conf
,在其中管理server
等指令节点 - 在主配置配置文件
nginx/conf/nginx.conf
中,使用include
引入其他配置文件
http {
include vhost/*.conf; #引入nginx/conf/vhost目录下的、后缀名为.conf的文件
}
网友评论