1、Nginx中虚拟主机的实现
虚拟主机可以实现将多个域名指向到同一个IP上,且不同的域名对应不同的站点。通过Nginx可以很简单的实现虚拟主机的功能。
Nginx配置文件中的http部分可以包含多个server,而每一个server即为一个虚拟主机。
一个例子:在一台运行Nginx的主机上设置三个虚拟主机,分别对应域名www.aaa.com、www.bbb.com和www.ccc.com,三个虚拟主机的根目录分别为/myweb/www目录下的目录aaa、bbb和ccc。
配置如下(仅展示server和location中有关部分的配置):
http { # 虚拟主机www.aaa.com server{ listen 80; server_name www.aaa.com; location / { root /myweb/www/aaa; index index.html index.htm; } } # 虚拟主机www.bbb.com server{ listen 80; server_name www.bbb.com; location / { root /myweb/www/bbb; index index.html index.htm; } } # 虚拟主机www.ccc.com server{ listen 80; server_name www.ccc.com; location / { root /myweb/www/ccc; index index.html index.htm; } } }
2、Nginx中负载均衡的实现
负载均衡可以有效的解决在大访问量状态下单一主机负载过高导致性能下降的问题,通过负载均衡可以将一台主机的压力分配给一组主机,根据负载均衡调度算法决定将请求如何分配给这组主机中的每一台主机。
2.1、Nginx支持的负载均衡调度算法
Nginx负载均衡模块目前支持以下四种调度算法:
- 轮询,Nginx的默认负载均衡调度算法,每个请求按照时间顺序逐一分配到不同的后端主机;如果某台主机down掉,故障系统会自动剔除该主机,用户的访问不会受到影响
- ip_hash,每个请求按照访问的IP的hash值进行分配,这样来自同一个IP的客户端固定访问一台后端主机,有效解决了动态网页存在的session共享问题
- fair,比上面两种更加智能的负载均衡算法,根据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端主机的响应时间来分配请求,响应时间短的主机优先分配;该算法为第三方算法,使用该算法必须安装Nginx的upstream_fair模块
- url_hash,按照访问URL的hash值来分配请求,使每个URL定向到同一个后端主机,可以进一步提高后端缓存服务器的效率;该算法为第三方算法,使用该算法必须安装Nginx的hash软件包
2.2、负载均衡组中主机的状态设定
除了指定负载均衡算法,还可以设定每台主机在负载均衡调度中的状态,常用的状态有:
- weight:指定轮询的权重,值越大分配到的请求几率越多,主要用于后端主机性能不均的情况下
- down:当前主机暂不参与负载均衡
- backup:预留的备用主机,当其他的所有非backup主机出现故障或忙时,才会请求当前主机
- max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream模块定义的错误
- fail_timeout:在经历了max_fails定义的失败次数后,暂停服务的时间。通常配合max_fails一起使用
注意:使用ip_hash算法时,后端主机不能设置weight和backup。
2.3、负载均衡的实现方式
负载均衡主机组在Nginx中的http部分通过upstream进行定义,组中的主机通过server指令进行定义,具体实现方式如下:
http{ upstream 负载均衡组名称 { server 主机1[:端口] 状态; server 主机2[:端口] 状态; ... server 主机n[:端口] 状态; 算法; } }
Nginx通过反向代理来将客户端发送的请求分配给负载均衡主机组,此时反向代理的后端就是一组主机了。在配置文件中将反向代理指向这组负载均衡主机组的自定义名称就行了。
2.4、一个例子:配置一个简单的轮询负载均衡实例
实验环境:
- 主机A:IP地址为192.168.0.110,Nginx版本为1.14.2
- 主机B:IP地址为192.168.0.88,Nginx版本为1.14.2
- 主机C:IP地址为192.168.0.106,Nginx版本为1.14.2
- 主机D:IP地址为192.168.0.61,Nginx版本为1.14.2
主机A做为前端服务器提供负载均衡调度功能,主机BCD做为后端服务器提供WEB服务。环境中直接通过IP地址访问,没有做域名解析。
我们首先来访问下这四台主机,以确保它们的Nginx能够正常提供服务:
四台主机的Nginx均能正常提供服务。接下来对主机A的Nginx进行配置,以实现负载均衡(仅展示http、server和location中相关的配置部分):
http{ upstream servers { server 192.168.0.88 max_fails=3 fail_timeout=20s; server 192.168.0.106 max_fails=3 fail_timeout=20s; server 192.168.0.61 max_fails=3 fail_timeout=20s; } server { listen 80; server_name localhost 192.168.0.110; location / { proxy_pass http://servers; proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; } } }
此时访问http://192.168.0.110,查看结果:
因为我们使用的是轮询的负载均衡算法,所以请求会依次分配给后端的三台主机。