nginx系列4-负载均衡和反向代理
1. 反向代理
nginx的反向代理主要通过proxy_pass指令,用在location块中。
location / {
proxy_pass http://localhost:8080;
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_buffering:控制本内容块下是否启用缓冲,默认是"on"。
proxy_buffers:有两个参数,第一个控制缓冲区请求数量,第二个控制缓冲区大小。默认值为8个、一页(一般是4k或8k)。这个值越大,缓冲的内容越多。
proxy_buffer_size:后端回复结果的首段(包含header的部分)是单独缓冲的,此配置就是配置这部分缓冲区的大小。这个值默认与proxy_buffer的值相同,我们可以把它设置得小一些,因为header内容一般比较少。
proxy_busy_buffers_size:设置被标记为"client-ready"(客户端就绪)的缓冲区大小。客户端一次只能从一个缓冲读取数据,而缓冲是按照队列次序被分批发送给客户端的。此语法配置的就是这个队列的大小。
proxy_temp_path:定义nginx存储临时文件路径。
proxy_max_temp_file_size:每个请求可以存储临时文件的目录大小。如果上游发来的结果太大以至于无法放入一个缓冲,则nginx会为其创建临时文件。
2.负载均衡
nginx负载均衡用的是upstream指令。
upstream的参数
- server :服务地址加端口
- weight:权重
- max_fails:失败多少次 认为主机已挂掉则,踢出
- fail_timeout:踢出后重新探测时间
- backup:备用服务
- max_conns:允许最大连接数
- slow_start:当节点恢复,不立即加入
- down :表示单前的server暂时不参与负载
负载均衡的算法:
(1)轮询(默认算法)
默认选项,当weight不指定时,各服务器weight相同, 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstream names{
server 127.0.0.1:8050 ;
server 127.0.0.1:8060 ;
}
(2)权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
upstream test{
server 192.168.1.10 weight=1;
server 192.168.1.11 weight=2;
}
(3)ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题,实现session共享。如果后端服务器down掉,要手工处理。
upstream test{
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
这个可以当做解决session共享的一个方案。
(4)fair(第三方插件)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream test{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
fair;
}
(5)url_hash(第三方插件)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存服务器时比较有效。 在upstream中加入hash语句,hash_method是使用的hash算法。
upstream resinserver{
server 192.168.1.10:8080;
server 192.168.1.11:8080;
hash $request_uri;
hash_method crc32;
}
3.方向代理和负载均衡
反向代理和负载均衡怎么配合使用,重点就在于反向代理的域名和upstream的名字要一样。
注意upstream配置必须在http中,不能在server中。
http {
include mime.types;
default_type application/octet-stream;
upstream servers {
server 192.168.1.3:80 max_fails=3 fail_timeout=30s weight=2;
server 192.168.1.4:80 max_fails=3 fail_timeout=30s weight=2;
server 192.168.1.5:80 max_fails=3 fail_timeout=30s weight=2;
}
server {
listen 80;
server_name aaa.com;
access_log logs/host.access.log main;
location / {
proxy_pass http://servers;
proxy_cache one;
proxy_set_header X-Forwarded-For $remote_addr;
}
}}
4.反向代理的路径传递
在使用反向代理proxy_pass时,有个访问路径向反向代理服务器传递路径的问题。在proxy_pass参数路径后无/,将会把访问路径除域名和端口号以外全路径进行传递。如果有/,只会传递未匹配路径。
server {
listen 80;
server_name aaa.com;
#proxy_pass路径后无/,访问路径:172.168.0.1:8080/nginx/path1/path2
location /nginx/path1 { #匹配路径/nginx/path1,剩余路径/path2
proxy_pass http://172.168.0.2:8081;#此处未关闭,传递整个路径/nginx/path1/path2到目标ip:port
}
#proxy_pass路径后有/,访问路径:172.168.0.1:8080/nginx/path1/path2
location /nginx/path1 {#匹配路径/nginx/path1,剩余路径/path2
proxy_pass http://172.168.0.2:8081/;#此处关闭,只传递/path2到目标ip:port
}
}
除了这个外,root和alias也有相同的意思,root会带上全路径,alias不会。注意:使用root和alias时,url 以 /结尾时,指的是一个目录,nginx认为用户没有指定文件,此时使用index。url 不是以 / 结尾,认为它是个文件,尝试打开这个文件,此时index命令不启用。
server {
listen 80;
server_name aaa.com;
#proxy_pass路径后无/,访问路径:172.168.0.1:8080/nginx/path1/path2
location /nginx/path1 { #匹配路径/nginx/path1,剩余路径/path2
proxy_pass http://172.168.0.2:8081;#此处未关闭,传递整个路径/nginx/path1/path2到目标ip:port
}
#proxy_pass路径后有/,访问路径:172.168.0.1:8080/nginx/path1/path2
location /nginx/path1 {#匹配路径/nginx/path1,剩余路径/path2
proxy_pass http://172.168.0.2:8081/;#此处关闭,只传递/path2到目标ip:port
}
#访问路径:172.168.0.1:8080/nginx/path1/a.html
location /path1 {#匹配路径/path1,剩余路径/a.html
# root html/;#root声明,在html文件夹,查找/path1/a.html文件
}
#访问路径:172.168.0.1:8080/nginx/path1/a.html
location /path1 {#匹配路径/target,剩余路径/a.html
alias html/static/;##alias声明,在html/static/文件夹,查找a.html文件
}
}
5.nginx常见的执行阶段
nginx运行阶段: rewrite阶段、access 阶段以及 content 阶段。三个是按顺序执行的,先执行rewrite阶段,这时候常见指令有set。然后执行access 阶段常见指令有allow、deny。然后是content 阶段,常见指令有echo。
上一篇: Java实现整数分解质因数的方法示例
下一篇: 详解Android平台上读写NFC标签