Nginx学习笔记:反向代理+负载均衡

Nginx能做什么

  1. HTTP服务器(包括动静分离)
  2. 反向代理
  3. 负载均衡

1.HTTP服务器(动静分离)

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

简单配置

server {
    listen 80;
    autoindex on;#默认为off
    server_name localhost;
	location / {
		root /static; 
	} 
}

当访问localhost:80的时候,会默认访问/static文件夹的文件。

这里为了方便调试,可以加上autoindex on;访问的时候就会自动生成文件目录,如图


2.反向代理

想要理解什么是反向代理,要先理解什么是正向代理

2.1正向代理

我们学生交作业,只要交给课代表,然后由课代表把作业交给老师。

这里就是正向代理,多个用户(学生)通过代理(课代表)把任务(作业)交给服务器(老师)


正向代理,代理的是客户端

2.2反向代理

加入我们打电话给114,114后台肯定有很多接话员,但我们拨号的时候不需要考虑这么多,直接打114就行了,具体的114会分配给你一个不忙的接话员。作为用户,我们感受不到任何差别。这就是反向代理


反向代理,代理的是服务器

2.3总结:

正向代理代理客户端,反向代理代理服务器

2.4反向代理的好处

  1. 保护了真实的web服务器,web服务器对外不可见,外网只能看到反向代理服务器,而反向代理服务器上并没有真实数据,因此,保证了web服务器的资源安全。
  2. 反向代理为基础产生了动静资源分离以及负载均衡的方式,减轻web服务器的负担,加速了对网站访问速度
  3. 节约了有限的IP地址资源,企业内所有的网站共享一个在internet中注册的IP地址,这些服务器分配私有地址,采用虚拟主机的方式对外提供服务;

反向代理在Nginx.conf的简单配置

server {
    listen 666;
    server_name localhost;
    location / {
    proxy_pass http://localhost:777;  
    }
}

server块可以理解为一个虚拟主机,此时我们如果调用的是http://localhost:666时,会将这个请求转发到http://localhost:777

3.负载均衡

一、内置负载策略
Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html

  • 轮循(默认) :Nginx根据请求次数,将每个请求均匀分配到每台服务器
  • 最少连接 :将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
  • IP Hash :绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。

3.1轮循(默认) 

http {
    upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com down;
        server srv3.example.com backup;
        server srv4.example.com max_fails=1;
        server srv5.example.com weight=2 max_fails=3 fail_timeout=15;
 }
    server {
        listen 80;
        location / {
            proxy_pass http://myapp1;
        }
    }
}

upstream 中server的属性:

  • down:表示单前的server暂时不参与负载 
  • weight:默认为1.weight越大,负载的权重就越大。 
  • max_fails:默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。
  • fail_timeout:默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
  • backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
  • max_conns:限制分配给某台Server处理的最大连接数量,超过这个数量,将不会分配新的连接给它。默认为0,表示不限制。注意:1.5.9之后的版本才有这个配置

下面讲解几个重要的属性

weight

默认为1,将请求平均分配给每台server

upstream tomcats {
    server 192.168.0.100:8080 weight=2;  # 2/6次
    server 192.168.0.101:8080 weight=3;  # 3/6次
    server 192.168.0.102:8080 weight=1;  # 1/6次
}

上例配置,表示6次请求中,100分配2次,101分配3次,102分配1次

max_fails与fail_timeout

upstream tomcats {
    server 192.168.0.100:8080 weight=2 max_fails=3 fail_timeout=15;
    server 192.168.0.101:8080 weight=3;
    server 192.168.0.102:8080 weight=1;
}

192.168.0.100这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它。

max_connect

upstream tomcats {
    server 192.168.0.100:8080 max_conns=1000;
}
表示最多给100这台Server分配1000个请求,如果这台Server正在处理1000个请求,nginx将不会分配新的请求给到它。假如有一个请求处理完了,还剩下999个请求在处理,这时nginx也会将新的请求分配给它。

3.2最少连接 

另一个负载均衡方式是least-connected/最少连接。当某些请求需要更长时间来完成时,最少连接可以更公平的控制应用实例上的负载。
使用最少连接负载均衡时,nginx试图尽量不给已经很忙的应用服务器增加过度的请求, 而是分配新请求到不是那么忙的服务器实例。
nginx中通过在服务器集群配置中使用least_conn指令来激活最少连接负载均衡方法:

upstream myapp1 {
    least_conn;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

3.3会话持久化(ip-hash)

请注意,在轮询和最少连接负载均衡方法中,每个客户端的后续请求被分派到不同的服务器。对于同一个客户端没有任何方式保证发送给同一个服务器。
ip-hash策略可以将一个客户端绑定给某个特定的应用服务器,也就是让客户始终访问某一个特定的服务器。
使用时,客户端IP地址作为hash key使用,用来决策选择服务器集群中的哪个服务器来处理这个客户端的请求。这个方法保证从同一个客户端发起的请求总是定向到同一台服务器,除非服务器不可用。

要配置使用ip-hash负载均衡,只要在服务器集群配置中使用ip_hash指令:

upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

参考:

http://nginx.org/en/docs/http/load_balancing.html

https://juejin.im/post/5b2cf79af265da596019661e

https://skyao.gitbooks.io/learning-nginx/content/documentation/HTTP_load_balancer.html


猜你喜欢

转载自blog.csdn.net/CrankZ/article/details/80800245