引言
引言
等,軟件層的負(fù)載也是本文的重點(diǎn),畢竟Boss們的準(zhǔn)則之一就是:「「能靠技術(shù)實(shí)現(xiàn)的就盡量不花錢?!埂?/strong> 一、性能怪獸-Nginx概念深入淺出Nginx是目前負(fù)載均衡技術(shù)中的主流方案,幾乎絕大部分項(xiàng)目都會(huì)使用它,Nginx是一個(gè)輕量級(jí)的高性能HTTP反向代理服務(wù)器,同時(shí)它也是一個(gè)通用類型的代理服務(wù)器,支持絕大部分協(xié)議,如TCP、UDP、SMTP、HTTPS等。 Nginx與Redis相同,都是基于多路復(fù)用模型構(gòu)建出的產(chǎn)物,因此它與Redis同樣具備 「「資源占用少、并發(fā)支持高」」 的特點(diǎn),在理論上單節(jié)點(diǎn)的Nginx同時(shí)支持5W并發(fā)連接,而實(shí)際生產(chǎn)環(huán)境中,硬件基礎(chǔ)到位再結(jié)合簡(jiǎn)單調(diào)優(yōu)后確實(shí)能達(dá)到該數(shù)值。 后,所有的請(qǐng)求會(huì)先經(jīng)過Nginx,再由其進(jìn)行分發(fā)到具體的服務(wù)器處理,處理完成后再返回 Nginx,最后由Nginx將最終的響應(yīng)結(jié)果返回給客戶端。了解了Nginx的基本概念后,再來(lái)快速搭建一下環(huán)境,以及了解一些Nginx的高級(jí)特性,如動(dòng)靜分離、資源壓縮、緩存配置、IP 二、Nginx環(huán)境搭建[root@localhost]# mkdir /soft && mkdir /soft/nginx/ [root@localhost]# cd /soft/nginx/ [root@localhost]# wget https:///download/nginx-1.21.6.tar.gz 沒有wget命令的可通過yum命令安裝: [root@localhost]# yum -y install wget ?解壓Nginx的壓縮包: [root@localhost]# tar -xvzf nginx-1.21.6.tar.gz ?下載并安裝Nginx所需的依賴庫(kù)和包: [root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ gcc-c++ [root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ pcre pcre-devel4 [root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ zlib zlib-devel [root@localhost]# yum install --downloadonly --downloaddir=/soft/nginx/ openssl openssl-devel 也可以通過yum命令一鍵下載(推薦上面哪種方式): [root@localhost]# yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 執(zhí)行完成后,然后ls查看目錄文件,會(huì)看一大堆依賴: [root@localhost]# cd nginx-1.21.6 [root@localhost]# ./configure --prefix=/soft/nginx/ ?編譯并安裝Nginx:
[root@localhost]# ps aux | grep nginx Nginx 其他操作命令:sbin/nginx -t -c conf/nginx.conf # 檢測(cè)配置文件是否正常 sbin/nginx -s reload -c conf/nginx.conf # 修改配置后平滑重啟 sbin/nginx -s quit # 優(yōu)雅關(guān)閉Nginx,會(huì)在執(zhí)行完當(dāng)前的任務(wù)后再退出 sbin/nginx -s stop # 強(qiáng)制終止Nginx,不管當(dāng)前是否有任務(wù)在執(zhí)行 ?開放80端口,并更新防火墻: [root@localhost]# firewall-cmd --zone=public --add-port=80/tcp --permanent [root@localhost]# firewall-cmd --reload [root@localhost]# firewall-cmd --zone=public --list-ports ?在Windows/Mac的瀏覽器中,直接輸入剛剛配置的IP地址訪問Nginx:最終看到如上的 Nginx歡迎界面,代表Nginx安裝完成。 三、Nginx反向代理-負(fù)載均衡@Controller public class IndexNginxController { @Value('${server.port}') private String port; @RequestMapping('/') public ModelAndView index(){ ModelAndView model = new ModelAndView(); model.addObject('port', port); model.setViewName('index'); return model; } } 在該Controller類中,存在一個(gè)成員變量:port,它的值即是從application.properties <html> <head> <title>Nginx演示頁(yè)面</title> <link href='nginx_style.css' rel='stylesheet' type='text/css'/> </head> <body> <div style='border: 2px solid red;margin: auto;width: 800px;text-align: center'> <div id='nginx_title'> <h1>歡迎來(lái)到熊貓高級(jí)會(huì)所,我是竹子${port}號(hào)!</h1> </div> </div> </body> </html> port 輸出。nginx.conf 的配置即可:upstream nginx_boot{ # 30s內(nèi)檢查心跳發(fā)送兩次包,未回復(fù)就代表該機(jī)器宕機(jī),請(qǐng)求分發(fā)權(quán)重比為1:2 server 192.168.0.000:8080 weight=100 max_fails=2 fail_timeout=30s; server 192.168.0.000:8090 weight=200 max_fails=2 fail_timeout=30s; # 這里的IP請(qǐng)配置成你WEB服務(wù)所在的機(jī)器IP } server { location / { root html; # 配置一下index的地址,最后加上index.ftl。 index index.html index.htm index.jsp index.ftl; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 請(qǐng)求交給名為nginx_boot的upstream上 proxy_pass http://nginx_boot; } } ? Nginx請(qǐng)求分發(fā)原理
四、Nginx動(dòng)靜分離location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){ root /soft/nginx/static_resources; expires 7d; } 然后照常啟動(dòng)nginx和移除了靜態(tài)資源的WEB服務(wù),你會(huì)發(fā)現(xiàn)原本的樣式、js效果、圖片等依舊有效,如下: 文件已被移除,但效果依舊存在(綠色字體+藍(lán)色大邊框):
五、Nginx資源壓縮http{ # 開啟壓縮機(jī)制 gzip on; # 指定會(huì)被壓縮的文件類型(也可自己配置其他類型) gzip_types text/plain application/javascript text/css application/xml text/javascript image/jpeg image/gif image/png; # 設(shè)置壓縮級(jí)別,越高資源消耗越大,但壓縮效果越好 gzip_comp_level 5; # 在頭部中添加Vary: Accept-Encoding(建議開啟) gzip_vary on; # 處理壓縮請(qǐng)求的緩沖區(qū)數(shù)量和大小 gzip_buffers 16 8k; # 對(duì)于不支持壓縮功能的客戶端請(qǐng)求不開啟壓縮機(jī)制 gzip_disable 'MSIE [1-6]\.'; # 低版本的IE瀏覽器不支持壓縮 # 設(shè)置壓縮響應(yīng)所支持的HTTP最低版本 gzip_http_version 1.1; # 設(shè)置觸發(fā)壓縮的最小閾值 gzip_min_length 2k; # 關(guān)閉對(duì)后端服務(wù)器的響應(yīng)結(jié)果進(jìn)行壓縮 gzip_proxied off; }
六、Nginx緩沖區(qū)其實(shí)也就類似電腦的內(nèi)存跟不上CPU速度,所以對(duì)于用戶造成的體驗(yàn)感極差,因此在CPU設(shè)計(jì)時(shí)都會(huì)加入三級(jí)高速緩沖區(qū),用于緩解CPU和內(nèi)存速率不一致的矛盾。在Nginx也同樣存在緩沖區(qū)的機(jī)制,主要目的就在于:「「用來(lái)解決兩個(gè)連接之間速度不匹配造成的問題」」 ,有了緩沖后,Nginx代理可暫存后端的響應(yīng),然后按需供給數(shù)據(jù)給客戶端。先來(lái)看看一些關(guān)于緩沖區(qū)的配置項(xiàng): proxy_buffering:是否啟用緩沖機(jī)制,默認(rèn)為on關(guān)閉狀態(tài)。
nginx.conf 配置如下:http{ proxy_connect_timeout 10; proxy_read_timeout 120; proxy_send_timeout 10; proxy_buffering on; client_body_buffer_size 512k; proxy_buffers 4 64k; proxy_buffer_size 16k; proxy_busy_buffers_size 128k; proxy_temp_file_write_size 128k; proxy_temp_path /soft/nginx/temp_buffer; } 上述的緩沖區(qū)參數(shù),是基于每個(gè)請(qǐng)求分配的空間,而并不是所有請(qǐng)求的共享空間。當(dāng)然,具體的參數(shù)值還需要根據(jù)業(yè)務(wù)去決定,要綜合考慮機(jī)器的內(nèi)存以及每個(gè)請(qǐng)求的平均數(shù)據(jù)大小。 七、Nginx緩存機(jī)制
proxy_cache_valid 200 302 30m;
timeout|invalid_header|updating|http_500... 。
$cookie_nocache $arg_nocache $arg_comment; proxy_cache_bypass string...; 和上面proxy_no_cache的配置方法類似。
http{ # 設(shè)置緩存的目錄,并且內(nèi)存中緩存區(qū)名為hot_cache,大小為128m, # 三天未被訪問過的緩存自動(dòng)清楚,磁盤中緩存的最大容量為2GB。 proxy_cache_path /soft/nginx/cache levels=1:2 keys_zone=hot_cache:128m inactive=3d max_size=2g; http{ # 設(shè)置緩存的目錄,并且內(nèi)存中緩存區(qū)名為hot_cache,大小為128m, # 三天未被訪問過的緩存自動(dòng)清楚,磁盤中緩存的最大容量為2GB。 proxy_cache_path /soft/nginx/cache levels=1:2 keys_zone=hot_cache:128m inactive=3d max_size=2g; server{ location / { # 使用名為nginx_cache的緩存空間 proxy_cache hot_cache; # 對(duì)于200、206、304、301、302狀態(tài)碼的數(shù)據(jù)緩存1天 proxy_cache_valid 200 206 304 301 302 1d; # 對(duì)于其他狀態(tài)的數(shù)據(jù)緩存30分鐘 proxy_cache_valid any 30m; # 定義生成緩存鍵的規(guī)則(請(qǐng)求的url+參數(shù)作為key) proxy_cache_key $host$uri$is_args$args; # 資源至少被重復(fù)訪問三次后再加入緩存 proxy_cache_min_uses 3; # 出現(xiàn)重復(fù)請(qǐng)求時(shí),只讓一個(gè)去后端讀數(shù)據(jù),其他的從緩存中讀取 proxy_cache_lock on; # 上面的鎖超時(shí)時(shí)間為3s,超過3s未獲取數(shù)據(jù),其他請(qǐng)求直接去后端 proxy_cache_lock_timeout 3s; # 對(duì)于請(qǐng)求參數(shù)或cookie中聲明了不緩存的數(shù)據(jù),不再加入緩存 proxy_no_cache $cookie_nocache $arg_nocache $arg_comment; # 在響應(yīng)頭中添加一個(gè)緩存是否命中的狀態(tài)(便于調(diào)試) add_header Cache-status $upstream_cache_status; } } } 接著來(lái)看一下效果,如下: 緩存清理目錄:
[root@localhost]# tar -xvzf 2.3.tar.gz
配置,再添加一條location 規(guī)則: location ~ /purge(/.*) { # 配置可以執(zhí)行清除操作的IP(線上可以配置成內(nèi)網(wǎng)機(jī)器) # allow 127.0.0.1; # 代表本機(jī) allow all; # 代表允許任意IP清除緩存 proxy_cache_purge $host$1$is_args$args; } 然后再重啟Nginx,接下來(lái)即可通過http://xxx/purge/xx的方式清除緩存。 八、Nginx實(shí)現(xiàn)IP黑白名單
文件中定然是不顯示的,這種方式比較冗余,那么可以新建兩個(gè)文件 BlocksIP.conf、WhiteIP.conf: # --------黑名單:BlocksIP.conf--------- deny 192.177.12.222; # 屏蔽192.177.12.222訪問 deny 192.177.44.201; # 屏蔽192.177.44.201訪問 deny 127.0.0.0/8; # 屏蔽127.0.0.1到127.255.255.254網(wǎng)段中的所有IP訪問 # --------白名單:WhiteIP.conf--------- allow 192.177.12.222; # 允許192.177.12.222訪問 allow 192.177.44.201; # 允許192.177.44.201訪問 allow 127.45.0.0/16; # 允許127.45.0.1到127.45.255.254網(wǎng)段中的所有IP訪問 deny all; # 除開上述IP外,其他IP全部禁止訪問分別將要禁止/開放的IP http{ # 屏蔽該文件中的所有IP include /soft/nginx/IP/BlocksIP.conf; server{ location xxx { # 某一系列接口只開放給白名單中的IP include /soft/nginx/IP/blockip.conf; } } } 對(duì)于文件具體在哪兒導(dǎo)入,這個(gè)也并非隨意的,如果要整站屏蔽/開放就在http中導(dǎo)入,如果只需要一個(gè)域名下屏蔽/開放就在sever中導(dǎo)入,如果只需要針對(duì)于某一系列接口屏蔽/開放IP IP庫(kù))。 九、Nginx跨域配置跨域問題產(chǎn)生的原因Nginx解決跨域問題nginx.conf中稍微添加一點(diǎn)配置即可: location / { # 允許跨域的請(qǐng)求,可以自定義變量$http_origin,*表示所有 add_header 'Access-Control-Allow-Origin' *; # 允許攜帶cookie請(qǐng)求 add_header 'Access-Control-Allow-Credentials' 'true'; # 允許跨域請(qǐng)求的方法:GET,POST,OPTIONS,PUT add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS,PUT'; # 允許請(qǐng)求時(shí)攜帶的頭部信息,*表示所有 add_header 'Access-Control-Allow-Headers' *; # 允許發(fā)送按段獲取資源的請(qǐng)求 add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; # 一定要有?。?!否則Post請(qǐng)求無(wú)法進(jìn)行跨域! # 在發(fā)送Post跨域請(qǐng)求前,會(huì)以O(shè)ptions方式發(fā)送預(yù)檢請(qǐng)求,服務(wù)器接受時(shí)才會(huì)正式請(qǐng)求 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; # 對(duì)于Options方式的請(qǐng)求返回204,表示接受跨域請(qǐng)求 return 204; } } 類、實(shí)現(xiàn)WebMvcConfigurer接口、添加@CrossOrgin注解的方式實(shí)現(xiàn)接口之間的跨域配置。 十、Nginx防盜鏈設(shè)計(jì)首先了解一下何謂盜鏈:「「盜鏈即是指外部網(wǎng)站引入當(dāng)前網(wǎng)站的資源對(duì)外展示」」 ,來(lái)舉個(gè)簡(jiǎn)單的例子理解: ? Nginx的防盜鏈機(jī)制實(shí)現(xiàn),跟一個(gè)頭部字段:Referer有關(guān),該字段主要描述了當(dāng)前請(qǐng)求是從哪兒發(fā)出的,那么在Nginx中就可獲取該值,然后判斷是否為本站的資源引用請(qǐng)求,如果不是則不允許訪問。 Nginx中存在一個(gè)配置項(xiàng)為valid_referers,正好可以滿足前面的需求,語(yǔ)法如下:
# 在動(dòng)靜分離的location中開啟防盜鏈機(jī)制 location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css){ # 最后面的值在上線前可配置為允許的域名地址 valid_referers blocked 192.168.12.129; if ($invalid_referer) { # 可以配置成返回一張禁止盜取的圖片 # rewrite ^/ http://xx./NO.jpg; # 也可直接返回403 return 403; } root /soft/nginx/static_resources; expires 7d; } 根據(jù)上述中的內(nèi)容配置后,就已經(jīng)通過Nginx實(shí)現(xiàn)了最基本的防盜鏈機(jī)制,最后只需要額外重啟一下就好啦!當(dāng)然,對(duì)于防盜鏈機(jī)制實(shí)現(xiàn)這塊,也有專門的第三方模塊ngx_http_accesskey_module實(shí)現(xiàn)了更為完善的設(shè)計(jì),感興趣的小伙伴可以自行去看看。 十一、Nginx大文件傳輸配置、proxy_send_timeout這四個(gè)參數(shù)值都可以根據(jù)自己項(xiàng)目的實(shí)際情況來(lái)配置。 Nginx中也可以作為文件服務(wù)器使用,但需要用到一個(gè)專門的第三方模塊nginx-upload-module,如果項(xiàng)目中文件上傳的作用處不多,那么建議可以通過Nginx搭建,畢竟可以節(jié)省一臺(tái)文件服務(wù)器資源。但如若文件上傳/下載較為頻繁,那么還是建議額外搭建文件服務(wù)器,并將上傳/下載功能交由后端處理。 十二、Nginx配置SLL證書端口的請(qǐng)求,HTTPS為了確保通信安全,所以服務(wù)端需配置對(duì)應(yīng)的數(shù)字證書,當(dāng)項(xiàng)目使用 Nginx作為網(wǎng)關(guān)時(shí),那么證書在Nginx中也需要配置,接下來(lái)簡(jiǎn)單聊一下關(guān)于SSL 證書配置過程:版本的證書。
# ----------HTTPS配置----------- server { # 監(jiān)聽HTTPS默認(rèn)的443端口 listen 443; # 配置自己項(xiàng)目的域名 server_name www.x; # 打開SSL加密傳輸 ssl on; # 輸入域名后,首頁(yè)文件所在的目錄 root html; # 配置首頁(yè)的文件名 index index.html index.htm index.jsp index.ftl; # 配置自己下載的數(shù)字證書 ssl_certificate certificate/xxx.pem; # 配置自己下載的服務(wù)器私鑰 ssl_certificate_key certificate/xxx.key; # 停止通信時(shí),加密會(huì)話的有效期,在該時(shí)間段內(nèi)不需要重新交換密鑰 ssl_session_timeout 5m; # TLS握手時(shí),服務(wù)器采用的密碼套件 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # 服務(wù)器支持的TLS版本 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 開啟由服務(wù)器決定采用的密碼套件 ssl_prefer_server_ciphers on; location / { .... } } # ---------HTTP請(qǐng)求轉(zhuǎn)HTTPS------------- server { # 監(jiān)聽HTTP默認(rèn)的80端口 listen 80; # 如果80端口出現(xiàn)訪問該域名的請(qǐng)求 server_name www.x; # 將請(qǐng)求改寫為HTTPS(這里寫你配置了HTTPS的域名) rewrite ^(.*)$ https://www.x; } OK~,根據(jù)如上配置了Nginx后,你的網(wǎng)站即可通過https://的方式訪問,并且當(dāng)客戶端使用 http://的方式訪問時(shí),會(huì)自動(dòng)將其改寫為HTTPS 請(qǐng)求。十三、Nginx的高可用keepalived在之前單體架構(gòu)開發(fā)時(shí),是一個(gè)用的較為頻繁的高可用技術(shù),比如MySQL、Redis、MQ、Proxy、Tomcat等各處都會(huì)通過keepalived提供的VIP機(jī)制,實(shí)現(xiàn)單節(jié)點(diǎn)應(yīng)用的高可用。 Keepalived+重啟腳本+雙機(jī)熱備搭建[root@localhost]# mkdir /soft/keepalived && cd /soft/keepalived [root@localhost]# wget https://www./software/keepalived-2.2.4.tar.gz [root@localhost]# tar -zxvf keepalived-2.2.4.tar.gz ②進(jìn)入解壓后的keepalived目錄并構(gòu)建安裝環(huán)境,然后編譯并安裝: [root@localhost]# cd keepalived-2.2.4 [root@localhost]# ./configure --prefix=/soft/keepalived/ [root@localhost]# make && make install ③進(jìn)入安裝目錄的/soft/keepalived/etc/keepalived/并編輯配置文件: [root@localhost]# cd /soft/keepalived/etc/keepalived/ [root@localhost]# vi keepalived.conf ④編輯主機(jī)的keepalived.conf核心配置文件,如下: global_defs { # 自帶的郵件提醒服務(wù),建議用獨(dú)立的監(jiān)控或第三方SMTP,也可選擇配置郵件發(fā)送。 notification_email { root@localhost } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 # 高可用集群主機(jī)身份標(biāo)識(shí)(集群中主機(jī)身份標(biāo)識(shí)名稱不能重復(fù),建議配置成本機(jī)IP) router_id 192.168.12.129 } # 定時(shí)運(yùn)行的腳本文件配置 vrrp_script check_nginx_pid_restart { # 之前編寫的nginx重啟腳本的所在位置 script '/soft/scripts/keepalived/check_nginx_pid_restart.sh' # 每間隔3秒執(zhí)行一次 interval 3 # 如果腳本中的條件成立,重啟一次則權(quán)重-20 weight -20 } # 定義虛擬路由,VI_1為虛擬路由的標(biāo)示符(可自定義名稱) vrrp_instance VI_1 { # 當(dāng)前節(jié)點(diǎn)的身份標(biāo)識(shí):用來(lái)決定主從(MASTER為主機(jī),BACKUP為從機(jī)) state MASTER # 綁定虛擬IP的網(wǎng)絡(luò)接口,根據(jù)自己的機(jī)器的網(wǎng)卡配置 interface ens33 # 虛擬路由的ID號(hào),主從兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣 virtual_router_id 121 # 填寫本機(jī)IP mcast_src_ip 192.168.12.129 # 節(jié)點(diǎn)權(quán)重優(yōu)先級(jí),主節(jié)點(diǎn)要比從節(jié)點(diǎn)優(yōu)先級(jí)高 priority 100 # 優(yōu)先級(jí)高的設(shè)置nopreempt,解決異?;謴?fù)后再次搶占造成的腦裂問題 nopreempt # 組播信息發(fā)送間隔,兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣,默認(rèn)1s(類似于心跳檢測(cè)) advert_int 1 authentication { auth_type PASS auth_pass 1111 } # 將track_script塊加入instance配置塊 track_script { # 執(zhí)行Nginx監(jiān)控的腳本 check_nginx_pid_restart } virtual_ipaddress { # 虛擬IP(VIP),也可擴(kuò)展,可配置多個(gè)。 192.168.12.111 } } ⑤克隆一臺(tái)之前的虛擬機(jī)作為從(備)機(jī),編輯從機(jī)的keepalived.conf文件,如下: global_defs { # 自帶的郵件提醒服務(wù),建議用獨(dú)立的監(jiān)控或第三方SMTP,也可選擇配置郵件發(fā)送。 notification_email { root@localhost } notification_email_from root@localhost smtp_server localhost smtp_connect_timeout 30 # 高可用集群主機(jī)身份標(biāo)識(shí)(集群中主機(jī)身份標(biāo)識(shí)名稱不能重復(fù),建議配置成本機(jī)IP) router_id 192.168.12.130 } # 定時(shí)運(yùn)行的腳本文件配置 vrrp_script check_nginx_pid_restart { # 之前編寫的nginx重啟腳本的所在位置 script '/soft/scripts/keepalived/check_nginx_pid_restart.sh' # 每間隔3秒執(zhí)行一次 interval 3 # 如果腳本中的條件成立,重啟一次則權(quán)重-20 weight -20 } # 定義虛擬路由,VI_1為虛擬路由的標(biāo)示符(可自定義名稱) vrrp_instance VI_1 { # 當(dāng)前節(jié)點(diǎn)的身份標(biāo)識(shí):用來(lái)決定主從(MASTER為主機(jī),BACKUP為從機(jī)) state BACKUP # 綁定虛擬IP的網(wǎng)絡(luò)接口,根據(jù)自己的機(jī)器的網(wǎng)卡配置 interface ens33 # 虛擬路由的ID號(hào),主從兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣 virtual_router_id 121 # 填寫本機(jī)IP mcast_src_ip 192.168.12.130 # 節(jié)點(diǎn)權(quán)重優(yōu)先級(jí),主節(jié)點(diǎn)要比從節(jié)點(diǎn)優(yōu)先級(jí)高 priority 90 # 優(yōu)先級(jí)高的設(shè)置nopreempt,解決異常恢復(fù)后再次搶占造成的腦裂問題 nopreempt # 組播信息發(fā)送間隔,兩個(gè)節(jié)點(diǎn)設(shè)置必須一樣,默認(rèn)1s(類似于心跳檢測(cè)) advert_int 1 authentication { auth_type PASS auth_pass 1111 } # 將track_script塊加入instance配置塊 track_script { # 執(zhí)行Nginx監(jiān)控的腳本 check_nginx_pid_restart } virtual_ipaddress { # 虛擬IP(VIP),也可擴(kuò)展,可配置多個(gè)。 192.168.12.111 } } ⑥新建scripts目錄并編寫Nginx的重啟腳本,check_nginx_pid_restart.sh: #!/bin/sh # 通過ps指令查詢后臺(tái)的nginx進(jìn)程數(shù),并將其保存在變量nginx_number中 nginx_number=`ps -C nginx --no-header | wc -l` # 判斷后臺(tái)是否還有Nginx進(jìn)程在運(yùn)行 if [ $nginx_number -eq 0 ];then # 如果后臺(tái)查詢不到`Nginx`進(jìn)程存在,則執(zhí)行重啟指令 /soft/nginx/sbin/nginx -c /soft/nginx/conf/nginx.conf # 重啟后等待1s后,再次查詢后臺(tái)進(jìn)程數(shù) sleep 1 # 如果重啟后依舊無(wú)法查詢到nginx進(jìn)程 if [ `ps -C nginx --no-header | wc -l` -eq 0 ];then # 將keepalived主機(jī)下線,將虛擬IP漂移給從機(jī),從機(jī)上線接管Nginx服務(wù) systemctl stop keepalived.service fi fi ⑦編寫的腳本文件需要更改編碼格式,并賦予執(zhí)行權(quán)限,否則可能執(zhí)行失?。?/p> :set fileformat=unix # 在vi命令里面執(zhí)行,修改編碼格式 :set ff # 查看修改后的編碼格式 [root@localhost]# chmod +x /soft/scripts/keepalived/check_nginx_pid_restart.sh [root@localhost]# mkdir /etc/keepalived/ [root@localhost]# cp /soft/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ [root@localhost]# cp /soft/keepalived/keepalived-2.2.4/keepalived/etc/init.d/keepalived /etc/init.d/ [root@localhost]# cp /soft/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ ⑨將keepalived加入系統(tǒng)服務(wù)并設(shè)置開啟自啟動(dòng),然后測(cè)試啟動(dòng)是否正常: [root@localhost]# chkconfig keepalived on [root@localhost]# systemctl daemon-reload [root@localhost]# systemctl enable keepalived.service [root@localhost]# systemctl start keepalived.service 其他命令: systemctl disable keepalived.service # 禁止開機(jī)自動(dòng)啟動(dòng) systemctl restart keepalived.service # 重啟keepalived systemctl stop keepalived.service # 停止keepalived tail -f /var/log/messages # 查看keepalived運(yùn)行時(shí)日志 ⑩最后測(cè)試一下VIP是否生效,通過查看本機(jī)是否成功掛載虛擬IP: 并不會(huì)掛載這個(gè)虛擬IP,只有當(dāng)主機(jī)下線后,作為從機(jī)的192.168.12.130 才會(huì)上線,接替VIP。最后測(cè)試一下外網(wǎng)是否可以正常與VIP通信,即在Windows 中直接ping VIP: Nginx高可用性測(cè)試
sever{ listen 80; # 這里從機(jī)器的本地IP改為虛擬IP server_name 192.168.12.111; # 如果這里配置的是域名,那么則將域名的映射配置改為虛擬IP } 最后來(lái)實(shí)驗(yàn)一下效果: nginx的方式模擬了Nginx宕機(jī)情況,過了片刻后再次查詢后臺(tái)進(jìn)程,我們會(huì)發(fā)現(xiàn) nginx依舊存活。 宕機(jī)后自動(dòng)重啟的功能,那么接著再模擬一下服務(wù)器出現(xiàn)故障時(shí)的情況: 192.168.12.130 來(lái)看看情況:192.168.12.130上,而此時(shí)客戶端的請(qǐng)求就最終會(huì)來(lái)到130這臺(tái)機(jī)器的Nginx 上。十四、Nginx性能優(yōu)化優(yōu)化一:打開長(zhǎng)連接配置HTTP 長(zhǎng)連接,用戶減少握手的次數(shù),降低服務(wù)器損耗,具體如下:upstream xxx { # 長(zhǎng)連接數(shù) keepalive 32; # 每個(gè)長(zhǎng)連接提供的最大請(qǐng)求數(shù) keepalived_requests 100; # 每個(gè)長(zhǎng)連接沒有新的請(qǐng)求時(shí),保持的最長(zhǎng)時(shí)間 keepalive_timeout 60s; } 優(yōu)化二、開啟零拷貝技術(shù) 等,而Nginx中也可以配置數(shù)據(jù)零拷貝技術(shù),如下:
優(yōu)化三、開啟無(wú)延遲或多包共發(fā)機(jī)制tcp_nopush配置項(xiàng),這個(gè)配置就類似于“塞子”的意思,首先將連接塞住,使得數(shù)據(jù)先不發(fā)出去,等到拔去塞子后再發(fā)出去。設(shè)置該選項(xiàng)后,內(nèi)核會(huì)盡量把小數(shù)據(jù)包拼接成一個(gè)大的數(shù)據(jù)包(一個(gè)MTU)再發(fā)送出去. tcp_nodelay、tcp_nopush兩個(gè)參數(shù)是“互斥”的,如果追求響應(yīng)速度的應(yīng)用推薦開啟 tcp_nodelay參數(shù),如IM、金融等類型的項(xiàng)目。如果追求吞吐量的應(yīng)用則建議開啟 tcp_nopush參數(shù),如調(diào)度系統(tǒng)、報(bào)表系統(tǒng)等。 注意:①tcp_nodelay一般要建立在開啟了長(zhǎng)連接模式的情況下使用。 ②tcp_nopush參數(shù)是必須要開啟sendfile參數(shù)才可使用的。 優(yōu)化四、調(diào)整Worker工作進(jìn)程Nginx啟動(dòng)后默認(rèn)只會(huì)開啟一個(gè)Worker工作進(jìn)程處理客戶端請(qǐng)求,而我們可以根據(jù)機(jī)器的CPU核數(shù)開啟對(duì)應(yīng)數(shù)量的工作進(jìn)程,以此來(lái)提升整體的并發(fā)量支持,如下:
worker_rlimit_nofile 20000; 優(yōu)化五、開啟CPU親和機(jī)制
優(yōu)化六、開啟epoll模型及調(diào)整并發(fā)連接數(shù)events { # 使用epoll網(wǎng)絡(luò)模型 use epoll; # 調(diào)整每個(gè)Worker能夠處理的連接數(shù)上限 worker_connections 10240; } ? 十五、放在最后的結(jié)尾^_^ ,在此萬(wàn)分感謝! |
|
來(lái)自: 昵稱10087950 > 《JAVA》