一張小圖看盡 Nginx

語言: CN / TW / HK

點選進入“PHP開源社群”    

免費獲取進階面試、文件、視訊資源

nginx安裝

Nginx安裝完成,沒有sbin目錄

cd進入到nginx-1.18.0目錄內執行

[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 定義一個目錄,存放伺服器上的檔案 ,也就是nginx的安裝目錄,預設使用 /usr/local/nginx

這步你會看到local目錄下有一個跟你安裝的nginx1.12.2同級的nginx目錄,裡面就有sbin目錄了。

基礎指令

listen:該指令用於配置網路監聽。

listen *:80 | *:8080      #監聽所有80埠和8080埠
listen IP_address:port #監聽指定的地址和埠號
listen IP_address #監聽指定ip地址所有埠
listen port #監聽該埠的所有IP連線

server_name:該指令用於虛擬主機的配置。

a. 基於名稱的虛擬主機配置

server_name   name ...;

b. 基於 IP 地址的虛擬主機配置

server_name 192.168.1.1

location:該指令用於匹配 URL。

location指令的作用是根據使用者請求的URI來執行不同的應用,也就是根據使用者請求的網站URL進行匹配,匹配成功即進行相關的操作。

location的語法

  • =開頭表示精確匹配

  • 如 A 中只匹配根目錄結尾的請求,後面不能帶任何字串。

  • ^~ 開頭表示uri以某個常規字串開頭,不是正則匹配

  • ~ 開頭表示區分大小寫的正則匹配;

  • ~* 開頭表示不區分大小寫的正則匹配

  • / 通用匹配, 如果沒有其它匹配,任何請求都會匹配到

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攔截 預設開啟不區分大小寫
server {
listen 80;
server_name www.itmayiedu.com;
### 以開頭/itmayiedu_8080 最終跳轉到http://127.0.0.1:8080/;
location /itmayiedu_8080/ {
proxy_pass http://127.0.0.1:8080/;
index index.html index.htm;
}
### 以開頭/itmayiedu_8080 最終跳轉到http://127.0.0.1:8081/;
location /itmayiedu_8081/ {
proxy_pass http://127.0.0.1:8081/;
index index.html index.htm;
}
}
### 開頭區分大小寫

proxy_pass:該指令用於設定被代理伺服器的地址。可以是主機名稱、IP地址加埠號的形式。

語法結構如下:

proxy_pass URL;

index:該指令用於設定網站的預設首頁。

域名重定向

server
{
listen 80 ;
server_name mxiaoqi.top aaa.com;
if ( $host = mxiaoqi.top )
#增加判斷條件,當訪問域名是mxiaoqi.top的時候
{
rewrite /(.*) http://aaa.com/$1 permanent;
#把mxiaoqi.top/後面的內容重新寫到aaa.com/後面如果後面有多段則使用$2、$3以此類推
#permanent是轉發狀態碼
}
index index.html index.htm index.php;
root /data/wwwroot/mxiaoqi.top;
}

反向代理

使用 nginx 反向代理 www.123.com 直接跳轉到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;
}
}

監聽80埠,訪問域名為www.123.com,不加埠號時預設為80埠,故訪問該域名時會跳轉到127.0.0.1:8080路徑上。

限流配置

漏桶演算法與令牌桶演算法區別:主要區別在於“漏桶演算法”能夠強行限制資料的傳輸速率,

而“令牌桶演算法”在能夠限制資料的平均傳輸速率外,還允許某種程度的突發傳輸。在“令牌桶演算法”中,只要令牌桶中存在令牌,那麼就允許突發地傳輸資料直到達到使用者配置的門限,因此它適合於具有突發特性的流量。

Nginx按請求速率限速模組使用的是漏桶演算法,即能夠強行保證請求的實時處理速度不會超過設定的閾值。

  • limit_req_zone 用來限制單位時間內的請求數,即速率限制,採用的漏桶演算法 "leaky bucket"。

  • limit_req_conn 用來限制同一時間連線數,即併發限制。

limit_req_zone 引數配置

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;

  • 第一個引數: $binary_remote_addr 表示通過remote_addr這個標識來做限制,“binary_”的目的是縮寫記憶體佔用量,是限制同一客戶端ip地址。

  • 第二個引數:zone=one:10m表示生成一個大小為10M,名字為one的記憶體區域,用來儲存訪問的頻次資訊。

  • 第三個引數:rate=1r/s表示允許相同標識的客戶端的訪問頻次,這裡限制的是每秒1次,還可以有比如30r/m的。

limit_req zone=one burst=5 nodelay;

  • 第一個引數:zone=one 設定使用哪個配置區域來做限制,與上面limit_req_zone 裡的name對應。

  • 第二個引數:burst=5,重點說明一下這個配置,burst爆發的意思,這個配置的意思是設定一個大小為5的緩衝區當有大量請求(爆發)過來時,超過了訪問頻次限制的請求可以先放到這個緩衝區內。

  • 第三個引數:nodelay,如果設定,超過訪問頻次而且緩衝區也滿了的時候就會直接返回503,如果沒有設定,則所有請求會等待排隊。

ngx_http_limit_conn_module 引數配置

這個模組用來限制單個IP的請求數。並非所有的連線都被計數。只有在伺服器處理了請求並且已經讀取了整個請求頭時,連線才被計數。

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地址一個連線。

負載均衡

#user  nobody;
worker_processes 1;
error_log logs/error.log;# 開啟日誌
pid logs/nginx.pid;
...
upstream lyf {
server 192.168.37.220:8001; # 3個tomcat服務
server 192.168.37.220:8002;
server 192.168.37.220:8003;
}
server {
listen 80;
server_name 192.168.37.220;# 監聽ip
location / {
proxy_pass http://lyf; # 設定代理
index index.html index.htm;
}
}

keepalive 長連線提高吞吐量

keepalived :設定長連線處理的數量

proxy_http_version :設定長連線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負載預設的方式

權重方式 指定每個服務的權重比例,weight和訪問比率成正比

upstream  dalaoyang-server {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}

iphash

每個請求都根據訪問ip的hash結果分配,經過這樣的處理,每個訪客固定訪問一個後端服務,如下配置(ip_hash可以和weight配合使用)。

upstream  dalaoyang-server {
ip_hash;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}

最少連線

將請求分配到連線數最少的服務上。

upstream  dalaoyang-server {
least_conn;
server localhost:10001 weight=1;
server localhost:10002 weight=2;
}

fair

按後端伺服器的響應時間來分配請求,響應時間短的優先分配。

upstream  dalaoyang-server {
server localhost:10001 weight=1;
server localhost:10002 weight=2;
fair;
}

傳統的負載均衡,如果Upstream引數發生變化,每次都需要重新載入nginx.conf檔案,

因此擴充套件性不是很高,所以我們可以採用動態負載均衡,實現Upstream可配置化、動態化,無需人工重新載入nginx.conf。

需要明確的是:

  • Nginx兩臺是主備關係,只有一臺在工作。後面的tomcat是叢集,同時工作的。

  • keepalived是同時安裝在兩臺Nginx上的,不過檔案配置不一樣

  • 這裡的雙機熱備是指LVS,Nginx則是叢集

keepalived

健康檢查和失敗切換是keepalived的兩大核心功能。所謂的健康檢查,就是採用tcp三次握手,icmp請求,http請求,udp echo請求等方式對負載均衡器後面的實際的伺服器(通常是承載真實業務的伺服器)進行保活;而失敗切換主要是應用於配置了主備模式的負載均衡器,利用VRRP維持主備負載均衡器的心跳,當主負載均衡器出現問題時,由備負載均衡器承載對應的業務,從而在最大限度上減少流量損失,並提供服務的穩定性。

LVS是Linux Virtual Server的簡寫,意即Linux虛擬伺服器,是一個虛擬的伺服器集群系統。lvs目前是整合在Linux內的。

為什麼要LVS+Nginx?

一、ngix(應用層 網路七層負載均衡)

1、非同步轉發,請求資料和相應資料都要經過ngix,ngix和客戶端建立連線

2、輪詢所有的tomcat伺服器,保證請求成功或者最後一臺tomcat伺服器也請求失敗

二、lvs(網路層  網路四層負載均衡)

1、同步轉發接受請求資料,lvs轉發到伺服器,伺服器直接和客戶端建立連線

nginx要承受所有的流量,當一臺nigx承受不了,就需要搭建ngix叢集。ngix+ngix 外層的ngix還是要承受所有流量。

lvs+ngix:lvs同步轉發不會接受相應資料,LVS採用DR模式時不用響應伺服器返回的內容。(通常請求資料是比較小的,響應資料會比較大)

靜態資源配置

  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,檔案讀取配置

預設sendfile是關閉的,可以配置在http,server,location,if in location中

tcp_nopush on | off,多個包整合

預設是關閉狀態,可以在http,server,location中配置,它的作用是在sendfile開啟的情況下,提高網路包的傳輸效率。什麼意思呢,假設服務端收到請求,需要推送10個包,為了提高傳輸效率,這10個包不會一個一個返回給客戶端,而是將10個包攢夠了後一起返回回去。

tcp_nodelay on | off,網路包的實時性傳輸

預設開啟,可以在http,server,location中配置,它的作用是在keepalive連結下,提高網路包的傳輸實時性。

gzip on | off,壓縮

預設是關閉狀態,可以在http,server,location,if in location中配置,作用是壓縮傳輸。一般來說瀏覽器是可以對壓縮後的內容進行解壓的。

gzip_comp_level level;壓縮級別

預設的壓縮級別是1,可以在http,server,location中配置,級別配置的越高,壓縮的越好,但是壓縮會耗費服務端的計算資源,所以要控制好壓縮級別

gzip_http_version 1.0 | 1.1,壓縮對http協議的支援

預設對HTTP/1.1協議的請求才會進行gzip壓縮,可以配置在http,server,location中配置。當用戶想要讀取一個1.html檔案,首先會在目錄中找尋1.html.gz是否存在,所以這就導致了磁碟資源的浪費,必須要儲存兩份檔案。

###靜態資源訪問
server {
listen 80;
server_name static.itmayiedu.com;
location /static/imgs {
root F:/;
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;
}
}

跨域配置

跨域就是在原站點訪問域名不同的其他站點,同源策略會阻止一個域的javascript指令碼和另外一個域的內容進行互動。所謂同源(即指在同一個域)就是兩個頁面具有相同的協議(protocol),主機(host)和埠號(port)。

CORS 是跨域資源分享(Cross-Origin Resource Sharing)的縮寫。它是 W3C 標準,屬於跨源 AJAX 請求的根本解決方法。

1、普通跨域請求:只需伺服器端設定Access-Control-Allow-Origin

2、帶cookie跨域請求:前後端都需要進行設定

#允許跨域請求的域,*代表所有
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;
#非法引入會進入下方判斷
if ($invalid_referer) { return 404; }

*宣告:本文於網路整理,版權歸原作者所有,如來源資訊有誤或侵犯權益,請聯絡我們刪除或授權事宜

END

PHP開源社群

掃描關注  進入”PHP資料“

免費獲取進階

面試、文件、視訊資源

點選“檢視原文”獲取更多