前端想要了解的Nginx

作者丨快狗打車前端團隊
來源:https://juejin.im/post/5cae9de95188251ae2324ec3

Nginx 是一個高性能的HTTP和反向代理服務器,同時也是一個 IMAP/POP3/SMTP 代理服務器。

常見場景:

靜態資源服務器

動態匹配

反向代理

Gzip 壓縮

負載均衡

先來看下默認的Nginx配置,我將以此為基礎依次介紹Nginx的用法

Nginx 安裝目錄下的nginx.conf就是Nginx全局的配置文件,我們主要修改這裡的內容。nginx.conf.default作為配置文件的備份。

前端想要了解的Nginx

前端想要了解的Nginx

搭建靜態站點

前端想要了解的Nginx

這裡說明一下相關字段

server 配置虛擬主機的相關參數,可以有多個

server_name 通過請求中的host值 找到對應的虛擬主機的配置

location 配置請求路由,處理相關頁面情況

root 查找資源的路徑

配置完成後執行 nginx -t 看是否有錯誤,如果看到的是下面這種就是成功了

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

然後執行nginx -s reload 更新Nginx配置文件

這時候打開瀏覽器 輸入 localhost:8080 應該就能看到你的頁面了

nginx -t 檢查配置文件是否有語法錯誤

nginx -s reload 向主進程發送信號,重新加載配置文件

nginx -s stop 快速關閉

nginx -s quit 等待工作進程處理完成後關閉


動態匹配(請求過濾)

通常在開發環境或者測試環境的時候呢我們修改了代碼,因為瀏覽器緩存,可能不會生效,需要手動清除緩存,才能看到修改後的效果,這裡我們做一個配置讓瀏覽器不緩存相關的資源。

location ~* \.(js|css|png|jpg|gif)$ {
add_header Cache-Control no-store;
}


~* \.(js|css|png|jpg|gif)$ 是匹配以相關文件類型然後單獨處理。add_header 是給請求的響應加上一個頭信息Cache-Control no-store,告知瀏覽器禁用緩存,每次都從服務器獲取 效果如下:

前端想要了解的Nginx



匹配規則

通常的形式如下

前端想要了解的Nginx

= 表示精確匹配。只有請求的url路徑與後面的字符串完全相等時,才會命中(優先級最高)。

^~ 表示如果該符號後面的字符是最佳匹配,採用該規則,不再進行後續的查找。

~ 表示該規則是使用正則定義的,區分大小寫。

~* 表示該規則是使用正則定義的,不區分大小寫。

當然我們還可以通過狀態碼來過濾請求就像這樣

# 通過狀態碼,返回指定的錯誤頁面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /source/error_page;
}



反向代理解決跨域

因為瀏覽器的同源策略,當前端域名與後端域名不一致的時候導致請求失敗。我們可以通過配置Nginx反向代理來解決。

前端想要了解的Nginx

攔截路徑/api, 可以通過正則匹配。

proxy_set_header 允許重新定義或添加字段傳遞給代理服務器的請求頭。

$http_host、$remote_addr、$scheme 為Nginx內置變量。

rewrite 根據rewrite後的請求URI,將路徑重寫,如:接口路徑為 /user, 我們可以請求 /api/user。(為什麼需要重寫uri?因為在使用Nginx做反向代理的時候,需要匹配到跨域的接口再做轉發,為了方便匹配,會人為的在原接口中添加一段路徑(或標示, 如例子中的api),因此需要在匹配之後、轉發之前把添加的那段去掉,因此需要rewrite。)

break 繼續本次請求後面的處理 ,停止匹配下面的location。需要注意的是與之類似的last執行過程則是停止當前這個請求,並根據rewrite匹配的規則重新發起一個請求,從上到下依次匹配location後面的規則。

proxy_pass 代理服務器。

原理:Nginx攔截到相關匹配規則, Nginx再將請求轉發到http://localhost:9000,Nginx得到請求後再響應到前端,可以直接請求/api/user完成請求。


配置Gzip

開發過程中難免用到一些成熟的框架,或者插件,這些外部的依賴,有時候體積比較大,導致頁面響應緩慢,我們可以用打包工具(webpack, rollup),將代碼進行壓縮,以縮小代碼體積。 開啟Nginx Gzip壓縮功能。需要注意的是 Gzip 壓縮功能需要瀏覽器跟服務器都支持,即服務器壓縮,瀏覽器解析。

查看瀏覽器支持情況,確定 請求頭 中的Accept-Encoding字段

前端想要了解的Nginx


確定瀏覽器支持,我們就可以在Nginx中配置

前端想要了解的Nginx

查看配置是否生效,查看 響應頭 中的Content-Encoding字段,值為 gzip

前端想要了解的Nginx



負載均衡

負載均衡是Nginx 比較常用的一個功能,可優化資源利用率,最大化吞吐量,減少延遲,確保容錯配置,將流量分配到多個後端服務器。

Syntax: upstream name { ... }

Default: —

Context: stream

這裡舉出常用的幾種策略

輪詢(默認),請求過來後,Nginx 隨機分配流量到任一服務器

upstream backend {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}


weight=number 設置服務器的權重,默認為1,權重大的會被優先分配

upstream backend {
server 127.0.0.1:3000 weight=2;
server 127.0.0.1:3001 weight=1;
}

backup 標記為備份服務器。當主服務器不可用時,將傳遞與備份服務器的連接。

upstream backend {
server 127.0.0.1:3000 backup;
server 127.0.0.1:3001;
}


ip_hash 保持會話,保證同一客戶端始終訪問一臺服務器。

upstream backend {
ip_hash;
server 127.0.0.1:3000 backup;
server 127.0.0.1:3001;
}


least_conn 優先分配最少連接數的服務器,避免服務器超載請求過多。

upstream backend {
least_conn;
server 127.0.0.1:3000;
server 127.0.0.1:3001;
}


當我們需要代理一個集群時候可以通過下面這種方式實現

前端想要了解的Nginx

最後

Nginx 的功能還有很多,這裡只介紹了幾個比較基礎、常用的,供大家學習和參考,快速入門,搭建出一套可用的環境。


分享到:


相關文章: