欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nginx系列4-负载均衡和反向代理

程序员文章站 2024-02-21 10:16:04
...

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。

相关标签: 负载均衡