Web前端必備-Nginx知識匯總

本文已同步到專業(yè)技術(shù)網(wǎng)站 www.sufaith.com, 該網(wǎng)站專注于前后端開發(fā)技術(shù)與經(jīng)驗(yàn)分享, 包含Web開發(fā)、Nodejs、Python、Linux、IT資訊等板塊.


一、Nginx簡介

Nginx是一個高性能、輕量級的Web和反向代理服務(wù)器, 其特點(diǎn)是占有內(nèi)存及資源少、抗并發(fā)能力強(qiáng)。

Nginx安裝簡單、配置簡潔、啟動快速便捷、支持熱部署、支持 SSL、擁有高度模塊化的設(shè)計(jì)。

Nginx的主要功能有:

  • Web服務(wù)器
  • 反向代理
  • 負(fù)載均衡

二、運(yùn)行和控制Nginx

備注: 以下命令中的 /usr/local/nginx 是nginx二進(jìn)制文件的絕對路徑,需根據(jù)自己實(shí)際的安裝路徑而定。

1.啟動

/usr/local/nginx/sbin/nginx

2.重新打開日志文件

/usr/local/nginx/sbin/nginx -s reopen

3.重新載入配置文件

/usr/local/nginx/sbin/nginx -s reload

4.停止

/usr/local/nginx/sbin/nginx -s stop

5.從容停止

(1) 查看進(jìn)程號

ps -ef|grep nginx

(2) 殺死進(jìn)程

kill -QUIT <進(jìn)程號> 或 kill -TERM <進(jìn)程號>

6.強(qiáng)制停止

pkill -9 nginx


三、Nginx作為Web服務(wù)器

Nginx作為Web服務(wù)器, 需要定義server虛擬主機(jī),讓這些虛擬主機(jī)去處理對于特定域名或IP地址的請求。<br />每個server虛擬主機(jī)都定義了 location 指令,location 定義了對于指定的一組 URI 是如何匹配和進(jìn)行處理的。

1.web服務(wù)器基本實(shí)例

server {
  listen 80;
  server_name www.example.com;
  location / {
  root /usr/local/www;
    index index.html;
  }    
}

參數(shù)說明:

  • server 代表1個虛擬主機(jī),可以有多個
  • server_name 匹配請求的指定域名或IP地址
  • location 配置請求的路由,匹配對應(yīng)的URI
  • root 查找資源的路徑(文件夾目錄)
  • index 默認(rèn)查找

2.location匹配規(guī)則(請求過濾)

(1) 語法

server {
   location 表達(dá)式 {
   }
}

(2) location表達(dá)式的類型

  • @ 它定義一個命名的 location,使用在內(nèi)部定向時(shí),例如 error_page, try_files
  • / 通用匹配,任何請求都會匹配到
  • = 開頭, 表示精確匹配, 只有請求的url路徑與=后面的字符串完全相等才會匹配到(優(yōu)先級最高)
  • ^~ 表示普通字符匹配。使用前綴匹配。如果匹配成功,則不再匹配其他location
  • ~ 開頭表示區(qū)分大小寫的正則匹配
  • ~* 開頭表示不區(qū)分大小寫的正則匹配

(3) location表達(dá)式的優(yōu)先級

  • = 的優(yōu)先級最高。一旦匹配成功,則不再查找其他匹配項(xiàng)。
  • ^~ 類型表達(dá)式。一旦匹配成功,則不再查找其他匹配項(xiàng)。
  • ~ 和 ~* 的優(yōu)先級次之。如果有多個location的正則能匹配的話,則使用正則表達(dá)式最長的那個。
  • 常規(guī)字符串匹配類型。按前綴匹配。

3.URL重寫

URL重寫是指: 當(dāng)請求的URL滿足事先定義好的規(guī)則時(shí), 將跳轉(zhuǎn)/定向到某個規(guī)則,比如常見的偽靜態(tài)、301重定向、瀏覽器定向等。

(1) 語法

server {
   rewrite 規(guī)則 定向路徑 重寫類型;
}

rewrite參數(shù)說明:

  • 規(guī)則:字符串或者正則來表示想匹配的目標(biāo)url
  • 定向路徑:匹配到規(guī)則后要定向的路徑,如果規(guī)則里有正則,則可以使用$index來表示正則里的捕獲分組
  • 重寫類型:
    • last :表示完成rewrite,瀏覽器地址欄URL地址不變
    • break;本條規(guī)則匹配完成后,終止匹配,不再匹配后面的規(guī)則,瀏覽器地址欄URL地址不變
    • redirect:返回302臨時(shí)重定向,瀏覽器地址會顯示跳轉(zhuǎn)后的URL地址
    • permanent:返回301永久重定向,瀏覽器地址欄會顯示跳轉(zhuǎn)后的URL地址

(2) 示例

域名跳轉(zhuǎn): 訪問 www.aaa.com 跳轉(zhuǎn)到 www.bbb.com

server {
  listen 80;
  server_name  www.aaa.com;
  location / {
   rewrite ^/$ www.bbb.com permanent;
  }
}

4.try_files

try_files是指: 按順序檢查文件是否存在,返回第一個找到的文件。如果所有的文件都找不到,會進(jìn)行一個內(nèi)部重定向到最后一個參數(shù).<br /><br />

(1) 語法

try_files file1 files2 ... uri

參數(shù)說明:

  • 最后一個參數(shù)是回退URI, 且必須存在,否則將會出現(xiàn)內(nèi)部500錯誤。
  • 只有最后一個參數(shù)可以引起一個內(nèi)部重定向,之前的參數(shù)只設(shè)置內(nèi)部URI的指向。
  • 最后一個參數(shù)也可以是一個命名的location。
  • 最后一個參數(shù)如果不是命名的location那么args不會自動保留,如果你想保留args,必須在最后一個參數(shù)里明確聲明。示例為:
try_files $uri $uri/ /index.php?q=$uri&$args;

(2) 示例

  • 跳轉(zhuǎn)到文件

當(dāng)訪問:www.example.com/test 時(shí)會依次查找,若 1.html,2.html 都不存在,最終返回 3.html

server {
  listen 80;
  server_name www.example.com;
  root html;
  index index.html;
  location /test {
        try_files /1.html /2.html /3.html;
    }
}
  • 跳轉(zhuǎn)到變量

當(dāng)訪問:www.example.com/test 時(shí)會依次查找,若 1.html,2.html 都不存在,則跳轉(zhuǎn)到命名為abc的location

server {
  listen 80;
  server_name www.example.com;
  root html;
  index index.html;             
  location /test {
    try_files /1.html /2.html @abc;
  }
  location @abc{
    rewrite ^/(.*)$  http://www.example2.com;
  }
}
  • vue-router設(shè)置HTML5 History 模式時(shí), nginx的配置如下:
location / {
    # URL 匹配不到任何靜態(tài)資源,返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。
    try_files $uri $uri/ /index.html;
}

5.Gzip配置

server {
  # 開啟gzip 壓縮
  gzip on;
  # 設(shè)置gzip所需的http協(xié)議最低版本 (HTTP/1.1, HTTP/1.0)
  gzip_http_version 1.1;
  # 設(shè)置壓縮級別(1-9), 值越大壓縮率越高,同時(shí)消耗cpu資源也越多,建議設(shè)置在4左右
  gzip_comp_level 4;
  # 設(shè)置壓縮的最小字節(jié)數(shù), 頁面Content-Length獲取
  gzip_min_length 1000;
  # 設(shè)置壓縮文件的類型  (text/html), 不建議壓縮圖片(如jpg、png本身已壓縮)
  gzip_types text/plain application/javascript text/css;
 #配置禁用gzip條件,支持正則。此處表示ie6及以下不啟用gzip(因?yàn)閕e低版本不支持)
 gzip_disable "MSIE [1-6]\.";
}

6.https配置

http {
  # 配置共享會話緩存大小,視站點(diǎn)訪問情況設(shè)定
  ssl_session_cache   shared:SSL:10m;
  # 配置會話超時(shí)時(shí)間
  ssl_session_timeout 10m;
  server {
    listen 443;
    server_name www.example.com;
    ssl on;
    # 設(shè)置長連接
    keepalive_timeout 70;
    # HSTS策略
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    # 證書文件
    ssl_certificate www.example.com.crt;
    # 私鑰文件
    ssl_certificate_key www.example.com.key;  
    # 優(yōu)先采取服務(wù)器算法
    ssl_prefer_server_ciphers on;
    # 指定SSL協(xié)議
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    # 定義算法
    ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
    # 減少點(diǎn)擊劫持
    add_header X-Frame-Options DENY;
    # 禁止服務(wù)器自動解析資源類型
    add_header X-Content-Type-Options nosniff;
    # 防XSS攻擊
    add_header X-Xss-Protection 1;
  }
}


四、Nginx作為反向代理服務(wù)器

server {
  listen 80;
  server_name www.example.com;
  root html;
  index index.html;  
  location /test {    
    # 請求host
    proxy_set_header Host $http_host;
    # 請求ip
    proxy_set_header X-Real-IP $remote_addr;
    # 請求協(xié)議
    proxy_set_header X-Scheme $scheme;
    # 代理服務(wù)器
    proxy_pass http://localhost:3000;
  }
}

當(dāng)訪問http://www.example.com/test時(shí), nginx會將請求轉(zhuǎn)發(fā)到http://localhost:3000上。


五、Nginx作為負(fù)載均衡

1.負(fù)載均衡的介紹

在服務(wù)器集群中,Nginx起到一個代理服務(wù)器的角色(即反向代理),為了避免單獨(dú)一個服務(wù)器壓力過大,將來自用戶的請求轉(zhuǎn)發(fā)給不同的服務(wù)器。

負(fù)載均衡用于從 "upstream" 模塊定義的后端服務(wù)器列表中選取一臺服務(wù)器接受用戶的請求。

2.負(fù)載均衡的基本實(shí)例

(1) upstream模塊

一個最基本的upstream模塊如下:

#動態(tài)服務(wù)器組, server是后端服務(wù)器,my_server是自定義的服務(wù)器組名稱。
upstream my_server {
  server localhost:8001;
  server localhost:8002;
  server localhost:8003;
}

(2) 反向代理

在upstream模塊配置完成后,要讓指定的訪問反向代理到服務(wù)器組。

server {
  listen 80;
  server_name www.example.com;
  root html;
  index index.html;
  location / {    
   # 反向代理到定義好的服務(wù)器組my_server
   proxy_pass my_server;
  }
}

(3)完整配置

http {
    upstream my_server {
    server localhost:8001;
    server localhost:8002;
    server localhost:8003;
  }
    server {
    listen      80;
    server_name www.example.com;
    root html;
    index index.html;
        location / {
            # 反向代理到定義好的服務(wù)器組my_server
            proxy_pass my_server;
        }
    }
}

3. 負(fù)載均衡策略

(1) 輪詢(默認(rèn)方式)

表示每個請求按時(shí)間順序逐一分配到不同的后端服務(wù)器。

upstream my_server {
   server localhost:8001;
   server localhost:8002;
}

(2) weight(權(quán)重方式)

表示在輪詢策略的基礎(chǔ)上指定輪詢的服務(wù)器的權(quán)重,默認(rèn)為1,權(quán)重越高分配到需要處理的請求越多。

upstream my_server {
  server localhost:8001 weight=1;
  server localhost:8002 weight=2;
}

(3) ip_hash

表示指定負(fù)載均衡器按照基于客戶端IP的分配方式,這個方法確保了相同的客戶端的請求一直發(fā)送到相同的服務(wù)器,以保證session會話。這樣每個訪客都固定訪問一個后端服務(wù)器,可以解決session不能跨服務(wù)器的問題。

upstream my_server {
  ip_hash;
  server localhost:8001;
  server localhost:8002;
}

備注:

  • 在nginx版本1.3.1之前,不能在ip_hash中使用權(quán)重(weight)。
  • ip_hash不能與backup同時(shí)使用。
  • 此策略適合有狀態(tài)服務(wù),比如session。
  • 當(dāng)有服務(wù)器需要剔除,必須手動down掉。

(4) least_conn

表示把請求轉(zhuǎn)發(fā)給連接數(shù)較少的后端服務(wù)器。輪詢算法是把請求平均的轉(zhuǎn)發(fā)給各個后端,使它們的負(fù)載大致相同;但是,有些請求占用的時(shí)間很長,會導(dǎo)致其所在的后端負(fù)載較高。這種情況下,least_conn這種方式就可以達(dá)到更好的負(fù)載均衡效果。

upstream my_server {
  least_conn;
  server localhost:8001;
  server localhost:8002;
}

(5) down

表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡。

upstream my_server {
  server localhost:8001 down;
  server localhost:8002;
  server localhost:8003;
}

(6) backup

表示預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者忙的時(shí)候,才會請求backup機(jī)器,因 此這臺機(jī)器的壓力最輕。

upstream my_server {
  server localhost:8001 backup;
  server localhost:8002;
  server localhost:8003;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容