Nginx
安装+域名+location规则+rewrite
-
安装依赖
-
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
-
解压 tar -zxf 安装包
-
./configure
-
make & make install
#启动
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#测试
/usr/local/nginx/sbin/nginx -t
#关闭
/usr/local/nginx/sbin/nginx -s stop
#重新加载配置
/usr/local/nginx/sbin/nginx -s reload
-
-
本地域名解析配置
-
C:\Windows\System32\drivers\etc\hosts
-
-
location规则
^ 以什么开始
$ 以什么结尾
~ 区分大小写匹配
~* 不区分大小写匹配
location = /uri 表示精确匹配,只要完全匹配上才能生效
location /uri 表示前缀匹配
location ^~/uri 表示任何以uri开头,优先级比上面一个高
-
rewrite规则和应用
-
语法 rewrite regex repalcement[flag]
rewrite ^/(.*) https://dzystudy.net/$1 permanent
# 这是⼀个正则表达式,匹配完整的域名和后⾯的路径地址
# replacement部分是https://dzystudy.net/$1,$1是取⾃regex部分()⾥的内容 -
regex
-
字符 | 描述 |
---|---|
^ | 匹配输⼊字符串的起始位置 |
$ | 匹配输⼊字符串的结束位置 |
* | 匹配前⾯的字符零次或者多次 |
+ | 匹配前⾯字符串⼀次或者多次 |
? | 匹配前⾯字符串的零次或者⼀次 |
. | 匹配除“\n”之外的所有单个字符 |
(pattern) | 匹配括号内的pattern |
flag
标记符号 | 说明 |
---|---|
last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
break | 本条规则匹配完成后终⽌,不在匹配任何规 则 |
redirect | 返回302临时重定向 |
permanent | 返回301永久重定向 |
-
应用场景
-
非法访问跳转,防盗链
-
网站更换域名
-
http跳转https
-
不同地址访问同一个虚拟主机的资源
-
文件服务器
server {
listen 80;
server_name xxxxx.cn;
location /app/img{
alias /usr/local/software/img/;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
访问路径:http://xxxxx.cn/app/img/1.jpg
-
注意
-
在location /中配置root目录
-
在location /path中配置alias虚拟目录,目录后面的"/"符号一定要带上。
-
Nginx挖掘accessLog日志
-
access.log日志用处
-
统计站点访问ip来源、某个时间段的访问频率
-
查看访问最频的页面、Http响应状态码、接口性能
-
接口秒级访问量、分钟访问量、小时和天访问量
-
-
默认配置解析
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for" $request_time'; -
解析
$remote_addr 对应的是真实⽇志⾥的ip,即客户端的IP。
$remote_user 对应的是第⼆个中杠“-”,没有远程⽤户,所以⽤“-”填充。
[$time_local]对应的是[04/May/2022 14:33:00+0100]。
“$request”对应的是"GET /url?param=1"。
$status对应的是200状态码,200表示正常访问。
$body_bytes_sent对应的是48字节,即响应body的⼤⼩。
“$http_referer” 对应的是”https://xxxxxx.net/“,若是直接打开域名浏览的时,referer就会没有值,为”-“。
“$http_user_agent” 对应的是”xxxxxx”。
“$http_x_forwarded_for” 对应的是”-“或者空。
$request_time 从接受用户请求的第一个字节到发送完响应的时间,包含接受请求时间、程序响应时间、输出响应数据时间。
$upstream_response_time :指从Nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间 -
查看访问最频繁的前100IP
awk '{print $1}' access_temp.log|sort -n | uniq -c | sort -rn | head -n 100
-
统计访问最多的url的前20
cat access_temp.log|awk '{print $7}' | sort | uniq -c | sort -rn|head -n 20 | more
-
统计耗时接口,列出传输时间大于2秒的接口,显示前五条
cat dzystudy.access.log | awk '($NF>2){print $7}'|sort -n | uniq -c | sort -rn| head -5
负载均衡配置
-
节点轮询
upstream lbs{
server 192.168.3.130:8080;
server 192.168.3.130:8081;
}
server {
listen 80;
server_name xxxxx.cn;
access_log logs/xxxxxx.access.log main;
location / {
proxy_pass http://lbs;
proxy_redirect default;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
} -
weight权重配置
upstream lbs{
server 192.168.3.130:8080 weight=5;
server 192.168.3.130:8081 weight=10;
} -
固定分发
-
根据请求的ip的hash结果分配,这样每一个用户都可以固定访问一个后端服务器
upstream lbs {
ip_hash;
server 192.168.159.133:8080;
server 192.168.159.133:8081;
}-
upstream 还可以为某个节点设置状态值
-
down表示当前的server暂时不参与负载
-
-
server ip:port down;
-
backup 其他所有非backup机器down的时候,会请求backup机器,这台机器压力最轻。
-
server ip:port backup
-
-
Nginx探测后端节点可用性和配置实操
-
max_fails 允许请求失败的次数,默认1,当超过最大次数时就不会请求
-
fail_timeout: max_fails次失败后,暂停的时间,默认:fail_timeout为10s
-
失败的尝试次数是1,如果设置为0,就会停止统计尝试次数,认为服务器一直是可用的。
-
-
Nginx配置失败的标准
-
可以通过指令proxy_next_upstream来配置什么是失败的尝试
-
注意默认配置时,http_404状态不认为是失败的尝试
upstream lbs{
server 192.168.3.130:8080 max_fails=2 fail_timeout=60s;
server 192.168.3.130:8081 max_fails=2 fail_timeout=60s;
}
server {
listen 80;
server_name xxxxx.cn;
access_log logs/xxxxx.access.log main;
location / {
proxy_pass http://lbs;
proxy_redirect default;
proxy_next_upstream error timeout http_500 http_503 http_404;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
} -
全局异常拦截
upstream lbs{
server 192.168.3.130:8080 max_fails=2 fail_timeout=60s;
server 192.168.3.130:8081 max_fails=2 fail_timeout=60s;
}
server {
listen 80;
server_name xxxxx.cn;
access_log logs/xxxxx.access.log main;
location / {
proxy_pass http://lbs;
proxy_redirect default;
#存放用户真实IP
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_next_upstream error timeout http_500 http_503 http_404;
#开启错误拦截
proxy_intercept_errors on;
}
error_page 404 500 502 503 504 =200 /default_api;
location = /default_api {
default_type application/json;
return 200 '{"code":"-1","msg":"invoke fail, not found "}';
}
}
Nginx封禁恶心IP+跨域
-
linux server层面封IP:iptables
-
nginx的层面封IP,方式多种多样(但req还是会打进来的,让nginx返回403,占用资源)
-
nginx作为网关可以有效封禁IP
nginx配置如下:
http{
# ....
include blacklist.conf;
}
#blacklist.conf⽬录下⽂件内容
deny 192.168.159.2;
deny 192.168.159.32;
-
-
Nginx解决跨域
-
JSONP
-
Http响应头配置允许跨域
-
nginx层配置
location / {
add_header 'Access-Control-Allow-Origin' $http_origin;
add_header 'Access-Control-Allow-Credentials' 'true';
add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
#如果预检请求则返回成功,不需要转发到后端
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain; charset=utf-8';
add_header 'Content-Length' 0;
return 200;
}
} -
程序代码中处理通过拦截器配置
-
-
Websocket+缓存+压缩
-
websocket
-
conf文件配置
server{
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
} -
处理后的报文
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: upgrade
-
-
服务器端缓存
-
参数解析
-
/root/cache 本地路径,用来存放Nginx缓存资源的存放地址
-
levels=1:2 默认所有缓存⽂件都放在上⾯指定的根路径中,可 能影响缓存的性能,推荐指定为 2 级⽬录来存储缓 存⽂件;1和2表示⽤1位和2位16进制来命名⽬录名 称。第⼀级⽬录⽤1位16进制命名,如a;第⼆级⽬ 录⽤2位16进制命名,如3a。所以此例中⼀级⽬录 有16个,⼆级⽬录有16*16=256个,总⽬录数为16 * 256=4096个;当levels=1:1:1时,表示是三级⽬录,且每级⽬录数 均为16个
-
key_zone 在共享内存中定义⼀块存储区域来存放缓存的 key 和 metadata
-
max_size 最⼤ 缓存空间, 如果不指定会使⽤掉所有磁盘空 间。当达到 disk 上限后,会删除最少使⽤的 cache
-
inactive 配置nginx cache中的缓存⽂件的缓存时 间,proxy_cache_valid 200 304 2m 对于状态为200 和304的缓存⽂件的缓存时间是2分钟
-
use_temp_path 建议为 off,则 nginx 会将缓存⽂件直接写⼊指定的 cache ⽂件中
-
proxy_cache 启⽤proxy cache,并指定key_zone,如果 proxy_cache off表示关闭掉缓存
-
add_header Nging-Cache "$upstream_cache_status" ⽤于前端判断是否是缓存,miss、hit、expired(缓 存过期)、updating(更新,使⽤旧的应答)
-
-
具体配置
proxy_cache_path /root/cache levels=1:2 keys_zone=xd_cache:10m max_size=1g inactive=60m use_temp_path=off;
-
配置实操
-
nginx 缓存过期影响的优先级进行排序为:inactive > 源服务器端Expires/max-age>proxy_cache_valid
-
如果出现Permission denied 修改nginx.conf,将第一行修改为user root
-
默认情况下GET请求及HEAD请求会被缓存,⽽POST请 求不会被缓存,并⾮全部都要缓存,可以过滤部分路径 不⽤缓存
-
-
缓存清空
-
直接rm删除
-
ngx_cache_purge
-
-
缓存命中率统计
-
前端打点日志上报
-
nginx日志模板增加信息
-
$upstream_cache_status
-
-
-
-
-
压缩
-
压缩配置
#开启gzip,减少我们发送的数据量
gzip on;
gzip_min_length 1k;
#4个单位为16k的内存作为压缩结果流缓存
gzip_buffers 4 16k;
#gzip压缩⽐,可在1~9中设置,1压缩⽐最⼩,速度最快,9压缩⽐最⼤,速度最慢,消耗CPU
gzip_comp_level 4;
#压缩的类型
gzip_types application/javascript text/plain text/css application/json application/xml text/javascript;
#给代理服务器⽤的,有的浏览器⽀持压缩,有的不⽀持,所以避免浪费不⽀持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
gzip_vary on;
#禁⽤IE6以下的gzip压缩,IE某些版本对gzip的压缩⽀持很不好
gzip_disable "MSIE [1-6]."; -
压缩前后区别
location /static {
alias /usr/local/software/static;
} -
面试题:压缩是时间换空间,还是空间换时间?
-
web层主要涉及浏览器和服务器的⽹络交互,⽽⽹络交 互显然是耗费时间的
-
要尽量减少交互次数
-
降低每次请求或响应数据量
-
开启压缩
-
在服务端是时间换空间的策略,服务端需要牺牲时 间进⾏压缩以减⼩响应数据⼤⼩
-
压缩后的内容可以获得更快的⽹络传输速度,时间 是得到了优化
-
所以是双向的
-
-
-
配置https+整合OpenResty
配置https
-
流程
-
秘钥交换使用非对称加密,内容传输使用对称加密
-
-
阿里云证书申请
-
证书上传
-
配置https证书实操
#增加ssl模块
./configure --prefix=/usr/local/nginx_ssl --with-http_stub_status_module --with-http_ssl_module
make & make install
#查看是否安装成功
/usr/local/nginx/sbin/nginx_ssl -V
-
配置文件
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
} -
https访问实操
-
杀掉原先的进程
-
防火墙关闭或者开放443端口
-
OpenResty
介绍
由章亦春发起,是基于Ngnix和Lua的⾼性能web平台,内部集成精良的LUa库、第三⽅模块、依赖, 开发者可以⽅便搭建能够处理⾼并发、扩展性极⾼的动态web应⽤、web服务、动态⽹关。
OpenResty将Nginx核⼼、LuaJIT、许多有⽤的Lua库和Nginx第三⽅模块打包在⼀起
Nginx是C语⾔开发,如果要⼆次扩展是很麻烦的,⽽基于OpenResty,开发⼈员可以使⽤ Lua 编程语⾔对 Nginx核⼼模块进⾏⼆次开发拓展
性能强⼤,OpenResty可以快速构造出1万以上并发连接响应的超⾼性能Web应⽤系统
-
拓展
让Web 服务直接跑在 Nginx 服务内部,充分利⽤ Nginx的⾮阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚⾄于对远程后端诸如 MySQL, Memcaches 以及 Redis 等都进⾏⼀致的⾼性能响应。所以对于⼀些⾼性能的服务来说,可以直接使⽤ OpenResty 访问 Mysql或Redis等,⽽不需要通过第三⽅语⾔(PHP、Python、Ruby)等来访问数据库再返回,这⼤⼤提⾼了应⽤的性能
Lua脚本介绍
-
Lua 由标准 C 编写⽽成,没有提供强⼤的库,但可以很容易的被 C/C++ 代码调⽤,也可以反过来调⽤ C/C++ 的函数。
在应⽤程序中可以被⼴泛应⽤,不过Lua是⼀种脚本/动态语⾔,不适合业务逻辑⽐较重的场景,适合⼩巧的应⽤场景,代码⾏数保持在⼏⼗⾏到⼏千⾏。
LuaJIT 是采⽤ C 和汇编语⾔编写的 Lua 解释器与即时编译器 -
ngx_lua
ngx_lua是Nginx的⼀个模块,将Lua嵌⼊到Nginx中,从⽽可以使⽤Lua来编写脚本,部署到Nginx中运⾏,
即Nginx变成了⼀个Web容器;开发⼈员就可以使⽤Lua语⾔开发⾼性能Web应⽤了。
OpenResty提供了常⽤的ngx_lua开发模块
-
lua-resty-memcached
-
lua-resty-mysql
-
lua-resty-redis
-
lua-resty-dns
-
lua-resty-limit-traffic
通过上述的模块,可以⽤来操作 mysql数据库、redis、memcached等,也可以⾃定义模块满⾜其他业务需求,很多经典的应⽤,⽐如开发缓存前置、数据过滤、API请求聚合、AB测试、灰度发布、降级、监控、限流、防⽕墙、⿊⽩名单等
OpenResty环境准备
wget https://openresty.org/package/centos/openresty.repo
mv openresty.repo /etc/yum.repos.d/
yum check-update
yum install openresty
yum install openresty-resty
yum --disablerepo="*" --enablerepo="openresty" list available
#查看版本号
resty -v
-
开发案列
#编辑:/usr/local/openresty/nginx/conf/nginx.conf
http{
server {
listen 80;
server_name localhost;
location / {
default_type text/html;
content_by_lua_block{
ngx.say("hello world;");
}
}
}
}
#使⽤其他⽅式
#使⽤其他⽅式
http{
# 虚拟机主机块,还需要配置lua⽂件扫描路径
lua_package_path "$prefix/lualib/?.lua;;";
lua_package_cpath "$prefix/lualib/?.so;;";
server{
# 监听端⼝
listen 80;
# 配置请求的路由
location /{
default_type text/html;
content_by_lua_file lua/xxxxx.lua;
}
}
}
nginx内置变量
-
GitHub - openresty/lua-nginx-module: Embed the Power of Lua into NGINX HTTP servers
名称 说明 $arg_name 请求中的name参数 $args 请求中的参数 $content_length HTTP请求信息⾥的"Content-Length" $content_type 请求信息⾥的"Content-Type" $host 请求信息中的"Host",如果请求中没有Host ⾏,则等于设置的服务器名 $hostname 机器名使⽤ gethostname系统调⽤的值 $http_cookie cookie 信息 $http_referer 引⽤地址 $http_user_agent 客户端代理信息 $http_via 最后⼀个访问服务器的Ip地址。 $http_x_forwarded_for 相当于⽹络访问路径 $is_args 如果请求⾏带有参数,返回“?”,否则返回空字符串 $limit_rate 对连接速率的限制 $nginx_version 当前运⾏的nginx版本号 $pid worker进程的PID $query_string 与$args相同 $remote_addr 客户端IP地址 $remote_port 客户端端⼝号 $request 用户请求 $request_method 请求的方法,比如"GET". "POST"等 $request_uri 请求的URI,带参数 $scheme 所用的协议,比如http或者https $server_name 请求到达的服务器名 $server_port 请求到达的服务器端口号 $server_protocol 请求的协议版本,"HTTP/1.0"或"HTTP/1.1" $uri 请求的URI,可能和最初的值有不同,比如经过重定向之类的。
nginx请求阶段
-
nginx对于请求的处理分多个阶段,Nginx , 从⽽让第三⽅模 块通过挂载⾏为在不同的阶段来控制, ⼤致如下
-
初始化阶段(Initialization Phase)
-
init_by_lua_file
-
init_worker_by_lua_file
-
-
重写与访问阶段(Rewrite / Access Phase)
-
rewrite_by_lua_file
-
access_by_lua_file
-
-
内容⽣成阶段(Content Phase)
-
content_by_lua_file
-
-
⽇志记录阶段(Log Phase)
-
开发网络访问限制
-
Nginx+OpenRestry+Lua开发
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 这里设置为 off,是为了避免每次修改之后都要重新reload 的麻烦。
# 在生产环境上需要 lua_code_cache 设置成 on。
lua_code_cache off;
# lua_package_path可以配置openresty的文件寻址路径,$PREFIX 为openresty安装路径
# 文件名使用“?”作为通配符,多个路径使用“;”分隔,默认的查找路径用“;;”
# 设置纯 Lua 扩展库的搜寻路径
lua_package_path "$prefix/lualib/?.lua;;";
# 设置 C 编写的 Lua 扩展模块的搜寻路径(也可以用 ';;')
lua_package_cpath "$prefix/lualib/?.so;;";
upstream lbs {
server 192.168.3.130:8080;
}
server {
listen 80;
server_name localhost;
location / {
access_by_lua_file lua/black_ip_list.lua;
proxy_pass http://lbs;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
} -
black_ip_list.lua
local black_ips = {["127.0.0.1"]=true}
local ip = ngx.var.remote_addr
if true == black_ips[ip] then
ngx.exit(ngx.HTTP_FORBIDDEN)
return;
end
开发下载限速
-
限速限流场景
-
下载限流:保护宽带及服务器的IO资源
-
请求限流:防止恶意攻击,保护服务器及资源安全
-
限制某个用户在给定时间段内能够产生的HTTP请求数
-
限流用在保护上游服务器不被在同一时刻的大量用户访问
-
-
-
openResty下载限速案列实操
-
Nginx 有一个$limit_rate,这个反映的是当前请求每秒能响应的字节数,改字节数默认为配置文件中limit_rate指令的设值
#当前请求的响应上限是 每秒 300K 字节
location /download {
access_by_lua_block {
ngx.var.limit_rate = "300K"
}
alias /usr/local/software/app;
}
-
-
下载限速实现原理
-
目的:限制下载速度
-
常用的是漏桶原理和令牌桶原理
-
漏桶原理
-
备注:如果是请求限流,请求先进⼊到漏桶⾥,漏桶以 固定的速度出⽔,也就是处理请求,当⽔加的过快也就 是请求过多,桶就会直接溢出,也就是请求被丢弃拒绝 了,所以漏桶算法能强⾏限制数据的传输速率或请求数
-
-
令牌桶原理
-
备注:只要突发并发量不⾼于桶⾥⾯存储的令牌数据, 就可以充分利⽤好机器⽹络资源。 如果桶内令牌数量⼩于被消耗的量,则产⽣的令牌的速 度就是均匀处理请求的速度
-
-
Nginx高可用解决方案LVS+KeepAlive
-
Nginx高可用解决方案-基础
国际标准化组织(ISO)制定的⼀个⽤于计算机或通信系统间互联的标准体系。
从低到⾼分别是:
物理层、数据链路层、⽹络层、传输层、会话层、表示层和应⽤层
四层⼯作在OSI第四层 也就是传输层
七层⼯作在最⾼层,也就是应⽤层-
F5、LVS(四层负载tcp)
-
用虚拟ip+port接受请求,在转发到对应的真实的机器
-
-
HAproxy、Nginx(七层负载)
-
⽤虚拟的url或主机名接收请求,再转向相应的处理服务器
-
-
LVS
-
官网:The Linux Virtual Server Project - Linux Server Cluster for Load Balancing
LVS是Linux Virtual Server,Linux虚拟服务器,是⼀个虚拟的服务器集群系统
项⽬是由章⽂嵩博⼠成⽴,是中国国内最早出现的⾃由软件项⽬之⼀
Linux2.4 内核以后,LVS 已经是 Linux 标准内核的⼀部分
软件负载解决的两个核⼼问题是:选谁、转发 -
提供了10多种调度算法: 轮询、加权轮询、最⼩连接、⽬ 标地址散列、源地址散列等
-
三种负载均衡转发技术
-
NAT:数据进出都通过 LVS, 前端的Master既要处理客户端发起的请求,⼜要处理后台RealServer的响应信 息,将RealServer响应的信息再转发给客户端, 容易成为整个集群系统性能的瓶颈; (⽀持任意系统且可以实现 端⼝映射)
-
DR: 移花接⽊,最⾼效的负载均衡规则,前端的Master只处理客户端的请求,将请求转发给RealServer,由后台 的RealServer直接响应客户端,不再经过Master, 性能 要优于LVS-NAT; 需要LVS和RS集群绑定同⼀个VIP(⽀持多数系统,不可以实现端⼝映射)
-
TUNL:隧道技术,前端的Master只处理客户端的请 求,将请求转发给RealServer,然后由后台的 RealServer直接响应客户端,不再经过Master;(⽀持少数系统,不可以实现端⼝映射))
-
KeepAlive
测试机器:centos7(130) 、centos8(128)
keepalived是⼀个类似于交换机制的软件,核⼼作⽤是检测服务器的状态,如果有⼀台web服务器⼯作出现故障,Keepalived将检测到并将有故障的服务器从系统中剔除,使⽤其他服务器代替该服务器的⼯作,当服务器⼯作正常后
Keepalived⾃动将服务器加⼊到服务器群中,这些⼯作全部⾃动完成。
后来加⼊了vrrp(虚拟路由器冗余协议),除了为lvs提供⾼可⽤还可以为其他服务器⽐如Mysql、Haproxy等软件提供⾼可⽤⽅案
-
安装
yum install -y keepalived
#路径
cd /etc/keepalived -
启动和查看
#启动
service keepalived start
#停⽌
service keepalived stop
#查看状态
service keepalived status
#重启
service keepalived restart
#停⽌防⽕墙
systemctl stop firewalld.service -
缺少的依赖
yum install -y gcc
yum install -y openssl-devel
yum install -y libnl libnl-devel
yum install -y libnfnetlink-devel
yum install -y net-tools
yum install -y vim wget -
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
enable_script_security #允许执行外部脚本
}
#配置vrrp_script,主要用于健康检查及检查失败后执行的动作。
vrrp_script chk_real_server {
#健康检查脚本,当脚本返回值不为0时认为失败
script "/usr/local/software/conf/chk_server.sh"
#检查频率,以下配置每2秒检查1次
interval 2
#当检查失败后,将vrrp_instance的priority减小5
weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
fall 3
#连续监测2次成功,就认为成功。但不调整优先级
rise 2
user root
}
#配置对外提供服务的VIP vrrp_instance配置
vrrp_instance VI_1 {
#指定vrrp_instance的状态,是MASTER还是BACKUP主要还是看优先级。
state MASTER
#指定vrrp_instance绑定的网卡,最终通过指定的网卡绑定VIP
interface ens33
#相当于VRID,用于在一个网内区区分组播,需要组播域内内唯一。
virtual_router_id 51
#本机的优先级,VRID相同的机器中,优先级最⾼的会被选举为MASTER
priority 100
#心跳间隔检查,默认为1s,MASTER会每隔1秒发送一个报文告知组内其他机器自己还活着。
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#定义虚拟IP(VIP)为192.168.159.100,可多设,每行一个
virtual_ipaddress {
192.168.159.100
}
#本vrrp_instance所引⽤的脚本配置,名称就是vrrp_script 定义的容器名
track_script {
chk_real_server
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.3.100 80 {
# 设置健康检查时间,单位是秒
delay_loop 6
# 设置负载调度的算法为rr
lb_algo rr
# 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
lb_kind NAT
# 会话保持时间
persistence_timeout 50
#指定转发协议类型(TCP、UDP)
protocol TCP
# 指定real server1的IP地址
real_server 192.168.3.130 80 {
# 配置节点权值,数字越⼤权重越⾼
weight 1
# 健康检查⽅式
TCP_CHECK { # 健康检查方式
connect_timeout 10 # 连接超时
retry 3 # 重试次数
delay_before_retry 3 # 重试间隔
connect_port 80 # 检查时连接的端口
}
}
}
-
配置注意
router_id后⾯跟的⾃定义的ID在同⼀个⽹络下是⼀致的
state后跟的MASTER和BACKUP必须是⼤写;否则会造成配置无法生效的问题
interface ⽹卡ID;要根据自己的实际情况来看,可以使用以下方式查询 ip a 查询
在BACKUP节点上,其keepalived.conf与Master上基本⼀致,修改state为BACKUP,priority值改⼩即可
authentication主备之间的认证⽅式,⼀般使⽤PASS即可;主备的配置必须⼀致,不能超过8位 -
检查脚本
#!/bin/bash
counter = $(ps -C nginx --no-heading | wc -l)
if [ "${counter}" -eq "0" ];then
service keepalived stop
echo "nginx server is died...."
fi