一張小圖看盡 Nginx
在公眾號后臺回復(fù):JGNB,可獲取杰哥原創(chuàng)的 PDF 手冊。

nginx安裝
Nginx安裝完成,沒有sbin目錄
cd進(jìn)入到nginx-1.18.0目錄內(nèi)執(zhí)行
[root@centos7?nginx-1.18.0]#?./configure?--prefix=/usr/local/nginx
[root@centos7?nginx-1.18.0]#?make
[root@centos7?nginx-1.18.0]#?make?install
ps:–prefix=path 定義一個目錄,存放服務(wù)器上的文件 ,也就是nginx的安裝目錄,默認(rèn)使用 /usr/local/nginx
這步你會看到local目錄下有一個跟你安裝的nginx1.12.2同級的nginx目錄,里面就有sbin目錄了。
基礎(chǔ)指令
listen:該指令用于配置網(wǎng)絡(luò)監(jiān)聽。
listen?*:80?|?*:8080??????#監(jiān)聽所有80端口和8080端口
listen??IP_address:port???#監(jiān)聽指定的地址和端口號
listen??IP_address????????#監(jiān)聽指定ip地址所有端口
listen?port???????????????#監(jiān)聽該端口的所有IP連接
server_name:該指令用于虛擬主機(jī)的配置。
a. 基于名稱的虛擬主機(jī)配置
server_name???name?...;
b. 基于 IP 地址的虛擬主機(jī)配置
server_name?192.168.1.1
location:該指令用于匹配 URL。
location指令的作用是根據(jù)用戶請求的URI來執(zhí)行不同的應(yīng)用,也就是根據(jù)用戶請求的網(wǎng)站URL進(jìn)行匹配,匹配成功即進(jìn)行相關(guān)的操作。
location的語法
=開頭表示精確匹配
如 A 中只匹配根目錄結(jié)尾的請求,后面不能帶任何字符串。
^~ 開頭表示uri以某個常規(guī)字符串開頭,不是正則匹配
~ 開頭表示區(qū)分大小寫的正則匹配;
~* 開頭表示不區(qū)分大小寫的正則匹配
/ 通用匹配, 如果沒有其它匹配,任何請求都會匹配到
Location正則案例
#精確匹配,/后面不能帶任何字符
server?{
????????listen???????80;
????????server_name??www.itmayiedu.com;
????????#精確匹配,注解后面不能帶任何字符
????????location?=/?{
????????????proxy_pass?http://127.0.0.1:8080;
????????????index??index.html?index.htm;
????????}
}
?#匹配所有以/開頭請求
server?{
????????listen???????80;
????????server_name??www.itmayiedu.com;
???????#匹配所有以/開頭請求?
????????location?/?{
????????????proxy_pass?http://127.0.0.1:8080;
????????????index??index.html?index.htm;
????????}
????}
###??以開頭/itmayiedu_8080攔截??默認(rèn)開啟不區(qū)分大小寫
????server?{
????????listen???????80;
????????server_name??www.itmayiedu.com;
????????###??以開頭/itmayiedu_8080?最終跳轉(zhuǎn)到http://127.0.0.1:8080/;
????????location?/itmayiedu_8080/?{
????????????proxy_pass?http://127.0.0.1:8080/;
????????????index??index.html?index.htm;
????????}
????????###??以開頭/itmayiedu_8080?最終跳轉(zhuǎn)到http://127.0.0.1:8081/;
????????location?/itmayiedu_8081/?{
????????????proxy_pass?http://127.0.0.1:8081/;
????????????index??index.html?index.htm;
????????}
????}
###?開頭區(qū)分大小寫
proxy_pass:該指令用于設(shè)置被代理服務(wù)器的地址??梢允侵鳈C(jī)名稱、IP地址加端口號的形式。
語法結(jié)構(gòu)如下:
proxy_pass?URL;
index:該指令用于設(shè)置網(wǎng)站的默認(rèn)首頁。
域名重定向
server
{
????listen?80?;
????server_name?mxiaoqi.top?aaa.com;
????if?(?$host?=?mxiaoqi.top?)
????#增加判斷條件,當(dāng)訪問域名是mxiaoqi.top的時候
????{
????????rewrite?/(.*)??http://aaa.com/$1?permanent;
????????#把mxiaoqi.top/后面的內(nèi)容重新寫到aaa.com/后面如果后面有多段則使用$2、$3以此類推
????????#permanent是轉(zhuǎn)發(fā)狀態(tài)碼
????}
????index?index.html?index.htm?index.php;
????root?/data/wwwroot/mxiaoqi.top;
????}
反向代理
使用 nginx 反向代理 www.123.com 直接跳轉(zhuǎn)到127.0.0.1:8080
server?{
?????????listen???????80;
?????????server_name??www.123.com;
?????????location?/?{
?????????????proxy_pass?http://127.0.0.1:8080;
??????????????????????????#?歡迎頁面,按照從左到右的順序查找頁面
?????????????index??index.html?index.htm?index.jsp;
?????????}
?????}
監(jiān)聽80端口,訪問域名為www.123.com,不加端口號時默認(rèn)為80端口,故訪問該域名時會跳轉(zhuǎn)到127.0.0.1:8080路徑上。
限流配置
漏桶算法與令牌桶算法區(qū)別:主要區(qū)別在于“漏桶算法”能夠強(qiáng)行限制數(shù)據(jù)的傳輸速率,
而“令牌桶算法”在能夠限制數(shù)據(jù)的平均傳輸速率外,還允許某種程度的突發(fā)傳輸。在“令牌桶算法”中,只要令牌桶中存在令牌,那么就允許突發(fā)地傳輸數(shù)據(jù)直到達(dá)到用戶配置的門限,因此它適合于具有突發(fā)特性的流量。
Nginx按請求速率限速模塊使用的是漏桶算法,即能夠強(qiáng)行保證請求的實時處理速度不會超過設(shè)置的閾值。
limit_req_zone 用來限制單位時間內(nèi)的請求數(shù),即速率限制,采用的漏桶算法 "leaky bucket"。
limit_req_conn 用來限制同一時間連接數(shù),即并發(fā)限制。
limit_req_zone 參數(shù)配置
Syntax:????limit_req?zone=name?[burst=number]?[nodelay];
Default:????—
Context:????http,?server,?location
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
第一個參數(shù):
$binary_remote_addr表示通過remote_addr這個標(biāo)識來做限制,“binary_”的目的是縮寫內(nèi)存占用量,是限制同一客戶端ip地址。第二個參數(shù):zone=one:10m表示生成一個大小為10M,名字為one的內(nèi)存區(qū)域,用來存儲訪問的頻次信息。
第三個參數(shù):rate=1r/s表示允許相同標(biāo)識的客戶端的訪問頻次,這里限制的是每秒1次,還可以有比如30r/m的。
limit_req zone=one burst=5 nodelay;
第一個參數(shù):zone=one 設(shè)置使用哪個配置區(qū)域來做限制,與上面limit_req_zone 里的name對應(yīng)。
第二個參數(shù):burst=5,重點說明一下這個配置,burst爆發(fā)的意思,這個配置的意思是設(shè)置一個大小為5的緩沖區(qū)當(dāng)有大量請求(爆發(fā))過來時,超過了訪問頻次限制的請求可以先放到這個緩沖區(qū)內(nèi)。
第三個參數(shù):nodelay,如果設(shè)置,超過訪問頻次而且緩沖區(qū)也滿了的時候就會直接返回503,如果沒有設(shè)置,則所有請求會等待排隊。
ngx_http_limit_conn_module 參數(shù)配置
這個模塊用來限制單個IP的請求數(shù)。并非所有的連接都被計數(shù)。只有在服務(wù)器處理了請求并且已經(jīng)讀取了整個請求頭時,連接才被計數(shù)。
Syntax:????limit_conn?zone?number;
Default:????—
Context:????http,?server,?location
limit_conn_zone?$binary_remote_addr?zone=addr:10m;
server?{
????location?/download/?{
????????limit_conn?addr?1;
????}
一次只允許每個IP地址一個連接。
負(fù)載均衡
#user??nobody;
worker_processes??1;
error_log??logs/error.log;#?開啟日志
pid????????logs/nginx.pid;
...
????upstream?lyf?{
????server?192.168.37.220:8001;?#?3個tomcat服務(wù)
????server?192.168.37.220:8002;
????server?192.168.37.220:8003;
????}
????server?{
????????listen???????80;
????????server_name??192.168.37.220;#?監(jiān)聽ip
????????location?/?{
????????????proxy_pass???http://lyf;??#?設(shè)置代理
????????????index??index.html?index.htm;
????????}
}
keepalive 長連接提高吞吐量
keepalived :設(shè)置長連接處理的數(shù)量
proxy_http_version :設(shè)置長連接http版本為1.1
proxy_set_header :清除connection header 信息
upstream?tomcats?{?
#?server?192.168.1.173:8080?max_fails=2?fail_timeout=1s;?
server?192.168.1.190:8080;?
#?server?192.168.1.174:8080?weight=1;?
#?server?192.168.1.175:8080?weight=1;?
keepalive?32;?
}
server?{
listen?80;?
server_name?www.tomcats.com;?
location?/?{?
proxy_pass?http://tomcats;?
proxy_http_version?1.1;?
proxy_set_header?Connection?"";?
}?
}
工作方式
輪詢方式是Nginx負(fù)載默認(rèn)的方式
權(quán)重方式 指定每個服務(wù)的權(quán)重比例,weight和訪問比率成正比
upstream??dalaoyang-server?{
???????server????localhost:10001?weight=1;
???????server????localhost:10002?weight=2;
}
iphash
每個請求都根據(jù)訪問ip的hash結(jié)果分配,經(jīng)過這樣的處理,每個訪客固定訪問一個后端服務(wù),如下配置(ip_hash可以和weight配合使用)。
upstream??dalaoyang-server?{
???????ip_hash;?
???????server????localhost:10001?weight=1;
???????server????localhost:10002?weight=2;
}
最少連接
將請求分配到連接數(shù)最少的服務(wù)上。
upstream??dalaoyang-server?{
???????least_conn;
???????server????localhost:10001?weight=1;
???????server????localhost:10002?weight=2;
}
fair
按后端服務(wù)器的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。
upstream??dalaoyang-server?{
???????server????localhost:10001?weight=1;
???????server????localhost:10002?weight=2;
???????fair;??
}
Consul+upsync+Nginx ?實現(xiàn)無需raload動態(tài)負(fù)載均衡 https://www.cnblogs.com/a1304908180/p/10697278.html
傳統(tǒng)的負(fù)載均衡,如果Upstream參數(shù)發(fā)生變化,每次都需要重新加載nginx.conf文件,
因此擴(kuò)展性不是很高,所以我們可以采用動態(tài)負(fù)載均衡,實現(xiàn)Upstream可配置化、動態(tài)化,無需人工重新加載nginx.conf。
LVS+Keepalived+Nginx+Tomcat搭建高可用雙機(jī)主從熱備集群
https://blog.csdn.net/dsen726/article/details/89519013
需要明確的是:
Nginx兩臺是主備關(guān)系,只有一臺在工作。后面的tomcat是集群,同時工作的。
keepalived是同時安裝在兩臺Nginx上的,不過文件配置不一樣
這里的雙機(jī)熱備是指LVS,Nginx則是集群
keepalived
健康檢查和失敗切換是keepalived的兩大核心功能。所謂的健康檢查,就是采用tcp三次握手,icmp請求,http請求,udp echo請求等方式對負(fù)載均衡器后面的實際的服務(wù)器(通常是承載真實業(yè)務(wù)的服務(wù)器)進(jìn)行保活;而失敗切換主要是應(yīng)用于配置了主備模式的負(fù)載均衡器,利用VRRP維持主備負(fù)載均衡器的心跳,當(dāng)主負(fù)載均衡器出現(xiàn)問題時,由備負(fù)載均衡器承載對應(yīng)的業(yè)務(wù),從而在最大限度上減少流量損失,并提供服務(wù)的穩(wěn)定性。
LVS是Linux Virtual Server的簡寫,意即Linux虛擬服務(wù)器,是一個虛擬的服務(wù)器集群系統(tǒng)。lvs目前是集成在Linux內(nèi)的。



為什么要LVS+Nginx?
一、ngix(應(yīng)用層 網(wǎng)絡(luò)七層負(fù)載均衡)
1、異步轉(zhuǎn)發(fā),請求數(shù)據(jù)和相應(yīng)數(shù)據(jù)都要經(jīng)過ngix,ngix和客戶端建立連接
2、輪詢所有的tomcat服務(wù)器,保證請求成功或者最后一臺tomcat服務(wù)器也請求失敗
二、lvs(網(wǎng)絡(luò)層 ?網(wǎng)絡(luò)四層負(fù)載均衡)
1、同步轉(zhuǎn)發(fā)接受請求數(shù)據(jù),lvs轉(zhuǎn)發(fā)到服務(wù)器,服務(wù)器直接和客戶端建立連接
nginx要承受所有的流量,當(dāng)一臺nigx承受不了,就需要搭建ngix集群。ngix+ngix 外層的ngix還是要承受所有流量。
lvs+ngix:lvs同步轉(zhuǎn)發(fā)不會接受相應(yīng)數(shù)據(jù),LVS采用DR模式時不用響應(yīng)服務(wù)器返回的內(nèi)容。(通常請求數(shù)據(jù)是比較小的,響應(yīng)數(shù)據(jù)會比較大)

靜態(tài)資源配置
??location?~?.*\.(jpg|gif|png)$?{
????????gzip?on;
????????gzip_http_version?1.1;
????????gzip_comp_level?2;
????????gzip_types?text/plain?application/javascript?image/jpeg?image/gif?image/png;
????????root???/usr/share/nginx/images;
????}
????location?~?.*\.(txt|xml)$?{
????????gzip?on;
????????gzip_http_version?1.1;
????????gzip_comp_level?1;
????????gzip_types?text/plain?application/javascript?image/jpeg?image/gif?image/png;
????????root???/usr/share/nginx/code;
????}
??location?~?^/download?{
????????gzip_static?on;
????????tcp_nopush?on;
????????root?/opt/app/code;
????}
sendfile on | off,文件讀取配置
默認(rèn)sendfile是關(guān)閉的,可以配置在http,server,location,if in location中
tcp_nopush on | off,多個包整合
默認(rèn)是關(guān)閉狀態(tài),可以在http,server,location中配置,它的作用是在sendfile開啟的情況下,提高網(wǎng)絡(luò)包的傳輸效率。什么意思呢,假設(shè)服務(wù)端收到請求,需要推送10個包,為了提高傳輸效率,這10個包不會一個一個返回給客戶端,而是將10個包攢夠了后一起返回回去。
tcp_nodelay on | off,網(wǎng)絡(luò)包的實時性傳輸
默認(rèn)開啟,可以在http,server,location中配置,它的作用是在keepalive鏈接下,提高網(wǎng)絡(luò)包的傳輸實時性。
gzip on | off,壓縮
默認(rèn)是關(guān)閉狀態(tài),可以在http,server,location,if in location中配置,作用是壓縮傳輸。一般來說瀏覽器是可以對壓縮后的內(nèi)容進(jìn)行解壓的。
gzip_comp_level level;壓縮級別
默認(rèn)的壓縮級別是1,可以在http,server,location中配置,級別配置的越高,壓縮的越好,但是壓縮會耗費(fèi)服務(wù)端的計算資源,所以要控制好壓縮級別
gzip_http_version 1.0 | 1.1,壓縮對http協(xié)議的支持
默認(rèn)對HTTP/1.1協(xié)議的請求才會進(jìn)行g(shù)zip壓縮,可以配置在http,server,location中配置。當(dāng)用戶想要讀取一個1.html文件,首先會在目錄中找尋1.html.gz是否存在,所以這就導(dǎo)致了磁盤資源的浪費(fèi),必須要存儲兩份文件。
###靜態(tài)資源訪問
????server?{
??????listen???????80;
??????server_name??static.itmayiedu.com;
??????location?/static/imgs?{
???????????root?F:/;
???????????index??index.html?index.htm;
???????}
????}
???###動態(tài)資源訪問
?????server?{
??????listen???????80;
??????server_name??www.itmayiedu.com;
??????location?/?{
?????????proxy_pass?http://127.0.0.1:8080;
?????????index??index.html?index.htm;
???????}
????}
跨域配置

跨域就是在原站點訪問域名不同的其他站點,同源策略會阻止一個域的javascript腳本和另外一個域的內(nèi)容進(jìn)行交互。所謂同源(即指在同一個域)就是兩個頁面具有相同的協(xié)議(protocol),主機(jī)(host)和端口號(port)。
CORS 是跨域資源分享(Cross-Origin Resource Sharing)的縮寫。它是 W3C 標(biāo)準(zhǔn),屬于跨源 AJAX 請求的根本解決方法。
1、普通跨域請求:只需服務(wù)器端設(shè)置Access-Control-Allow-Origin
2、帶cookie跨域請求:前后端都需要進(jìn)行設(shè)置
#允許跨域請求的域,*代表所有
add_header?'Access-Control-Allow-Origin'?*;
#允許帶上cookie請求?
add_header?'Access-Control-Allow-Credentials'?'true';?
#允許請求的方法,比如?GET/POST/PUT/DELETE?
add_header?'Access-Control-Allow-Methods'?*;?
#允許請求的header?
add_header?'Access-Control-Allow-Headers'?*;
防盜鏈
#對源站點驗證
valid_referers?*.imooc.com;?
#非法引入會進(jìn)入下方判斷?
if?($invalid_referer)?{?return?404;?}
source: https://www.yuque.com/molizhuzhu/thrgrk/rtslmc
推薦閱讀:
14 張圖搞懂 Nginx 高性能網(wǎng)絡(luò)工作原理!

