day12

下周:
keepalived(高可用软件,和nginx没有关系)
nginx常用模块、nginx常见问题

1.什么是高可用。
启动两台相同的业务主机,一台故障一台自动接管。(两台服务器的配置是一模一样。)

2.高可用用什么手段实现
硬件、软件(Keepalived)

3.Keepalived如何实现的高可用
VRRP 虚拟路由冗余协议

4.VRRP怎么诞生的?
单点故障、arp vmac-->vip--backup

5.高可用使用的场景
保证业务7x24

1.实践环境,配置实现虚IP转移
状态 IP 角色
节点1 10.0.0.5 Master
节点2 10.0.0.6 Backup
VIP 10.0.0.3

1.安装keepalived,如下操作 【两台机器都需要操作】

yum install keepalived -y

2.配置

配置节点1,Master
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}

vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}

配置节点2,Backup
[root@lb02 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}

vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}

5.对比keepalived的master与backup配置的区别
Keepalived配置区别 Master配置 Backup节配置
route_id(唯一标识) lb01 lb02
state(角色状态) MASTER BACKUP
priority(优先级) 100 99

6.启动

systemctl start keepalived

systemctl enable keepalived

7.测试
windows arp -a 查看缓存表
keepalived仅仅只是实现IP地址的漂移,除此之外,无任何的功能。(通过抓包分析、日志观察)
只要发生切换,keepalived就会通知客户端更新 新的arp缓存表 ----> vip不变 vmac更新

keepalived默认是抢占式
当master故障,backup接管,当修复好master,master会抢占backup的vip。 (会发生2次切换,1次故障,1次恢复。)
keeplaived非抢占式

配置非抢占式步骤如下
1、两个节点的state都必须配置为BACKUP(官方建议)
2、两个节点都在vrrp_instance中添加nopreempt参数。
3、两个节点的优先级有一台必须要高于另外一个台。150 100
PS:两台服务器都角色状态启用nopreempt后,必须修改角色状态统一为BACKUP,唯一的区分就是优先级。

PS:通常如果master服务死掉后backup会变成master,但是当master服务又好了的时候 master此时会抢占VIP,这样就会发生两次切换对业务繁忙的网站来说是不好的。所以我们要在配置文件加入 nopreempt 非抢占,但是这个参数只能用于state 为backup,故我们在用HA的时候最好master 和backup的state都设置成backup 让其通过priority来竞争。

Master

vrrp_instance VI_1 {
    state BACKUP
    priority 150
    nopreempt
}

Backup

vrrp_instance VI_1 {
    state BACKUP
    priority 100
    nopreempt
}

keeplaived nginx之间的关系
keeplaived只做地址漂移。
nginx对外暴露80端口,实际上是对所有的网卡暴露。
PS:只要访问keeplaived的虚拟IP:80,实际上就是在访问某一台服务器的80端口。


keeplaived 脑裂

cat /tmp/check_keeplaived.sh

[root@lb02 ~]# cat /tmp/check_keepalived.sh

!/bin/sh

vip=10.0.0.3
master_ip=10.0.0.5

1.探测主机是否存活

ping -c 2 -W 3 $master_ip &>/dev/null

if [ ? -eq 0 -a(ip addr|grep "vip"|wc -l) -eq 1 ];then echo "(date +%F_%H:%M:%S) : Ha Is Error!" >>/tmp/ha.txt

#2.第二次测试
sleep 3
if [ $(ip addr|grep "$vip"|wc -l) -eq 1 ];then
    systemctl stop keepalived
    echo "$(date +%F_%H:%M:%S) : Ha Keeplaived is Off!" >>/tmp/ha.txt
fi

else
echo " $(date +%F_%H:%M:%S) : Ha is OK !!" >> /tmp/ha.txt
fi

可以放入crontab中,每分钟执行一次
*/1 * * * * sh /tmp/check_keepalived.sh


当nginx故障,强制切换keeplaived,保证业务可用

cat /tmp/check_web.sh

!/bin/sh

1.检查nginx进程是否存在,存在?返回结果为0,不存在?返回结果为1

ps -C nginx &>/dev/null
if [ ? -eq 0 ];then echo "(date +%F_%H:%M:%S) : nginx运行是正常的" >> /tmp/check_nginx.log
else
echo "$(date +%F_%H:%M:%S) : nginx运行异常,尝试重启nginx解决" >> /tmp/check_nginx.log
systemctl restart nginx

#2.重启nginx后再次进行判断,判断进程是否存活
sleep 3
ps -C nginx &>/dev/null
if [ $? -eq 0 ];then
    echo "$(date +%F_%H:%M:%S) : Nginx重启后已恢复正常 " >> /tmp/check_nginx.log
else
    echo "$(date +%F_%H:%M:%S) : Nginx重启后还故障, 尝试杀死keeplaived程序,保证业务稳定。" >> /tmp/check_nginx.log
    systemctl stop keeplaived
fi

fi

执行权限
[root@lb01 ~]# chmod +x /tmp/check_web.sh

3.在lb01主机的keepalived配置文件中调用此脚本
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
#1.每10秒执行一次脚本, 脚本执行内容不能超过10秒,否则会被中断再次重新运行脚本
vrrp_script check_nginx_web {
script "/server/scripts/check_web.sh"
interval 10
}
vrrp_instance VI_1 {
nopreempt
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}

    #2.调用并运行该脚本
    track_script {
        check_nginx_web     #调用名称
    }
}

1.什么是高可用 ---->keeplaived ---> VRRP
2.安装keeplaived
3.配置keeplaived
4.启动keeplaived
5.测试地址漂移
6.抢占式和非抢占式 2种方式
7.keeplaived和nginx之间关系
8.keeplaived脑裂
9.如果nginx故障,keeplaived不漂移VIP怎么办
注意:组播方式: 公网不支持,内网环境。
注意: 不支持在公有云上运行keeplaived,自带高可用。
PS: Keeplaived 双主

Nginx模块
index autoindex
[root@web01 down]# cat /etc/nginx/conf.d/autoindex.conf
server {
listen 80;
server_name auto.oldboy.com;
root /code/auto;

location / {
    index index.html;
}

location /down {            #这是url/目录名        #/code/auto/down
    charset utf8,gbk;
    autoindex on;
    autoindex_exact_size off;
}

}


nginx status状态模块

[root@web01 conf.d]# cat autoindex.conf
server {
listen 80;
server_name auto.oldboy.com;
location /nginx_status {
stub_status;
}
}

Active connections # 当前活动客户端连接数,包括Waiting等待连接数。
accepts # 已接受总的TCP连接数。
handled # 已处理总的TCP连接数。
requests # 客户端总的http请求数。

Reading # 当前nginx读取请求头的连接数。
Writing # 当前nginx将响应写回客户端的连接数。
Waiting # 当前等待请求的空闲客户端连接数。

注意, 一次TCP的连接,可以发起多次http的请求, 如下参数可配置进行验证

keepalive_timeout 0; # 类似于关闭长连接
keepalive_timeout 65; # 65s没有活动则断开连接


nginx 访问控制-access
[root@web01 conf.d]# cat autoindex.conf
server {
listen 80;
server_name auto.oldboy.com;

location /nginx_status {
    stub_status;
    allow 127.0.0.1;
    deny all;
}

}

注意:deny和allow的顺序是有影响的
默认情况下,从第一条规则进行匹配
如果匹配成功,则不继续匹配下面的内容。
如果匹配不成功,则继续往下寻找能匹配成功的内容。


nginx 访问控制-basic

1.准备密码文件
[root@xuliangwei ~]# yum install httpd-tools
#使用htpaaswd创建新的密码文件, -c创建新文件 -b允许命令行输入密码
[root@xuliangwei ~]# yum install httpd-tools
[root@xuliangwei ~]# htpasswd -b -c /etc/nginx/auth_conf xuliangwei 123456

2.修改nginx配置,并使用该密码
[root@web01 conf.d]# cat autoindex.conf
server {
listen 80;
server_name auto.oldboy.com;

location /nginx_status {
    stub_status;
    auth_basic " Welcome Nginx Auth";
    auth_basic_user_file /etc/nginx/auth_conf;
}

}

http {
limit_conn_zone $remote_addr zone=conn_zone:10m;
}
server {
imit_conn conn_zone 1;
}


conn连接限制 req请求限制

[root@web01 conf.d]# cat autoindex.conf
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;

server {
listen 80;
server_name auto.oldboy.com;
root /code/auto;

location / {
    index index.html;   
    # 请求超过1r/s,剩下的将被延迟处理,请求数超过burst定义的数量, 多余的请求返回503
    limit_req zone=req_zone burst=50 nodelay;   
}

}

Nginx连接限制没有请求限制有效?
我们先来回顾一下http协议的连接与请求,首先HTTP是建立在TCP基础之上, 在完成HTTP请求需要先建立TCP三次握手(称为TCP连接),在连接的基础上在完成HTTP的请求。

所以多个HTTP请求可以建立在一次TCP连接之上, 那么我们对请求的精度限制,当然比对一个连接的限制会更加的有效,因为同一时刻只允许一个TCP连接进入, 但是同一时刻多个HTTP请求可以通过一个TCP连接进入。所以针对HTTP的请求限制才是比较优的解决方案。

binary_remote_addr 4字节remote_addr 7-15字节


使用Nginx Location可以控制访问网站的路径, 但一个server允许出现多个location配置, 那多个location出现冲突谁的优先级会更高呢

1.Location语法示例
location [=|^||~|/] /uri/ { ...
}
2.Location语法优先级排列
匹配符 匹配规则 优先级
= 精确匹配 1
^~ 以某个字符串开头 2
~ 区分大小写的正则匹配 3
~
不区分大小写的正则匹配 4
/ 通用匹配,任何请求都会匹配到 5

3.配置网站验证Location优先级
[root@Nginx conf.d]# cat testserver.conf
server {
listen 80;
server_name module.oldboy.com;
location / {
default_type text/html;
return 200 "location /";
}

location =/ {
    default_type text/html;
    return 200 "location =/";
}

location ~ / {
    default_type text/html;
    return 200 "location ~/";
}

# location ^~ / {
#   default_type text/html;
#   return 200 "location ^~";
# }

}
4.测试Location优先级

优先级最高符号=

[root@Nginx conf.d]# curl module.oldboy.com
location =/

注释掉精确匹配=, 重启Nginx

[root@Nginx ~]# curl module.oldboy.com
location ~/

注释掉~, 重启Nginx

[root@Nginx ~]# curl module.oldboy.com
location /

5.Locaiton规则配置应用场景

# 通用匹配,任何请求都会匹配到
location / {
    root /code;
    index index.html;
    ...
}

# 严格区分大小写,匹配以.php结尾的都走这个location    
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    ...
}

# 严格区分大小写,匹配以.jsp结尾的都走这个location 
location ~ \.jsp$ {
    proxy_pass 127.0.0.1:8080;
    ...
}

# 不区分大小写匹配,只要用户访问.jpg,gif,png,js,css 都走这条location
location ~* .*\.(jpg|gif|png|js|css)$ {
    expire 7d;
    ...
}

location = /error.html {
    root /code;
}

ngx_http_sub_module替换模块,用于演示服务器被劫持效果。
[root@lb01 conf.d]# cat proxy_web.oldboy.com.conf
server {
listen 80;
server_name web.oldboy.com;
location / {
proxy_pass http://10.0.0.7:80;
sub_filter 'web01-7...' '<img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1554024141222&di=df269b2bbc2cdb462b4775593beb4ae7&imgtype=0&src=http%3A%2F%2F5b0988e595225.cdn.sohucs.com%2Fimages%2F20171217%2F5080ee5d44094e76a160389e7e02f379.jpeg">';
include proxy_params;
}
}


常用模块
1.autoindex目录索引模块
2.nginx_status状态模块,用于监控的
3.nginx_access访问控制,基于来源IP的限制
4.nginx_auth_basic访问控制,基于用户名和密码的限制
5.nginx_limit_req 访问限制,基于客户端的请求数做限制 nginx_limit_conn基于连接数做限制
6.nginx location优先级,location每个符号使用的场景
7.nginx_sub替换模块,在返回给客户端时,可将返回的页面进行修改。


nginx常见问题

1.Nginx多Server访问网站错乱。在开始处理一个http请求时,nginx会取出header头中的Host变量,与nginx.conf中每个server的server_name进行匹配,以此决定到底由哪一个server来处理这个请求。

1.准备nginx对应的配置文件

[root@web02 conf.d]# cat code1.conf
server {
listen 80;
server_name code1.bgx.com;
location / {
root /code1;
index index.html;
}
}
[root@web02 conf.d]# cat code2.conf
server {
listen 80;
server_name code2.bgx.com;
location / {
root /code2;
index index.html;
}
}
[root@web02 conf.d]# cat code3.conf
server {
listen 80;
server_name code3.bgx.com;
location / {
root /code3;
index index.html;
}
}
2.准备站点目录
[root@web02 conf.d]# mkdir /code{1..3} -p
[root@web01 conf.d]# echo "Code1_webpage" > /code1/index.html
[root@web01 conf.d]# echo "Code2_webpage" > /code2/index.html
[root@web01 conf.d]# echo "Code3_webpage" > /code3/index.html

3.检查语法, 并重新加载Nginx
[root@Nginx ~]# systemctl restart nginx

4.测试访问效果
[root@web01 conf.d]# curl -H Host:code1.bgx.com 127.0.0.1
Code1_webpage
[root@web01 conf.d]# curl -H Host:code2.bgx.com 127.0.0.1
Code2_webpage
[root@web01 conf.d]# curl -H Host:code3.bgx.com 127.0.0.1
Code3_webpage

5.如果不使用域名访问,通过IP访问,会返回谁的结果。
[root@web01 conf.d]# curl localhost #如果无法匹配,则默认由conf.d目录下名称最靠前的server匹配并解析
Code1_webpage

6.如果希望默认返回的配置文件,可在该配置文件的listen段加入default_server即可
[root@web01 conf.d]# curl localhost
Code3_webpage

注意:建议配置相同端口, 不同域名,使用域名访问,不要通过IP地址访问。这样不会出现访问错乱的问题。

2.Nginx禁止IP直接访问
当用户通过访问IP或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回500,目前国内很多机房都要求网站主关闭空主机头,防止未备案的域名指向过来造成麻烦
server {
listen 80;
server_name www.xuliangwei.com # 这里指定自己的域名
}
server{
listen 80 default_server; # 默认优先返回
return 500; # 返回500错误
}

2.也可以将流量集中导入自己的网站,只要做以下跳转设置就可以
server {
    listen 80 default_server;
    return 302 https://www.xuliangwei.com;
}

3.Nginx包含文件Include 一台服务器配置多个server网站,如果配置都写在nginx.conf主配置文件中,会导致nginx.conf主配置文件变得非常庞大而且可读性非常的差。那么后期的维护就变得麻烦。
假设现在希望快速的关闭一个站点,该怎么办?
1.如果是写在nginx.conf中,则需要手动注释,比较麻烦
2.如果是include的方式,那么仅需修改配置文件的扩展名,即可完成注释

Include包含的作用是为了简化主配置文件,便于人类可读。

4.Nginx调整上传文件大小
在nginx使用过程中,上传文件的过程中,通常需要设置nginx报文大小限制。避免出现413 Request Entity Too Large

nginx上传文件大小限制配置语法

Syntax: client_max_body_size size;
Default: client_max_body_size 1m;
Context: http, server, location
nginx上传文件大小限制配置示例

#也可以放入http层,全局生效
server {
...
    client_max_body_size 200m;
...
}

5.Nginx优雅显示错误页面,使用nginx的error_page
[root@web01 conf.d]# cat code3.conf
server {
listen 80;
server_name code.oldboy.com;
location / {
root /code;
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:900;
}

    #如服务器返回如下错误状态码,则进行跳转,跳转至/404.html
    error_page 404 403 /40x.html;
    
    #如服务器返回如下错误状态码,则进行跳转,跳转至/50x.html
    error_page 500 502 503 504  /50x.html;

    #精准匹配访问
    location = /404.html {
       root /code;
    }
    location = /50x.html {
       root /code;
    }
}





多server_name访问效果不是我们想要的
禁止通过IP直接访问服务器
include包含
客户端上传大小限制
错误页面优雅显示

https://www.xuliangwei.com/bgx/1264.html

nginx优化、nginx总结

Firewalld zabbix grafana ansible openvpn

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容