Nginx進階實用配置(壓縮、代理、限流、請求合并)
Nginx是個性能很強的Web服務(wù)器和反向代理工具,配置靈活、功能多,能優(yōu)化網(wǎng)站速度、穩(wěn)住服務(wù)穩(wěn)定性。這篇文章就聚焦四個最常用的場景——GZIP壓縮、免備案反向代理、流量限流、請求合并。
一、開GZIP壓縮:讓資源變小,加載更快
1.1 為啥要開壓縮?
網(wǎng)站里的HTML、CSS、JS這些文件,默認體積不算小,傳輸?shù)接脩魹g覽器要花時間。GZIP能把這些文件“壓小”,一般能壓到原來的30%-50%,傳得快了,網(wǎng)頁加載自然就快,用戶體驗也更好。
1.2 兩種配置方案
下面給兩套配置,一套簡單基礎(chǔ),一套優(yōu)化到位適合生產(chǎn)環(huán)境,根據(jù)自己服務(wù)器性能選就行。
基礎(chǔ)配置
http {
# 開啟GZIP壓縮功能
gzip on;
# 文件小于1KB就不壓縮了,壓完變化不大,還浪費服務(wù)器資源
gzip_min_length 1k;
# 壓縮等級1-10,數(shù)字越大壓得越狠,但越費服務(wù)器CPU
gzip_comp_level 2;
# 指定要壓縮的文件類型,涵蓋常用的文本、腳本、圖片
gzip_types text/bash application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
# 開啟這個響應(yīng)頭,讓代理服務(wù)器能識別是否已壓縮(建議開)
gzip_vary on;
}生產(chǎn)環(huán)境優(yōu)化配置
這套配置在壓縮效果和服務(wù)器CPU消耗之間找了平衡,還加了兼容老瀏覽器、減少損耗的設(shè)置,適合正式上線的網(wǎng)站用。
http {
# ===== GZIP 核心配置 =====
# 開啟GZIP壓縮
gzip on;
# 小于1KB的文件不壓縮
gzip_min_length 1k;
# 壓縮等級設(shè)為6,性價比最高(既壓得小,又不怎么費CPU)
gzip_comp_level 6;
# 要壓縮的文件類型,覆蓋幾乎所有常用文本資源
gzip_types
text/plain
text/css
text/xml
text/javascript
application/javascript
application/x-javascript
application/json
application/xml
application/xml+rss
image/jpeg
image/gif
image/png;
# 開啟響應(yīng)頭,適配代理服務(wù)器
gzip_vary on;
# 最低支持HTTP 1.1協(xié)議的壓縮(不用改,默認就是這個)
gzip_http_version 1.1;
# 設(shè)置壓縮緩沖區(qū)大?。?個4KB緩沖區(qū),適配大多數(shù)場景)
gzip_buffers 2 4k;
# 優(yōu)先用提前壓好的.gz文件(比如自己手動壓的CSS.gz),減少服務(wù)器實時壓縮的損耗
gzip_static on;
# 不給IE6瀏覽器開壓縮(老瀏覽器兼容差,開了可能頁面亂碼)
gzip_disable "MSIE [1-6].";
}二、反向代理實現(xiàn)免備案訪問
2.1 原理很簡單
國內(nèi)服務(wù)器搭網(wǎng)站,必須先備案,沒備案的域名會被防火墻擋住,用戶打不開。想繞開這個限制,就找一臺已備案的服務(wù)器(或者香港、海外的免備案服務(wù)器,叫它服務(wù)器A),用戶訪問服務(wù)器A的合法域名,A再把請求轉(zhuǎn)發(fā)到國內(nèi)沒備案的服務(wù)器(服務(wù)器B),這樣用戶就能正常打開B上的網(wǎng)站了。
2.2 服務(wù)器A的配置示例
下面是服務(wù)器A上的Nginx配置,核心就是把A的域名請求,轉(zhuǎn)發(fā)到國內(nèi)沒備案的服務(wù)器B。
server {
listen 80;
server_name 免備案域名; # 換成服務(wù)器A的合法域名(已備案/免備案均可)
location / {
proxy_pass 服務(wù)器B的IP:端口; # 換成國內(nèi)未備案服務(wù)器B的IP和端口(比如192.168.1.100:8080)
}
}提示:配置完要重啟Nginx才生效,另外要確保服務(wù)器A和B能正常通信,沒有被防火墻攔截端口。
三、流量限流:防止服務(wù)被沖垮
Nginx有兩種限流方式,一種是控制單位時間內(nèi)的請求次數(shù),一種是控制同時連接的數(shù)量,根據(jù)需求選,也能一起用,避免網(wǎng)站被突發(fā)流量或惡意請求搞崩。
3.1 限制請求頻率(比如每秒最多10個請求)
用Nginx自帶的模塊,按IP來限制請求速度,比如限制同一個IP每秒最多發(fā)10個請求,多了就拒絕。核心是兩個配置指令,一個定規(guī)則,一個用規(guī)則。
http {
# 定義限流規(guī)則:按客戶端IP算,分配10MB內(nèi)存存訪問記錄,每秒最多10個請求
limit_req_zone $binary_remote_addr zone=serviceRateLimit:10m rate=10r/s;
server {
listen 80;
server_name 你的域名; # 換成自己的域名或服務(wù)器IP
location / {
# 應(yīng)用上面定義的限流規(guī)則
limit_req zone=serviceRateLimit;
# 把請求轉(zhuǎn)發(fā)到后端服務(wù)(換成自己的后端地址,沒有后端就刪掉這句)
proxy_pass http://upstream_cluster1;
}
}
}參數(shù)說明:
-
binary_remote_addr:按用戶IP限流,加個binary_是為了節(jié)省服務(wù)器內(nèi)存; -
zone=serviceRateLimit:10m:開辟一塊10MB的內(nèi)存,名字叫serviceRateLimit,專門存IP訪問記錄,10MB大概能存16萬個IP的信息; -
rate=10r/s:每秒最多10個請求,實際是每100毫秒處理1個,超過這個速度的請求直接拒絕。
3.2 處理突發(fā)流量(比如突然多20個請求)
上面的基礎(chǔ)配置太死板,比如突然來了20個請求,超過每秒10個的部分都會被拒,體驗不好。可以加兩個參數(shù),允許臨時多處理幾個請求,還不耽誤速度。
http {
# 定義限流規(guī)則:按客戶端IP,10MB內(nèi)存,每秒10個請求
limit_req_zone $binary_remote_addr zone=serviceRateLimit:10m rate=10r/s;
server {
listen 80;
server_name 你的域名; # 換成自己的域名/IP
location / {
# 允許額外20個突發(fā)請求,且這20個請求立即處理,不延遲
limit_req zone=serviceRateLimit burst=20 nodelay;
# 轉(zhuǎn)發(fā)到后端服務(wù)(換成自己的后端地址)
proxy_pass http://upstream_cluster1;
}
}
}說明:burst=20就是允許臨時多來20個請求,相當于留了20個“備用名額”;nodelay表示這20個請求不用排隊,立馬處理。但備用名額用完后,后續(xù)請求還是要按每秒10個的速度來,保證服務(wù)器不被壓垮。
3.3 限制并發(fā)連接數(shù)(比如同一IP最多20個連接)
除了限制請求頻率,還能限制同時連接的數(shù)量,比如同一個IP最多同時連20個,整個服務(wù)器最多同時連100個,避免單個用戶或整體流量占滿資源。
http {
# 按IP限制連接數(shù):10MB內(nèi)存存記錄
limit_conn_zone $binary_remote_addr zone=perip:10m;
# 按服務(wù)器限制總連接數(shù):10MB內(nèi)存存記錄
limit_conn_zone $server_name zone=perserver:10m;
server {
listen 80;
server_name 你的域名; # 換成自己的域名/IP
# 單個IP最多同時20個連接
limit_conn perip 20;
# 整個服務(wù)器最多同時100個連接
limit_conn perserver 100;
location / {
# 轉(zhuǎn)發(fā)到后端服務(wù)(換成自己的后端地址)
proxy_pass http://upstream_cluster1;
}
}
}注意:只有后端服務(wù)器處理完請求頭后,才會算一個連接數(shù),避免無效連接占用名額。
四、請求合并:減少請求次數(shù),加載更快
瀏覽器對同一個域名,同時只能發(fā)6個左右的請求,要是網(wǎng)頁有十幾個CSS、JS文件,就得排隊加載,很慢。用Nginx的concat模塊,能把多個CSS或JS文件合并成一個,減少請求次數(shù),加載速度就快了。
4.1 安裝concat模塊(必須編譯安裝)
這個模塊不是Nginx自帶的,得手動下載源碼,和Nginx一起編譯安裝,步驟如下(以Nginx 1.4.2版本為例,跟著敲命令就行):
# 進入源碼存放目錄 cd /usr/local/src/ # 下載Nginx和concat模塊的源碼 wget http://nginx.org/download/nginx-1.4.2.tar.gz wget https://github.com/alibaba/nginx-http-concat/archive/master.zip -O nginx-http-concat-master.zip # 解壓下載的文件 unzip nginx-http-concat-master.zip tar -xzvf nginx-1.4.2.tar.gz # 進入Nginx源碼目錄,配置編譯參數(shù) cd nginx-1.4.2 ./configure --prefix=/usr/local/nginx-1.4.2 --with-http_stub_status_module \ --add-module=../nginx-http-concat-master # 編譯并安裝 make make install
驗證:安裝完后,Nginx源碼目錄下會出現(xiàn)objs文件夾,就說明安裝成功了。
4.2 核心配置指令
- 開啟/關(guān)閉合并:
concat on | off,默認是off(關(guān)閉),可以在全局、單個服務(wù)器或單個路徑下設(shè)置; - 可合并的文件類型:
concat_types MIME types,默認只能合并CSS和JS,需要其他類型可以自己加; - 其他參數(shù):比如最多合并多少個文件、合并后用什么分隔符,后面配置示例里會講,按需調(diào)整就行。
4.3 配置示例和使用方法
server {
listen 80;
server_name localhost;
index index.html index.htm;
root /html; # 網(wǎng)站文件存放目錄,換成自己的路徑
location /static/css/ {
concat on; // 開啟文件合并功能
concat_max_files 20; // 最多合并20個文件,太多了反而不方便維護
concat_delimiter /* 自定義分隔符 */; // 合并后用這個符號區(qū)分不同文件內(nèi)容
concat_unique off; // 允許合并不同類型的資源(默認只允許同類型合并)
concat_types text/css application/javascript; // 允許合并CSS和JS
}
location /status {
stub_status on;
access_log off;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js)$ {
expires off;
}
}前端怎么用:在網(wǎng)頁里引用文件時,用??把多個文件路徑連起來就行,示例如下:
<link rel="stylesheet" href="/static/css/??a.css,b.css,c.css" rel="external nofollow" >
生效方法:配置完執(zhí)行命令/usr/local/nginx/sbin/nginx -s reload重啟Nginx,就能實現(xiàn)文件合并了。
五、經(jīng)驗之談
上面講的GZIP壓縮、免備案反向代理、流量限流、請求合并,都是Nginx實戰(zhàn)中最常用的優(yōu)化手段。配置的時候不用死記參數(shù),根據(jù)自己服務(wù)器的性能、網(wǎng)站流量大小來調(diào)整就行。每次改完配置,記得用nginx -t檢查語法有沒有錯,再重啟Nginx生效,把這些配置用好了,網(wǎng)站加載更快、運行更穩(wěn),不管是小站點還是高并發(fā)服務(wù)都適用。
到此這篇關(guān)于Nginx進階實用配置(壓縮、代理、限流、請求合并)的文章就介紹到這了,更多相關(guān)Nginx 壓縮、代理、限流、請求合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
prometheus監(jiān)控nginx的實現(xiàn)步驟
本文主要介紹了prometheus監(jiān)控nginx的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2026-05-05
Centos7.3 安裝部署Nginx并配置https的方法步驟
這篇文章主要介紹了Centos7.3 安裝部署Nginx并配置https的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2019-04-04
Nginx中的proxy_set_header核心參數(shù)解析
文章詳解Nginx中proxy_set_header指令的語法與用途,涵蓋設(shè)置Host頭、傳遞真實IP、協(xié)議信息、連接控制、CORS支持、自定義頭及緩存管理,強調(diào)需注意指令位置、空值處理和特殊頭格式,感興趣的朋友跟隨小編一起看看吧2025-08-08
利用Nginx反向代理功能解決WEB網(wǎng)站80端口被封的解決方法
大陸的網(wǎng)絡(luò)環(huán)境,都在天朝神獸的制度下讓我等小P民悲劇一片;動不動就拔網(wǎng)線、封機房;現(xiàn)在更厲害的一招,從網(wǎng)關(guān)封殺你的80端口,一旦被封,網(wǎng)站域名就無法訪問2012-08-08
詳解php+nginx 服務(wù)發(fā)生500 502錯誤排查思路
這篇文章主要介紹了詳解php+nginx 服務(wù)發(fā)生500 502錯誤排查思路,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧2019-07-07
詳解proxy_pass根據(jù)path路徑轉(zhuǎn)發(fā)時的"/"問題記錄
這篇文章主要介紹了詳解proxy_pass根據(jù)path路徑轉(zhuǎn)發(fā)時的"/"問題記錄,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09
Nginx優(yōu)化配置和內(nèi)核優(yōu)化 實現(xiàn)突破十萬并發(fā)
Nginx是一個高性能的 HTTP 和 反向代理 服務(wù)器,也是一個 IMAP/POP3/SMTP 代理服務(wù)器。本文介紹一些Nginx優(yōu)化代碼參數(shù)等2013-06-06

