day12

下周:
keepalived(高可用軟件,和nginx沒有關(guān)系)
nginx常用模塊、nginx常見問題

1.什么是高可用。
啟動(dòng)兩臺相同的業(yè)務(wù)主機(jī),一臺故障一臺自動(dòng)接管。(兩臺服務(wù)器的配置是一模一樣。)

2.高可用用什么手段實(shí)現(xiàn)
硬件、軟件(Keepalived)

3.Keepalived如何實(shí)現(xiàn)的高可用
VRRP 虛擬路由冗余協(xié)議

4.VRRP怎么誕生的?
單點(diǎn)故障、arp vmac-->vip--backup

5.高可用使用的場景
保證業(yè)務(wù)7x24

1.實(shí)踐環(huán)境,配置實(shí)現(xiàn)虛IP轉(zhuǎn)移
狀態(tài) IP 角色
節(jié)點(diǎn)1 10.0.0.5 Master
節(jié)點(diǎn)2 10.0.0.6 Backup
VIP 10.0.0.3

1.安裝keepalived,如下操作 【兩臺機(jī)器都需要操作】

yum install keepalived -y

2.配置

配置節(jié)點(diǎn)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
}
}

配置節(jié)點(diǎn)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配置的區(qū)別
Keepalived配置區(qū)別 Master配置 Backup節(jié)配置
route_id(唯一標(biāo)識) lb01 lb02
state(角色狀態(tài)) MASTER BACKUP
priority(優(yōu)先級) 100 99

6.啟動(dòng)

systemctl start keepalived

systemctl enable keepalived

7.測試
windows arp -a 查看緩存表
keepalived僅僅只是實(shí)現(xiàn)IP地址的漂移,除此之外,無任何的功能。(通過抓包分析、日志觀察)
只要發(fā)生切換,keepalived就會通知客戶端更新 新的arp緩存表 ----> vip不變 vmac更新

keepalived默認(rèn)是搶占式
當(dāng)master故障,backup接管,當(dāng)修復(fù)好master,master會搶占backup的vip。 (會發(fā)生2次切換,1次故障,1次恢復(fù)。)
keeplaived非搶占式

配置非搶占式步驟如下
1、兩個(gè)節(jié)點(diǎn)的state都必須配置為BACKUP(官方建議)
2、兩個(gè)節(jié)點(diǎn)都在vrrp_instance中添加nopreempt參數(shù)。
3、兩個(gè)節(jié)點(diǎn)的優(yōu)先級有一臺必須要高于另外一個(gè)臺。150 100
PS:兩臺服務(wù)器都角色狀態(tài)啟用nopreempt后,必須修改角色狀態(tài)統(tǒng)一為BACKUP,唯一的區(qū)分就是優(yōu)先級。

PS:通常如果master服務(wù)死掉后backup會變成master,但是當(dāng)master服務(wù)又好了的時(shí)候 master此時(shí)會搶占VIP,這樣就會發(fā)生兩次切換對業(yè)務(wù)繁忙的網(wǎng)站來說是不好的。所以我們要在配置文件加入 nopreempt 非搶占,但是這個(gè)參數(shù)只能用于state 為backup,故我們在用HA的時(shí)候最好master 和backup的state都設(shè)置成backup 讓其通過priority來競爭。

Master

vrrp_instance VI_1 {
    state BACKUP
    priority 150
    nopreempt
}

Backup

vrrp_instance VI_1 {
    state BACKUP
    priority 100
    nopreempt
}

keeplaived nginx之間的關(guān)系
keeplaived只做地址漂移。
nginx對外暴露80端口,實(shí)際上是對所有的網(wǎng)卡暴露。
PS:只要訪問keeplaived的虛擬IP:80,實(shí)際上就是在訪問某一臺服務(wù)器的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.探測主機(jī)是否存活

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中,每分鐘執(zhí)行一次
*/1 * * * * sh /tmp/check_keepalived.sh


當(dāng)nginx故障,強(qiáng)制切換keeplaived,保證業(yè)務(wù)可用

cat /tmp/check_web.sh

!/bin/sh

1.檢查nginx進(jìn)程是否存在,存在?返回結(jié)果為0,不存在?返回結(jié)果為1

ps -C nginx &>/dev/null
if [ ? -eq 0 ];then echo "(date +%F_%H:%M:%S) : nginx運(yùn)行是正常的" >> /tmp/check_nginx.log
else
echo "$(date +%F_%H:%M:%S) : nginx運(yùn)行異常,嘗試重啟nginx解決" >> /tmp/check_nginx.log
systemctl restart nginx

#2.重啟nginx后再次進(jìn)行判斷,判斷進(jìn)程是否存活
sleep 3
ps -C nginx &>/dev/null
if [ $? -eq 0 ];then
    echo "$(date +%F_%H:%M:%S) : Nginx重啟后已恢復(fù)正常 " >> /tmp/check_nginx.log
else
    echo "$(date +%F_%H:%M:%S) : Nginx重啟后還故障, 嘗試殺死keeplaived程序,保證業(yè)務(wù)穩(wěn)定。" >> /tmp/check_nginx.log
    systemctl stop keeplaived
fi

fi

執(zhí)行權(quán)限
[root@lb01 ~]# chmod +x /tmp/check_web.sh

3.在lb01主機(jī)的keepalived配置文件中調(diào)用此腳本
[root@lb01 ~]# cat /etc/keepalived/keepalived.conf
global_defs {
router_id LVS_01
}
#1.每10秒執(zhí)行一次腳本, 腳本執(zhí)行內(nèi)容不能超過10秒,否則會被中斷再次重新運(yùn)行腳本
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.調(diào)用并運(yùn)行該腳本
    track_script {
        check_nginx_web     #調(diào)用名稱
    }
}

1.什么是高可用 ---->keeplaived ---> VRRP
2.安裝keeplaived
3.配置keeplaived
4.啟動(dòng)keeplaived
5.測試地址漂移
6.搶占式和非搶占式 2種方式
7.keeplaived和nginx之間關(guān)系
8.keeplaived腦裂
9.如果nginx故障,keeplaived不漂移VIP怎么辦
注意:組播方式: 公網(wǎng)不支持,內(nèi)網(wǎng)環(huán)境。
注意: 不支持在公有云上運(yùn)行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狀態(tài)模塊

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

Active connections # 當(dāng)前活動(dòng)客戶端連接數(shù),包括Waiting等待連接數(shù)。
accepts # 已接受總的TCP連接數(shù)。
handled # 已處理總的TCP連接數(shù)。
requests # 客戶端總的http請求數(shù)。

Reading # 當(dāng)前nginx讀取請求頭的連接數(shù)。
Writing # 當(dāng)前nginx將響應(yīng)寫回客戶端的連接數(shù)。
Waiting # 當(dāng)前等待請求的空閑客戶端連接數(shù)。

注意, 一次TCP的連接,可以發(fā)起多次http的請求, 如下參數(shù)可配置進(jìn)行驗(yàn)證

keepalive_timeout 0; # 類似于關(guān)閉長連接
keepalive_timeout 65; # 65s沒有活動(dòng)則斷開連接


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的順序是有影響的
默認(rèn)情況下,從第一條規(guī)則進(jìn)行匹配
如果匹配成功,則不繼續(xù)匹配下面的內(nèi)容。
如果匹配不成功,則繼續(xù)往下尋找能匹配成功的內(nèi)容。


nginx 訪問控制-basic

1.準(zhǔn)備密碼文件
[root@xuliangwei ~]# yum install httpd-tools
#使用htpaaswd創(chuàng)建新的密碼文件, -c創(chuàng)建新文件 -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,剩下的將被延遲處理,請求數(shù)超過burst定義的數(shù)量, 多余的請求返回503
    limit_req zone=req_zone burst=50 nodelay;   
}

}

Nginx連接限制沒有請求限制有效?
我們先來回顧一下http協(xié)議的連接與請求,首先HTTP是建立在TCP基礎(chǔ)之上, 在完成HTTP請求需要先建立TCP三次握手(稱為TCP連接),在連接的基礎(chǔ)上在完成HTTP的請求。

所以多個(gè)HTTP請求可以建立在一次TCP連接之上, 那么我們對請求的精度限制,當(dāng)然比對一個(gè)連接的限制會更加的有效,因?yàn)橥粫r(shí)刻只允許一個(gè)TCP連接進(jìn)入, 但是同一時(shí)刻多個(gè)HTTP請求可以通過一個(gè)TCP連接進(jìn)入。所以針對HTTP的請求限制才是比較優(yōu)的解決方案。

binary_remote_addr 4字節(jié)remote_addr 7-15字節(jié)


使用Nginx Location可以控制訪問網(wǎng)站的路徑, 但一個(gè)server允許出現(xiàn)多個(gè)location配置, 那多個(gè)location出現(xiàn)沖突誰的優(yōu)先級會更高呢

1.Location語法示例
location [=|^||~|/] /uri/ { ...
}
2.Location語法優(yōu)先級排列
匹配符 匹配規(guī)則 優(yōu)先級
= 精確匹配 1
^~ 以某個(gè)字符串開頭 2
~ 區(qū)分大小寫的正則匹配 3
~
不區(qū)分大小寫的正則匹配 4
/ 通用匹配,任何請求都會匹配到 5

3.配置網(wǎng)站驗(yàn)證Location優(yōu)先級
[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優(yōu)先級

優(yōu)先級最高符號=

[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規(guī)則配置應(yīng)用場景

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

# 嚴(yán)格區(qū)分大小寫,匹配以.php結(jié)尾的都走這個(gè)location    
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    ...
}

# 嚴(yán)格區(qū)分大小寫,匹配以.jsp結(jié)尾的都走這個(gè)location 
location ~ \.jsp$ {
    proxy_pass 127.0.0.1:8080;
    ...
}

# 不區(qū)分大小寫匹配,只要用戶訪問.jpg,gif,png,js,css 都走這條location
location ~* .*\.(jpg|gif|png|js|css)$ {
    expire 7d;
    ...
}

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

ngx_http_sub_module替換模塊,用于演示服務(wù)器被劫持效果。
[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狀態(tài)模塊,用于監(jiān)控的
3.nginx_access訪問控制,基于來源IP的限制
4.nginx_auth_basic訪問控制,基于用戶名和密碼的限制
5.nginx_limit_req 訪問限制,基于客戶端的請求數(shù)做限制 nginx_limit_conn基于連接數(shù)做限制
6.nginx location優(yōu)先級,location每個(gè)符號使用的場景
7.nginx_sub替換模塊,在返回給客戶端時(shí),可將返回的頁面進(jìn)行修改。


nginx常見問題

1.Nginx多Server訪問網(wǎng)站錯(cuò)亂。在開始處理一個(gè)http請求時(shí),nginx會取出header頭中的Host變量,與nginx.conf中每個(gè)server的server_name進(jìn)行匹配,以此決定到底由哪一個(gè)server來處理這個(gè)請求。

1.準(zhǔn)備nginx對應(yīng)的配置文件

[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.準(zhǔn)備站點(diǎn)目錄
[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訪問,會返回誰的結(jié)果。
[root@web01 conf.d]# curl localhost #如果無法匹配,則默認(rèn)由conf.d目錄下名稱最靠前的server匹配并解析
Code1_webpage

6.如果希望默認(rèn)返回的配置文件,可在該配置文件的listen段加入default_server即可
[root@web01 conf.d]# curl localhost
Code3_webpage

注意:建議配置相同端口, 不同域名,使用域名訪問,不要通過IP地址訪問。這樣不會出現(xiàn)訪問錯(cuò)亂的問題。

2.Nginx禁止IP直接訪問
當(dāng)用戶通過訪問IP或者未知域名訪問你的網(wǎng)站的時(shí)候,你希望禁止顯示任何有效內(nèi)容,可以給他返回500,目前國內(nèi)很多機(jī)房都要求網(wǎng)站主關(guān)閉空主機(jī)頭,防止未備案的域名指向過來造成麻煩
server {
listen 80;
server_name www.xuliangwei.com # 這里指定自己的域名
}
server{
listen 80 default_server; # 默認(rèn)優(yōu)先返回
return 500; # 返回500錯(cuò)誤
}

2.也可以將流量集中導(dǎo)入自己的網(wǎng)站,只要做以下跳轉(zhuǎn)設(shè)置就可以
server {
    listen 80 default_server;
    return 302 https://www.xuliangwei.com;
}

3.Nginx包含文件Include 一臺服務(wù)器配置多個(gè)server網(wǎng)站,如果配置都寫在nginx.conf主配置文件中,會導(dǎo)致nginx.conf主配置文件變得非常龐大而且可讀性非常的差。那么后期的維護(hù)就變得麻煩。
假設(shè)現(xiàn)在希望快速的關(guān)閉一個(gè)站點(diǎn),該怎么辦?
1.如果是寫在nginx.conf中,則需要手動(dòng)注釋,比較麻煩
2.如果是include的方式,那么僅需修改配置文件的擴(kuò)展名,即可完成注釋

Include包含的作用是為了簡化主配置文件,便于人類可讀。

4.Nginx調(diào)整上傳文件大小
在nginx使用過程中,上傳文件的過程中,通常需要設(shè)置nginx報(bào)文大小限制。避免出現(xiàn)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優(yōu)雅顯示錯(cuò)誤頁面,使用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;
}

    #如服務(wù)器返回如下錯(cuò)誤狀態(tài)碼,則進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)至/404.html
    error_page 404 403 /40x.html;
    
    #如服務(wù)器返回如下錯(cuò)誤狀態(tài)碼,則進(jìn)行跳轉(zhuǎn),跳轉(zhuǎn)至/50x.html
    error_page 500 502 503 504  /50x.html;

    #精準(zhǔn)匹配訪問
    location = /404.html {
       root /code;
    }
    location = /50x.html {
       root /code;
    }
}





多server_name訪問效果不是我們想要的
禁止通過IP直接訪問服務(wù)器
include包含
客戶端上傳大小限制
錯(cuò)誤頁面優(yōu)雅顯示

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

nginx優(yōu)化、nginx總結(jié)

Firewalld zabbix grafana ansible openvpn

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容