一 、nginx介绍
1.简介
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。
2.正向代理
用正向代理来进行上网等功能, 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。
通过代理服务器来访问真实服务器的过程 就叫正向代理。正向代理需要在客户端进行配置代理服务器
例如,我们用的vpn ,国内直接访问不了google , 通过vpn的服务器代理我们访问对应的站点,就可以访问
3.反向代理
反向代理 是代理服务器端, 当客户端发送请求时,请求先到代理服务器,代理服务器再把请求选择发送到目标服务器,代理服务器获取目标服务器的数据后,在返回给客户端.这个过程代理服务器代理的是真实服务器端,客户端对代理无感知,不知道请求的真实服务器的IP地址.
在不用反向代理的时候, 我们请求的是真实服务器,可以知道真实服务器的ip; 反向代理之后,请求的是代理服务器,代理服务器访问真实服务器,从而隐藏了真实服务器,而暴露的是代理服务器,代理服务器需要配置真实服务器
3.1反向代理和正向代理的区别
-
正向代理,需要客户端配置代理服务器;反向代理,则需要在代理服务器配置真实服务器
-
正向代理是代理服务器代理客户端发送请求;反向代理是代理服务器端接受请求
-
因为正向代理 是代理客户端发送请求,所以对于服务端,客户端是隐藏的;
反向代理是代理服务端接受请求,所以对于客户端,服务端是隐藏的
在完整的请求和响应的交互中,客户端的请求通过代理服务器,代理服务转发客户端请求到真实服务端,即正向代理;
服务端响应请求到代理服务器,代理服务器发送响应数据到客户端,即反向代理
4.负载均衡
4.1 负载均衡理解
-
负载均衡(Load Balance) , 其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。
-
负载均衡的核心是:将负载进行平衡。
4.2 nginx的负载均衡
通过增加服务器的数量,将请求分发到各个服务器上,将原先的请求集中到单个服务器上的情况改为 将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
Nginx服务器的负载均衡策略可以划分为两大类:即内置策略和扩展策略。内置策略主要包含轮询、加权轮询和IP hash三种;扩展策略主要通过第三方模块实现,种类比较丰富,常见的有url hash、fair等。
在传统的客户端和服务端的交互中, 客户端直接请求服务端。但是随着业务量越来越大,单一架构下服务器需要处理的也越来越多. 服务器的并发能力是有限的,例如tomcat的默认并发能力是150,当然是可以配置的.实际运用中,最大并发数与硬件性能和CPU数量都有很大关系的。更好的硬件,更多的处理器都会使Tomcat支持更多的并发。
针对以上情况的解决方案:
(1) 服务器进行硬件升级:采用高性能服务器替换现有低性能服务器。 该方案的弊端:
高成本:高性能服务器价格昂贵,需要高额成本投入,而原有低性能服务器被闲置,造成资 源浪费。
可扩展性差:每一次业务量的提升,都将导致再一次硬件升级的高额成本投入,性能再卓越 的设备也无法满足当前业务量的发展趋势。
(2) 组建服务器集群,利用负载均衡技术在服务器集群间进行业务均衡。
该方案的优势: 低成本
可扩展性:当业务量增长时,系统可通过增加服务器来满足需求,且不影响已有业务,不降低服务质量
高可靠性:单台服务器故障时,由负载均衡设备将后续业务转向其他服务器,不影响后续业 务提供,保证业务不中断。
5.动静分离
动静分离是指在web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口,分开在不同系统(服务器)访问的架构设计方法,进而提升整个服务访问性能和可维护性。
二、Nginx 的安装(Linux)
2.1 下载
nginx: 下载 (p2hp.com)
下载后上传,或者直接用 wget命令
2.2 安装
1、下载源代码包
[root@web03 ~]# wget https://nginx.org/download/nginx-1.20.1.tar.gz
2、解压
[root@web03 ~]# tar -xf nginx-1.20.1.tar.gz
3、进入nginx目录并且设置系统配置参数
[root@web03 ~]#cd nginx-1.20.1
[root@web03 nginx-1.20.1]# ./configure --help
[root@web03 nginx-1.20.1]# ./configure --with-http_ssl_module --with-http_v2_module --with-stream
--with-http_ssl_module # 配置HTTPS时使用
--with-http_v2_module # 配置GOLANG语言时使用
--with-stream # 启用TCP/UDP代理服务
4.安装相关依赖
[root@web03 nginx-1.20.1]# yum install pcre pcre-devel -y
[root@web03 nginx-1.20.1]# yum install openssl openssl-devel -y
5.设置系统配置参数
./configure --with-http_ssl_module --with-http_v2_module --with-stream
6、开始编译
[root@web03 nginx-1.20.1]# make
7、安装
[root@web03 nginx-1.20.1]# make install
8、 加入环境变量
现在在命令行输入nginx,报错
需要加入环境变量:
[root@web03 nginx]# vi /etc/profile
新增以下内容:
export PATH=$PATH:/usr/local/nginx/sbin
使文件生效:
[root@web03 nginx]# source /etc/profile
现在在命令行输入nginx就行了
9、加入system系统管理(重要:一定要顶格写)
[root@web03 sbin]# vi /usr/lib/systemd/system/nginx.service
输入以下内容:
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
[Install]
WantedBy=multi-user.target
10、重载system服务并启动
[root@web03 sbin]# systemctl daemon-reload
[root@web03 sbin]# systemctl start nginx
常见错误:
1、./configure: error: the HTTP rewrite module requires the PCRE library.
# 安装相关包
yum install pcre pcre-devel -y
2、./configure: error: SSL modules require the OpenSSL library.
# 安装相关包
yum install openssl openssl-devel -y
2.3 防火墙问题
在 windows 系统中访问 linux 中 nginx,默认不能访问的,因为防火墙问题 (1)关闭防火墙 (2)开放访问的端口号,80 端口
查看开放的端口号
firewall-cmd --list-all
设置开放的端口号
设置开放的端口号
firewall-cmd --add-service=http –permanent
firewall-cmd --add-port=80/tcp --permanent
重启防火墙
firewall-cmd –reload
如果是购买的云服务器,还需要配置网络安全组
三、nginx常用命令及配置文件
3.1操作命令
使用nginx操作命令的前提是必须再nginx 的目录下
[root@VM-24-7-centos /]# cd /usr/local/nginx/sbin
1.查看 nginx 的版本号
[root@VM-24-7-centos sbin]# ./nginx -v
nginx version: nginx/1.20.2
2.查看 nginx 启动状态
[root@VM-24-7-centos sbin]# ps -ef | grep nginx
nobody 7508 10737 0 4月30 ? 00:00:24 nginx: worker process
root 10737 1 0 4月30 ? 00:00:00 nginx: master process ./nginx
root 15912 8298 0 16:21 pts/0 00:00:00 grep --color=auto nginx
2.nginx 启动
[root@VM-24-7-centos sbin]# ./nginx
3.关闭 nginx
[root@VM-24-7-centos sbin]# ./nginx -s stop
4.重新加载 nginx,改完配置文件,重新加载配置文件
[root@VM-24-7-centos sbin]# ./nginx -s reload
3.2配置文件
nginx 安装目录下,其默认的配置文件都放在这个目录的 conf 目录下,而主配置文件
nginx.conf 也在其中,后续对 nginx 的使用基本上都是对此配置文件进行相应的修改
(1)nginx配置文件
http {
include mime.types; # nginx支持的媒体文件类型。相对路径为同目录conf下的其他文件
default_type application/octet-stream; # 默认的媒体类型
#log_format main \'$remote_addr - $remote_user [$time_local] \"$request\" \' # 访问日志的格式
# \'$status $body_bytes_sent \"$http_referer\" \'
# \'\"$http_user_agent\" \"$http_x_forwarded_for\"\';
#access_log logs/access.log main;
sendfile on; # 启用sendfile传输模式,此模式是\"零拷贝\"
#tcp_nopush on; # 只在sendfile on时有效。让数据包挤满到一定程度才发送出去,挤满之前被阻塞
#keepalive_timeout 0; # keepalive的超时时间
keepalive_timeout 65;
#gzip on; # 是否启用gzip压缩响应报文
server { # 定义虚拟主机
listen 80; # 定义监听套接字
server_name localhost; # 定义主机名加域名,即网站地址
#charset koi8-r; # 默认字符集
#access_log logs/host.access.log main; # 访问日志路径
location / { # location容器,即URI的根
root html; # 站点根目录,即DocumentRoot,相对路径时为<prefix>/html
index index.html index.htm; # 站点主页文件
}
#error_page 404 /404.html; # 出现404 page not fount错误时,使用/404.html页响应客户端
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; # 出现50x错误时,使用/50x.html页返回给客户端
location = /50x.html { # 定义手动输入包含/50x.html时的location
root html;
}
# deny access to .htaccess files, if Apache\'s document root
# concurs with nginx\'s one
#
#location ~ /\\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
第一部分:全局块
worker_processes 1;#nginx进程,一般设置为和cpu核数一样
从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。
比如上面第一行配置的:这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约
第二部分:events 块
events {
worker_connections 1024;
}
比如上面的配置:
上述例子就表示每个 work process 支持的最大连接数为 1024.这部分的配置对 Nginx 的性能影响较大,在实际中应该灵活配置。
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
第三部分:http 块
http {
include mime.types;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location = /50x.html {
root html;
}
}
}
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http 全局块、server 块
①http 全局块
http 全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
②server 块
这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了节省互联网服务器硬件成本。
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。
而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
1、全局 server 块
最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或 IP 配置。
2、location 块
一个 server 块可以配置多个 location 块。
这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称
(也可以是 IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。地址定向、数据缓
存和应答控制等功能,还有许多第三方模块的配置也在这里进行。
四、nginx配置 反向代理和负载均衡
应用nginx配置
-
/nginx -s reload
-
./nginx -s stop ./nginx
1.反向代理
1.1实现一
通过nginx配置后,通过80端口访问nginx ,nginx 转发到tomcat的8080端口
在 nginx.conf配置文件中,加入如下配置
proxy_pass: URL; 该指令就是同来设置 真实服务器的地址,可以是主机名称,也可以是IP地址加端口号
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 1999.life;
location / {
proxy_pass http://127.0.0.1:8080;
root html;
index index.html index.htm;
}
location = /50x.html {
root html;
}
}
}
上述配置,就是当我们访问域名1999.life的80端口时,由于nginx监听了80端口, 会转发到http://127.0.0.1:8080根目录
1.1实现二
实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中 nginx 监听端口为 9001,
访问 http://127.0.0.1:9001/edu/ 直接跳转到 127.0.0.1:8081
访问 http://127.0.0.1:9001/vod/ 直接跳转到 127.0.0.1:8082
第一步,准备两个 tomcat,一个 8001 端口,一个 8002 端口,并准备好测试的页面 第二步,修改 nginx 的配置文件 在 http 块中添加 server{}
server {
listen 8800;
#listen 101.43.181.85;
server_name 101.43.181.85;
location ~ /vod/ {
proxy_pass http://127.0.0.1:8081;
root html;
index index.html index.htm;
}
location ~ /edu/ {
proxy_pass http://127.0.0.1:8080;
root html;
index index.html index.htm;
}
}
上述配置 是nginx监听 8800端口, 当请求路径包含 vod 时 ,代理8081端口;包含edu时,代理8080端口。~ 表示后面是正则表达式的形式
2.负载均衡
2.1 轮询算法(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除
我在两个tomcat 中配置了 , 相同的路径和资源.
upstream myserver{
server 101.43.181.85:8080;
server 101.43.181.85:8081;
}
server {
listen 8801;
server_name 101.43.181.85;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
上述配置, 监听了8801 端口, 配置文件中 upstream myserver 配置在 http全局块中,在location 中配置proxy_pass,并指向 upstream myserver.
myserve 是定义组名.location中将请求转发到 组名为myserve 的组
2.2 加权轮询(权重)算法(weight)
upstream myserver{
server 101.43.181.85:8080 weight=5;
server 101.43.181.85:8081 weight=10;
}
server {
listen 8801;
server_name 101.43.181.85;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
上述配置中, 和默认轮询的写法不同的就是 , 在组中,url后面多了 weight, 配置了权重.
当为服务器指定权重参数时, 权重将作为负载均衡决策的一部分。
2.3 ip_hash
2.3.1 ip_hash介绍
- ip_hash是根据用户请求过来的ip,然后映射成hash值,然后分配到一个特定的服务器里面;
- 使用ip_hash这种负载均衡以后,可以保证用户的每一次会话都只会发送到同一台特定的Tomcat里面,它的session不会跨到其他的tomcat里面去的;
-
首先通过将ip地址映射成一个hash值,然后将hash值对Tomcat的数量3取模,得到Tomcat的索引0、1、2;
-
比如:5%3=2,则把这个请求发送到Tomcat3服务器,以此类推;
-
这样一来,只要用户的IP不发生改变,当前用户的会话就能够一直保持;
nginx的ip_hash算法是取ip地址的前三段数字进行hash映射,如果只有最后一段不一样,也会发送到同一个Tomcat里面
2.3.2 ip_hash 配置
upstream myserver{
ip_hash;
server 101.43.181.85:8080 weight=5;
server 101.43.181.85:8081 weight=10;
}
server {
listen 8801;
server_name 101.43.181.85;
location / {
proxy_pass http://myserver;
root html;
index index.html index.htm;
}
}
在nginx里面使用ip_hash,直接添加ip_hash关键字即可,后续同一ip的访问将只会请求同一个服务器。
2.3.3 注意事项
-
一旦使用了ip_hash,当我们需要移除一台服务器的时候,不能直接删除这个配置项,而是需要在这台服务器配置后面加上关键字down,表示不可用;
-
upstream myserver { ip_hash; server 192.168.11.73:8080; server 192.168.11.74:8080 down; server 192.168.11.75:8080; }
-
因为如果直接移除配置项,会导致hash算法发生更改,后续所有的请求都会发生混乱;
2.4 least_conn
按节点连接数分配,把请求优先分配给连接数少的节点。该策略主要为了解决,各个节点请求处理时间长短不一造成某些节点超负荷的情况。
按照nginx文档的说法,请求将被传递给当前拥有最少活跃连接的server,同时考虑权重weight的因素。
upstream myserver{
least_conn;
server 192.168.9.134:8081;
server 192.168.9.134:8082;
}
在nginx里面使用least_conn,直接添加least_conn关键字即可。
2.5 fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的将会被优先分配
需要安装 nginx-upstream-fair-master 第三方模块
下载地址:https://github.com/gnosek/nginx-upstream-fair
重新检测nginx编译环境
编译时需要指定添加模块的绝对路径
[root@localhost nginx-1.18.0]# ./configure --with-http_ssl_module --add-module=/root/nginx-upstream-fair-master
若出现以下报错
error: ‘ngx_http_upstream_srv_conf_t’ has no member named ‘default_port’
解决方法
修改NGINX下的ngx_http_upstream.h文件
[root@localhost ~]# vim nginx-1.18.0/src/http/ngx_http_upstream.h
在ngx_http_upstream_srv_conf_s结构添加一行 in_port_t default_port
然后重新编译安装就可以了
修改NGINX的配置文件,指定算法为fair算法
upstream myserver{
server 192.168.9.134:8081;
server 192.168.9.134:8082;
fail;
}
五、nginx 动静分离
1.基本介绍
- 动静分离指的是将动态请求和静态请求分隔开,然后分别路由到相应的后端服务器。
- 通常用户的请求中,一部分需要后台程序处理,例如查询数据库或者进行一些数据运算,这类请求我们称之为动态请求;
- 还有一部分不需要后台程序处理,如请求 css、html、js、图片等静态资源,这类请求我们称之为静态请求。
- Nginx 实现动静分离的基础是它可以根据配置对不同的请求做不同的转发,动静分离有利于提高整个服务器系统的性能。
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离。严格意义上说应该是动态请求跟静态请求分开,可以理解成使用 Nginx 处理静态页面,Tomcat 处理动态页面。动静分离从目前实现角度来讲大致分为两种,
一种是纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案;
另外一种方法就是动态跟静态文件混合在一起发布,通过 nginx 来分开。通过 location 指定不同的后缀名实现不同的请求转发。通过 expires 参数设置,可以使浏览器缓存过期时间,减少与服务器之前的请求和流量。具体 Expires 定义:是给一个资源设定一个过期时间,也就是说无需去服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。此种方法非常适合不经常变动的资源。(如果经常更新的文件,不建议使用 Expires 来缓存),我这里设置 3d,表示在这 3 天之内访问这个 URL,发送一个请求,比对服务器该文件最后更新时间没有变化,则不会从服务器抓取,返回状态码304,如果有修改,则直接从服务器重新下载,返回状态码 200。
2.配置
我准备了两个静态资源
/data/test/www/a.html
/data/test/image/001.jpg
server {
listen 8802;
server_name 101.43.181.85;
location /www/ {
root /data/test/;
index index.html index.htm;
}
location /image/ {
root /data/test/;
autoindex on;
}
}
上述配置location 部分, 当我们路径为www时, 会匹配到 对应的location,到/data/test/www 路径下,寻找对应资源;
当我们路径为image时, 匹配到对应的location,到/data/test/image路径下,寻找对应资源
autoindex on 的作用是列出 文件夹下的内容
六、nginx高可用
1.什么是高可用?
高可用(High availability,缩写为 HA),是指系统无中断的执行其功能的能力,代表系统的可用性程度。高可用的主要目的就是为了保障“业务的连续性”,即在用户的眼里,业务永远都是正常对外提供服务的。它通常是指,通过设计减少系统不能提供服务的时间。
假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。
常见的互联网分层架构
常见互联网分布式架构如上,分为:
(1)客户端层:典型调用方是浏览器browser或者手机应用APP
(2)反向代理层:系统入口,反向代理
(3)站点应用层:实现核心应用逻辑,返回html或者json
(4)服务层:如果实现了服务化,就有这一层
(5)数据-缓存层:缓存加速访问存储
(6)数据-数据库层:数据库固化数据存储
整个系统的高可用,又是通过每一层的冗余+自动故障转移来综合实现的。
2.nginx 高可用
nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务,影响严重。
为了屏蔽负载均衡服务器的宕机,需要建立一个备份机。主服务器和备份机上都运行高可用(High Availability)监控程序,通过传送诸如“I am alive”这样的信息来监控对方的运行状况。当备份机不能在一定的时间内收到这样的信息时,它就接管主服务器的服务IP并继续提供负载均衡服务;当备份管理器又从主管理器收到“I am alive”这样的信息时,它就释放服务IP地址,这样的主服务器就开始再次提供负载均衡服务。
2.1keepalived+nginx实现主备
2.1.1 什么是keepalived
keepalived 是集群管理中保证集群高可用的一个服务软件,用来防止单点故障。
Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器。
2.1.2 keepalived工作原理
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(VIP = Virtual IP Address,虚拟IP地址,该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到VRRP包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
keepalived主要有三个模块,分别是core、check和VRRP。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各种检查方式。VRRP模块是来实现VRRP协议的。
2.1.3 keepalived+nginx实现主备过程
初始状态
主机宕机
主机恢复
基础环境准备
(1)安装Nginx:
# 添加源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装Nginx
sudo yum install -y nginx
# 启动Nginx
sudo systemctl start nginx.service
# 浏览器访问测试
http://192.168.253.11/
http://192.168.253.12/
(2)安装KeepAlived可使用yum直接安装:
yum -y install keepalived
查看KeepAlived配置文件:
cat /etc/keepalived/keepalived.conf
接下来就是要对该配置文件进行修改,该配置文件在/etc/keepalived/路径下。在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,它是为lvs准备的。
(3)关闭防火墙(默认关闭)
(4)关闭selinux(如果不关闭,KeepAlived不生效)
临时关闭
[root@localhost ~]# getenforce Enforcing
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
永久关闭:
[root@localhost ~]# vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled
重启服务reboot
配置主备模式
(1) 修改主配置文件:
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id master11
}
# nginx挂了,实现vip自动漂移,使用如下脚本控制
vrrp_script check_nginx {
script \"/usr/local/nginx/nginx_check.sh\"
interval 2 # 机器宕机执行的次数
weight 2
}
# 当前实例配置
vrrp_instance VI_1 {
state MASTER # 主机
interface ens33 # 绑定的网卡
virtual_router_id 51 # 组id,需要一致
priority 100 # 优先级
advert_int 1 # 检查间隔,默认1s
# 调用nginx挂了之后进行vip漂移的函数
track_script {
check_nginx
}
authentication {
auth_type PASS
auth_pass 1111
}
# 配置vip
virtual_ipaddress {
192.168.253.50/24 dev ens33 label ens33:1 scope global
}
}
在默认的keepalive.conf里面还有 virtual_server,real_server 这样的配置,我们这用不到,它是为lvs准备的。
(2) 脚本文件
/usr/local/nginx/nginx_check.sh :
# 在/usr/local下新建目录nginx
mkdir nginx
# 新建文件
touch nginx_check.sh
# 编辑内容
#!/bin/bash
A=`ps -C nginx --no-header |wc -l` #查看nginx进程是否存在
#if [ $A -eq 0 ];then
/usr/sbin/nginx #重启nginx
if [ $A -eq 0 ];then #nginx重启失败
exit 1 # keepalived执行脚本,返回非0结果,ip漂移
else
exit 0 # keepalived执行脚本,返回0,ip不漂移
fi
#else
# exit 0
#fi
需要给nginx_check.sh文件加可执行权限
chmod +x nginx_check.sh
(3)修改从机keepalived.conf配置文件
! Configuration File for keepalived
global_defs {
notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id backup
}
vrrp_script check_nginx {
script \"/usr/local/nginx/nginx_check.sh\"
interval 2
weight 2
}
vrrp_instance VI_1 {
state BACKUP # 从机
interface ens33
virtual_router_id 51 # 组id,需要一致
priority 99 # 优先级
advert_int 1
# 调用nginx挂了之后进行vip漂移的函数
track_script {
check_nginx
}
authentication {
auth_type PASS
auth_pass 1111
}
# 配置vip
virtual_ipaddress {
192.168.253.50/24 dev eth0 label ens33:1 scope global
}
}
同样需要在/usr/local/nginx/路径下放上nginx_check.sh脚本文件。
(4) 启动nginx、keepalived
#主从启动
sudo systemctl restart nginx.service
#主从启动
systemctl start keepalived
(5) 访问测试
为效果明显,可以修改Nginx首页,将主从IP地址放置首页以便区分。
访问http://192.168.253.50 or curl 192.168.253.50
查看Nginx日志
cd /var/log/nginx/
cat access.log
查看主服务器keepalived日志:
Keepalived默认所有的日志都是写入到/var/log/message ,
你可以使用命令 tail -f /var/log/messages|grep Keepalived 进行查看
查看ens33网卡信息:
ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc
pfifo_fast state UNKNOWN group default qlen 1000
inet 192.168.253.11/24 brd 192.168.253.255 scope
global noprefixroute ens33
inet 192.168.253.50/24 scope global secondary ens33:1
#VIP已漂移到主机,vip只能选择一个机器进行绑定
(6)停掉主服务器的nginx
通过浏览器访问:http://192.168.253.50
查看主机KeepAlived日志:
tail -f /var/log/messages|grep Keepalived
# 强制停止
pkill -9 nginx
# 查看Nginx进程
ps -ef | grep nginx
# 等待几秒后再次查看Nginx进程,发现已经通过检查脚本自启
# 因为在keepalived脚本中,进行了nginx重启操作
则会执行脚本nginx_check.sh进行nginx启动!
如果master上的nginx服务挂了,则nginx会自动重启,重启失败后会自动关闭keepalived,这样vip资源也会转移到slave上。
master和slave两边都开启nginx服务,无论master还是slave,当其中的一个keepalived服务停止后,vip都会漂移到keepalived服务还在的节点上;
如果要想使nginx服务挂了,vip也漂移到另一个节点,则必须用脚本或者在配置文件里面用shell命令来控制。(nginx服务宕停后会自动启动,启动失败后会会致使vip资源漂移到另一台机器上)
来源:https://www.cnblogs.com/starn/p/starn_nginx.html
本站部分图文来源于网络,如有侵权请联系删除。