Nginx三大功能及高並發分流
一、什么是Nginx
Nginx(engine x)是一個高性能的HTTP和反向代理服務器,具有內存少,高並發能力的特點。
- 處理靜態文件,索引文件以及自動索引;打開文件描述符緩沖。
- 無緩存的反向代理加速,簡單的負載均衡和容錯。
Nginx -- 代理服務器/高性能的負載均衡器
二、Nginx的三大功能
1、反向代理功能(核心功能,其他功能的依托,其實就是請求轉發)
根據用戶請求Url路徑,在nginx的配置文件nginx.conf里配置匹配規則及轉發規則,然后將請求轉發給具體的微服務(或本地的靜態資源、或本地lua腳本)進行處理(根據Url路徑請求轉發)。

2、負載均衡功能(分流)
負載就是問題,高並發問題。均衡就是解決手段。高並發請求對單一微服務造成極大的壓力,要使這個高並發請求能夠平穩的處理,需要增加節點,直到能處理並發量問題為止。怎么控制節點?使用Nginx的負載均衡策略來控制。在Nginx的核心文件nginx.conf中配置好負載均衡策略,請求壓力就下降了,過去壓力一直在某一個服務上,現在壓力分攤到每一個微服務。負載均衡策略一般常用的有輪詢、權重,默認的是輪詢,使用最多的是權重。

請求轉發-->負載均衡(分流)
簡單來說就是分流:使用nginx請求轉發到目標服務器(Tomcat),當並發請求量過大,一個Tomcat不足以承擔大量請求,可以做橫向擴容(copy多個Tomcat服務器,配置不同請求端口),使用nginx進行負載均衡配置。
nginx的5種負載均衡策略
- 輪詢(默認)
每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器down掉,能自動剔除。
upstream backserver {
server 192.168.1.108;
server 192.168.1.109;
}
- 權重(常用)
指定輪詢幾率,weight和訪問比率成正比,用於后端服務器性能不均的情況。
upstream backserver {
server 192.168.1.108 weight=7;
server 192.168.1.109 weight=10;
}
- IP綁定 ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session的問題。
upstream backserver {
ip_hash;
server 192.168.1.108:8080;
server 192.168.1.109:8088;
}
- fair(第三方)
按后端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream backserver {
server server1;
server server2;
fair;
}
- url_hash(第三方)
按訪問url的hash結果來分配請求,使每個url定向到同一個后端服務器,后端服務器為緩存時比較有效。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
3、Nginx動靜分離(作為靜態資源服務器)
Nginx不但可以存儲靜態資源還能運行,把靜態資源存放到Nginx中,Nginx不需重啟就可以運行靜態資源,只要頁面不是jsp這種動態刷新的數據,面里改的東西就會立即生效(jsp本質是個Servlet,需要編譯)。利用Nginx靜態資源服務器的功能運行靜態資源,Nginx比tomcat的性能要高很多,本質上是因為Nginx的並發處理能力強(5萬-10萬之間),另外它做靜態資源處理內部也做了一些優化,請求的時候網絡方面的優化 比tomcat要做得好。
動態資源文件:http:-->tomcat-->DB-->json-->瀏覽器
靜態資源文件:css、js、html、png、jpg ...

(1)Linux安裝Nginx
略
很多公司Nginx直接安裝在服務器上,因為安裝服務器上性能更高(不安裝在docker中)。
nginx啟動:進入到nginx的sbin目錄,啟動nginx./nginx &或者直接usr/local/nginx/sbin/nginx &
nginx重啟:./nginx -s reload
nginx停止:./nginx -s stop
查看nginx是否啟動成功./nginx -t
查看nginx進程:ps -ef|grep nginx
Tomcat啟動:
cd /usr/local/tomcat/tomcat-8081/bin/
sh startup.sh &
(2)nginx.conf
用java的方法講解nginx.conf:
動態請求

listen 80
server_name www.congyi.com
可以理解為java中的Controller上的@RequestMapping攔截80路徑
location / {
......
}
可以理解為java中的方法上的路徑,花括號中的可以理解為代碼塊
靜態資源
如果是靜態資源,比如http://192.168.42.11:80/order.css,那么會訪問第二個
location ~ .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {
......
}

域名映射
進入到 C:\Windows\System32\drivers\etc\hosts 或者直接在運行中搜索 C:\WINDOWS\system32\drivers\etc

在hosts文件中配置ip與域名映射,例如:127.0.0.1 congyi.com
三、Nginx高可用
高可用集群指當某一個節點或服務器發生故障時,另一個節點能夠自動且立即向外提供服務。高可用集群適用於單個節點發生故障時,能夠自動將資源、服務進行切換,這樣可以服務一直在線。
在這個過程中,對於客戶端來說是透明的。
小建議:如果在項目中用到了nginx,那么請盡量把你的服務做成高可用的。

有主nginx和從nginx,當主nginx掛掉了,那么從nginx會啟用,但是之前配置的主nginx的域名與ip的映射就失效了,這時候就需要更改hosts的映射配置為從nginx的ip。這時候就用到了keepalived開放虛擬ip,監聽nginx,保證nginx24小時不間斷運行。
什么是Keepalived
Keepalived軟件起初是專為LVS負載均衡軟件設計的,用來管理並監控LVS集群系統中各個服務節點的狀態,后來又加入了可以實現高可用的VRRP功能。因此,Keepalived除了能夠管理LVS軟件外,還可以作為其他服務(例如:Nginx、Haproxy、MySQL等)的高可用解決方案軟件。
keepalived+mysql
keepalived+nginx
如何使用 keepalived+nginx 實現高可用
現在假設有主、從兩個nginx服務,即在兩個不同的ip服務器上,同時每台服務器上安裝了keepalived。
監聽軟件:keepalived -- 監聽 nginx
keepalived會提供一個虛擬ip映射主從nginx的不同ip。
現在看一下主服務器上keepalived的配置:
cd /etc/keepalived/
vim keepalived.conf

腳本

那么我們來測一下keepalived是否能成功執行這個腳本,首先要在nginx未啟動的情況下進行測試,使用命令ps aux|grep nginx查看一下nginx的狀態,如果nginx是啟動的那么先停掉他usr/local/nginx/sbin/nginx -s stop。之后就可以啟動keepalived進行測試了。
keepalived的啟動命令和nginx的相同,進入到安裝目錄對應sbin目錄下啟動:./keepalived &。
再次查看nginx狀態,驗證keepalived是否成功執行腳本重啟了nginx。
以上是主節點master的配置及操作,下面是從節點backup配置:

主從節點的keepalived目錄結構、腳本文件、指向的虛擬ip是一樣的。
按上述主節點操作啟動從節點的keepalived。
現在主、從節點都啟動了,之后聯網訪問域名,訪問到的是主節點master,然后把主節點的keepalived和nginx干掉,再次訪問域名,如果還能成功訪問,則驗證了nginx的高可用配置是成功的。
ps:關於查看nginx進程的問題
在敲命令查看nginx服務進程的時候會發現有兩個nginx的進程,一個master、一個worker,master只有一個,worker可以有多個。其中master可以理解為"項目經理",worker理解為我們的程序員(打工人),當有多個請求時,一個worker干不過來,這時候就向master,也就是我們的項目經理申請再招聘一個worker。

我們可以去驗證一下:
進入到vim /usr/local/nginx/conf/nginx.conf,修改worker_prosses為2個:

再次查看nginx進程發現有兩個worker:

