Nginx常见应用
Nginx 最常见的几种应用场景
- 反向代理
- 负载均衡(反向代理某个应用服务器集群)
- 动静分离(可以作为静态服务器来使用)
- Nginx集群部署(实现高可用)
上述应用都会牵扯到nginx.conf配置文件的配置,具体配置详解参见道人另一篇文章。
一:反向代理
示例演示(Nginx服务器反向代理两个tomcat服务)
Nginx服务器部署在192.168.32.133虚机上
web服务器(道人配置的两台虚机)
- 192.168.32.134 上布置tomcat1(端口8080)
- 192.168.32.135 上布置tomcat2(端口8080)
关键在于Nginx配置文件的配置
主要是在http块中的server块中配置 server_name 和 location 这两个属性,详细配置如下。
修改window客户端hosts文件(模仿下域名访问)
- hosts目录是:C:\Windows\System32\drivers\etc
192.168.32.133 www.tomcat1.com
192.168.32.133 www.tomcat2.com
Nginx.conf 配置文件配置如下
...
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 第一个虚拟服务器
server {
listen 80;
# 这里需要修改为你代理的服务器地址
server_name www.tomcat1.com;
location / {
root html;
# 这里要更换为你代理的服务器路径
proxy_pass http://192.168.32.134:8080;
index index.jsp;
}
}
# 第二个虚拟服务器
server {
listen 80;
# 这里需要修改为你代理的服务器地址
server_name www.tomcat2.com;
location / {
root html;
# 这里要更换为你代理的服务器路径
proxy_pass http://192.168.32.135:8080;
index index.jsp;
}
}
}
关键配置:
重启Nginx,访问www.tomcat1.com,和www.tomcat2.com网址,均可正常访问。
二:负载均衡
假设tomcat1,tomcat2布置的是同一服务,Nginx实现请求在两台服务器上均匀分布。
关键配置
http{
...
#设定负载均衡的服务器列表
upstream myserver {
#weigth参数表示权值,权值越高被分配到的机率越大
server 192.168.32.134:8080 weight=1;
server 192.168.32.135:8080 weight=1;
}
server {
#侦听80端口
listen 80;
#定义使用www.xx.com访问
server_name www.xx.com;
#默认请求
location / {
# 代理地址
proxy_pass http://myserver;
root /root; #定义服务器的默认网站根目录位置
index index.php index.html index.htm;
}
}
}
Nginx.conf 配置文件配置如下
在这里提一下,负载均衡算法有以下几种方式。
1、热备:如果你有2台服务器,当一台服务器发生事故时,才启用第二台服务器给提供服务。服务器处理请求的顺序:AAAAAA突然A挂啦,BBBBBBBBBBBBBB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333 backup; #热备
}
2、轮询:nginx默认就是轮询其权重都默认为1,服务器处理请求的顺序:ABABABABAB…
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
}
3、加权轮询:跟据配置的权重的大小而分发给不同服务器不同数量的请求。如果不设置,则默认为1。下面服务器的请求顺序为:ABBABBABBABBABB…
upstream mysvr {
server 127.0.0.1:7878 weight=1;
server 192.168.10.121:3333 weight=2;
}
4、ip_hash:nginx会让相同的客户端ip请求相同的服务器。
upstream mysvr {
server 127.0.0.1:7878;
server 192.168.10.121:3333;
ip_hash;
}
5、关于nginx负载均衡配置的几个状态参数讲解。
-
down,表示当前的server暂时不参与负载均衡。
-
backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。
-
max_fails,允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。
-
fail_timeout,在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
upstream mysvr {
server 127.0.0.1:7878 weight=2 max_fails=2 fail_timeout=2;
server 192.168.10.121:3333 weight=1 max_fails=2 fail_timeout=1;
}
三:动静分离
静态资源:
http块中server块中location如下配置
表示url为 /static/*.xxx 的图片或者js等静态资源则会到/html/static目录下去寻找资源
location /static/~(.*)(\.jpg|\.png|\.gif|\.jepg|\.css|\.js|\.css){
alias html;
}
动态资源:
其他访问url则转发到proxy_pass 指向的 http://192.168.32.135:8080;
location / {
proxy_pass http://192.168.32.135:8080;
}
四:Nginx集群(保证高可用)
解决的是Nginx宕机导致服务不可用的问题。
采用方式:Keepalived+Nginx实现双机热备(主流方案)。
Keepalived高可用软件
Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,keepalived除了能够管理LVS软件外,还可以作为其他服务的高可用解决方案软件。
keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router Redundancy Protocol(虚拟路由冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由的单点故障问题的,它能保证当个别节点宕机时,整个网络可以不间断地运行。所以,keepalived一方面具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功能,另一方面也可以实现系统网络服务的高可用功能。
Nginx双机热备配置示例
准备两台服务器192.168.32.134 192.168.32.135 均安装上Keepalived和Nginx。
Keepalived安装
yum install keepalived -y
安装成功后,/etc 目录下会存在一个keepAlived目录,该目录即是keepAlived的安装目录。
Keepalived 配置文件修改以及说明
Keepalived的配置文件可以分为三块:
- 全局定义块:对整个 Keepalive 配置生效的,不管是否使用 LVS;
- VRRP 实例定义块:是 Keepalived 的核心;
- 虚拟服务器(LVS)定义块:LVS 配置只在使用 Keepalived 来配置和管理 LVS 时才需要使用,如果仅仅使用 Keepalived做 HA,LVS 的配置完全是不需要的。
配置文件的详细说明如下:
global_defs { #全局配置
notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个
[email protected] #指定收件人邮箱
[email protected]
[email protected]
}
notification_email_from [email protected] #指定发件人
smtp_server 192.168.200.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
vrrp_skip_check_adv_addr
vrrp_strict
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_sync_group VG_1{ #监控多个网段的实例
group {
inside_network #实例名
outside_network
}
notify_master /path/xx.sh #指定当切换到master时,执行的脚本
netify_backup /path/xx.sh #指定当切换到backup时,执行的脚本
notify_fault "path/xx.sh VG_1" #故障时执行的脚本
notify /path/xx.sh
smtp_alert #使用global_defs中提供的邮件地址和smtp服务器发送邮件通知
}
vrrp_instance inside_network {
state BACKUP #指定那个为master,那个为backup,如果设置了nopreempt这个值不起作用,主备考priority决定
interface eth0 #设置实例绑定的网卡
dont_track_primary #忽略vrrp的interface错误(默认不设置)
track_interface{ #设置额外的监控,里面那个网卡出现问题都会切换
eth0
eth1
}
mcast_src_ip #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
garp_master_delay #在切换到master状态后,延迟进行gratuitous ARP请求
virtual_router_id 50 #VPID标记
priority 99 #优先级,高优先级竞选为master
advert_int 1 #检查间隔,默认1秒
nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
preempt_delay #抢占延时,默认5分钟
debug #debug级别
authentication { #设置认证
auth_type PASS #认证方式,类型主要有PASS、AH 两种
auth_pass 111111 #认证密码
}
virtual_ipaddress { #设置vip
192.168.36.200
}
}
vrrp_instance VI_1 { #虚拟路由的标识符
state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态
interface eth0 #通信所使用的网络接口
lvs_sync_daemon_inteface eth0 #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。
virtual_router_id 51 #虚拟路由的ID号,是虚拟路由MAC的最后一位地址
priority 100 #此节点的优先级,主节点的优先级需要比其他节点高
advert_int 1 #通告的间隔时间
nopreempt #设置为不抢占 注:这个配置只能设置在backup主机上,而且这个主机优先级要比另外一台高
preempt_delay #抢占延时,默认5分钟
authentication { #认证配置
auth_type PASS #认证方式
auth_pass 1111 #认证密码
}
virtual_ipaddress { #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
192.168.200.16
192.168.200.17
192.168.200.18
}
}
virtual_server 192.168.200.100 443 { #集群所使用的VIP和端口
delay_loop 6 #健康检查间隔,单位为秒
lb_algo rr #lvs调度算法rr|wrr|lc|wlc|lblc|sh|dh
nat_mask 255.255.255.0 #VIP掩码
lb_kind NAT #负载均衡转发规则。一般包括DR,NAT,TUN 3种
persistence_timeout 50 #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了
protocol TCP #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP
persistence_granularity <NETMASK> #lvs会话保持粒度
real_server 192.168.201.100 443 { #真实服务器,包括IP和端口号
weight 1 #默认为1,0为失效
inhibit_on_failure #在服务器健康检查失效时,将其设为0,而不是直接从ipvs中删除
notify_up <string> | <quoted-string> #在检测到server up后执行脚本
notify_down <string> | <quoted-string> #在检测到server down后执行脚本
TCP_CHECK { #通过tcpcheck判断RealServer的健康状态
connect_timeout 3 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 23 健康检查的端口的端口
bindto <ip>
}
HTTP_GET | SSL_GET { #健康检测方式,可选有 SSL_GET、TCP_CHECK、HTTP_GET
url { #检查url,可以指定多个
path / #检查的url路径
digest ff20ad2481f97b1754ef3e12ecd3a9cc #需要检查到的内容。检查后的摘要信息。
status_code 200 #检查的返回状态码
}
url {
path /mrtg/
digest 9b3a0c85a887a256d6939da88aabd8cd
}
connect_timeout 3 #连接超时时间
nb_get_retry 3 #检测尝试几次
delay_before_retry 3 #检测的时间间隔
}
}
}
virtual_server 10.10.10.2 1358 {
delay_loop 6
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
sorry_server 192.168.200.200 1358
real_server 192.168.200.2 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
url {
path /testurl3/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334d
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
real_server 192.168.200.3 1358 {
weight 1
HTTP_GET {
url {
path /testurl/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
url {
path /testurl2/test.jsp
digest 640205b7b0fc66c1ea91c463fac6334c
}
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
本次示例只需做以下关键配置修改
# global_defs块(全局块中)
route_id XXX #MASTER和BACKUP不同
# vrrp_instance块中需修改部分
state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态
interface ens33 #通信所使用的网络接口(道人使用的是虚机,桥联方式)
virtual_router_id 51 #同一个实例下,MASTER和BACKUP相同
priority 100 #优先级,同一个实例下,MASTER高于BACKUP
virtual_ipaddress { #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
192.168.32.50
192.168.32.51
192.168.32.52
}
vrrp_script check_nginx { # check_nginx 为自定义的一个监控名称
script "/etc/keepalived/check_nginx.sh" # 采用脚步呢监控nginx是否正常运行
interval 2 # 检测间隔时间,即两秒检测一次
weight 30 # 一个正整数或负整数。权重值,关系到整个集群角色选举。
}
track_script {
check_nginx # 引用上面定义的监控模块
}
/etc/keepalived/check_nginx.sh 监控脚本内容 (Shell脚本)
A=`ps -C nginx --no-header |wc -l` ## 查看是否有 nginx进程 把值赋给变量A
if [ $A -eq 0 ];then ## 如果没有进程值得为 零
/usr/local/nginx/sbin/nginx
sleep 3
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived ## 则结束 keepalived 进程
fi
fi
最后启动nginx与keepalived
./nginx
systemctl start keepalived.service