啓動nginx,查看nginx的線程,能夠發現:html
[root@localhost ~]# ps -ef |grep nginx root 20714 1 0 02:36 ? 00:00:00 nginx: master process ../ngnix/sbin/nginx root 21728 20714 0 05:04 ? 00:00:00 nginx: worker process root 22694 22655 0 06:49 pts/2 00:00:00 grep nginx [root@localhost ~]#
1. 在建立master進程時,先創建須要監聽的socket(listenfd),而後從master進程中fork()出多個worker進程,如此一來每一個worker進程均可以監聽用戶請求的socket。通常來講,當一個鏈接進來後,全部Worker都會收到通知,可是隻有一個進程能夠接受這個鏈接請求,其它的都失敗,這是所謂的驚羣現象。nginx提供了一個accept_mutex(互斥鎖),有了這把鎖以後,同一時刻,就只會有一個進程在accpet鏈接,這樣就不會有驚羣問題了。java
2. 先打開accept_mutex選項,只有得到了accept_mutex的進程纔會去添加accept事件。nginx使用一個叫ngx_accept_disabled的變量來控制是否去競爭accept_mutex鎖。ngx_accept_disabled = nginx單進程的全部鏈接總數 / 8 -空閒鏈接數量,當ngx_accept_disabled大於0時,不會去嘗試獲取accept_mutex鎖,ngx_accept_disable越大,讓出的機會就越多,這樣其它進程獲取鎖的機會也就越大。不去accept,每一個worker進程的鏈接數就控制下來了,其它進程的鏈接池就會獲得利用,這樣,nginx就控制了多進程間鏈接的平衡。linux
3.每一個worker進程都有一個獨立的鏈接池,鏈接池的大小是worker_connections。這裏的鏈接池裏面保存的其實不是真實的鏈接,它只是一個worker_connections大小的一個ngx_connection_t結構的數組。而且,nginx會經過一個鏈表free_connections來保存全部的空閒ngx_connection_t,每次獲取一個鏈接時,就從空閒鏈接鏈表中獲取一個,用完後,再放回空閒鏈接鏈表裏面。一個nginx能創建的最大鏈接數,應該是worker_connections * worker_processes。固然,這裏說的是最大鏈接數,對於HTTP請求本地資源來講,可以支持的最大併發數量是worker_connections * worker_processes,而若是是HTTP做爲反向代理來講,最大併發數量應該是worker_connections * worker_processes/2。由於做爲反向代理服務器,每一個併發會創建與客戶端的鏈接和與後端服務的鏈接,會佔用兩個鏈接。nginx
相關的配置:算法
worker_processes 1; // 工做進程數,建議設成CPU總核心數。 events { // 多路複用IO模型機制,epoll . select ....根據操做系統不一樣來選擇。linux 默認epoll use epoll; //io 模型 worker_connections 1024; // 每一個woker進程的最大鏈接數,數值越大,併發量容許越大 } http{ sendfile on;//開啓零拷貝 }
報錯
make[2]: *** [namespaces.o] Error 1 make[2]: Leaving directory `/root/keepalived-1.2.24/keepalived/core' make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/root/keepalived-1.2.24/keepalived' make: *** [all-recursive] Error 1
升級了下glib試一下能不能解決 yum update glib* 還不行的話,看一下本身的系統版本,換一個低版本的keepalived centos6.5+keepalived1.2.7
● keepalived.service - LVS and VRRP High Availability Monitor Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled) Active: active (running) since Mon 2019-06-03 22:42:50 CST; 5min ago Process: 4350 ExecStart=/data/program/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS) Main PID: 4579 (keepalived) CGroup: /system.slice/keepalived.service ├─4579 /data/program/keepalived/sbin/keepalived -D └─4583 /data/program/keepalived/sbin/keepalived -D Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Timeout connecting server [192.168.20...3. Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Check on service [192.168.201.100]:tc...d. Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Removing service [192.168.201.100]:tc...43 Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Lost quorum 1-0=1 > 0 for VS [192.168...43 Jun 03 22:42:59 localhost.localdomain Keepalived_healthcheckers[4583]: Remote SMTP server [192.168.200.1]:25...d. Jun 03 22:43:17 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5. Jun 03 22:43:17 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5. Jun 03 22:43:17 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5. Jun 03 22:43:19 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5. Jun 03 22:43:20 localhost.localdomain Keepalived_healthcheckers[4583]: Error reading data from remote SMTP s...5. Hint: Some lines were ellipsized, use -l to show in full. [root@localhost keepalived]#
! Configuration File for keepalived global_defs { router_id MASTER_DEVEL #運行 keepalived 服務器的標識,在一個網絡內應該是惟一的 } vrrp_instance VI_1 { #vrrp 實例定義部分 state MASTER #設置 lvs 的狀態,MASTER 和 BACKUP 兩種,必須大寫 interface ens33 #設置對外服務的接口,必須跟本地一致 virtual_router_id 51 #設置虛擬路由標示,這個標示是一個數字,同一個 vrrp 實例使用惟一標示 priority 150 #定義優先級,數字越大優先級越高,在一個 vrrp——instance 下,master 的優先級必須大於 backup advert_int 1 #設定 master 與 backup 負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { #設置驗證類型和密碼 auth_type PASS auth_pass 1111 #驗證密碼,同一個 vrrp_instance 下 MASTER 和 BACKUP 密碼必須相同} virtual_ipaddress { #設置虛擬 ip 地址,能夠設置多個,每行一個 192.168.20.110 } } virtual_server 192.168.20.100 80 { #設置虛擬服務器,須要指定虛擬 ip 和服務端口 delay_loop 6 #健康檢查時間間隔 lb_algo rr #負載均衡調度算法 lb_kind NAT #負載均衡轉發規則 persistence_timeout 50 #設置會話保持時間 protocol TCP #指定轉發協議類型,有 TCP 和 UDP 兩種 real_server 192.168.20.130 80 { #配置服務器節點 1,須要指定 real server 的真實 IP 地址和端口weight 1 #設置權重,數字越大權重越高 TCP_CHECK { #realserver 的狀態監測設置部分單位秒 connect_timeout 3 #超時時間 delay_before_retry 3 #重試間隔 connect_port 80 #監測端口 } } }
backupvim
! Configuration File for keepalived global_defs { router_id BACKUP_DEVEL #運行 keepalived 服務器的標識,在一個網絡內應該是惟一的 } vrrp_instance VI_1 { #vrrp 實例定義部分 state BACKUP #設置 lvs 的狀態,MASTER 和 BACKUP 兩種,必須大寫 interface ens33 #設置對外服務的接口,必須跟本地ip應用名稱一致 virtual_router_id 51 #設置虛擬路由標示,這個標示是一個數字,同一個 vrrp 實例使用惟一標示 priority 100 #定義優先級,數字越大優先級越高,在一個 vrrp——instance 下,master 的優先級必須大於 backup advert_int 1 #設定 master 與 backup 負載均衡器之間同步檢查的時間間隔,單位是秒 authentication { #設置驗證類型和密碼 auth_type PASS auth_pass 1111 #驗證密碼,同一個 vrrp_instance 下 MASTER 和 BACKUP 密碼必須相同} virtual_ipaddress { #設置虛擬 ip 地址,能夠設置多個,每行一個 192.168.20.110 } } virtual_server 192.168.20.110 80 { #設置虛擬服務器,須要指定虛擬 ip 和服務端口 delay_loop 6 #健康檢查時間間隔 lb_algo rr #負載均衡調度算法 lb_kind NAT #負載均衡轉發規則 persistence_timeout 50 #設置會話保持時間 protocol TCP #指定轉發協議類型,有 TCP 和 UDP 兩種 real_server 192.168.20.128 80 { #配置服務器節點 1,須要指定 real server 的真實 IP 地址和端口weight 1 #設置權重,數字越大權重越高 TCP_CHECK { #realserver 的狀態監測設置部分單位秒 connect_timeout 3 #超時時間 delay_before_retry 3 #重試間隔 connect_port 80 #監測端口 } } }
使用命令:systemctl status firewalld.service後端
查看防火牆狀態centos
執行後能夠看到綠色字樣標註的「active(running)」,說明防火牆是開啓狀態數組
使用命令:systemctl stop firewalld.service tomcat
關閉運行的防火牆
輸入命令:systemctl disable firewalld.service,禁止防火牆服務器
ip a 來查看虛擬IP是否綁定到本機
安裝nginx到本地試一下