做網(wǎng)站 我們的工人怎么寫中國營銷傳播網(wǎng)
背景
在Java系統(tǒng)實(shí)現(xiàn)過程中,我們不可避免地會(huì)借助大量開源功能組件。然而,這些組件往往功能豐富且體系龐大,官方文檔常常詳盡至數(shù)百頁。而在實(shí)際項(xiàng)目中,我們可能僅需使用其中的一小部分功能,這就造成了一個(gè)挑戰(zhàn):如何在有限的時(shí)間和精力下,高效地掌握并使用這些組件的核心功能,以實(shí)現(xiàn)投入產(chǎn)出最大化?
針對這一問題,我基于二八原則,整理編寫本文。
首先,我會(huì)聚焦于組件的常見和核心功能,這些功能通常是我們在日常開發(fā)中頻繁使用到的,也是構(gòu)建穩(wěn)定、高效系統(tǒng)的基石。通過深入了解這些核心功能的使用方法和最佳實(shí)踐,我們可以確保在關(guān)鍵點(diǎn)上投入足夠的精力,從而避免在實(shí)際使用中掉入陷阱。
其次,我會(huì)以問題為導(dǎo)向,將實(shí)用性作為第一要素,對組件的功能進(jìn)行篩選和整理。這意味著我會(huì)優(yōu)先關(guān)注那些在項(xiàng)目中實(shí)際需要用到的功能,而對于那些特定場景下才會(huì)用到的功能,我會(huì)在文中提及但不做詳細(xì)展開。這樣做的好處是,我們可以在保證核心功能得到充分理解的同時(shí),減少不必要的閱讀負(fù)擔(dān),提高學(xué)習(xí)效率,降低投入成本。
最后,我會(huì)注重內(nèi)容的精煉和易讀性。通過簡明扼要的文字描述和直觀的示例代碼,幫助讀者快速理解并掌握組件的核心用法。
同時(shí),我也會(huì)結(jié)合經(jīng)驗(yàn)指出常見的問題和【注意事項(xiàng)】,以便讀者在使用過程中能夠規(guī)避一些常見的錯(cuò)誤和陷阱。
綜上所述,通過這個(gè)系列的內(nèi)容整理,我希望能夠幫助讀者在有限的時(shí)間和精力下,高效地掌握并使用這些開源功能組件的核心功能,滿足系統(tǒng)實(shí)現(xiàn)的需要。
注:部分內(nèi)容章節(jié)由AI輔助生成草稿,我對其進(jìn)行了復(fù)核和修訂,修復(fù)了有問題和有錯(cuò)誤的部分。
理論
Nginx是什么?
Nginx是一個(gè)輕量級(jí)、高性能的web服務(wù)器,支持HTTP、HTTPS、SMTP、POP3 和 IMAP 協(xié)議,并可以實(shí)現(xiàn)反向代理、負(fù)載均衡的功能。
什么是反向代理?
反向代理(Reverse Proxy)是一種服務(wù),它位于一個(gè)或多個(gè)原始服務(wù)(常稱為后端服務(wù))之前,接收客戶端的請求并將這些請求轉(zhuǎn)發(fā)到原始服務(wù)??蛻舳送ǔ2粫?huì)意識(shí)到反向代理的存在,因?yàn)樗鼈冎苯优c反向代理進(jìn)行通信,而反向代理則代表客戶端與后端服務(wù)進(jìn)行交互。
反向代理的主要作用包括:
- 負(fù)載均衡:反向代理可以將請求分發(fā)到多個(gè)后端服務(wù),從而實(shí)現(xiàn)負(fù)載均衡,提高系統(tǒng)的性能和可靠性。
- 安全性增強(qiáng):通過隱藏后端服務(wù)的詳細(xì)信息,反向代理可以增加系統(tǒng)的安全性,防止后端服務(wù)直接暴露給外部。
- SSL/TLS 終端:反向代理可以處理 SSL/TLS 連接,減輕后端服務(wù)的加密解密負(fù)擔(dān),同時(shí)可以集中管理 SSL 證書。
- 緩存靜態(tài)內(nèi)容:反向代理可以緩存后端服務(wù)的靜態(tài)內(nèi)容,減少對后端服務(wù)的請求次數(shù),加快內(nèi)容的加載速度。
- 壓縮和優(yōu)化:反向代理可以在將請求轉(zhuǎn)發(fā)給后端服務(wù)之前或?qū)㈨憫?yīng)返回給客戶端之前,對數(shù)據(jù)進(jìn)行壓縮或優(yōu)化。
- 訪問控制:反向代理可以實(shí)施訪問控制策略,例如 IP 過濾、地理定位訪問限制等。
- URL 重寫:反向代理可以修改請求的 URL,實(shí)現(xiàn) URL 重寫,有助于 SEO 優(yōu)化和重定向。
- 連接管理:反向代理可以管理客戶端與后端服務(wù)之間的連接,例如保持連接的持久性或斷開空閑連接。
- 日志記錄和監(jiān)控:反向代理可以記錄請求和響應(yīng)的日志,便于監(jiān)控和分析流量模式。
- 故障轉(zhuǎn)移:在后端服務(wù)發(fā)生故障時(shí),反向代理可以自動(dòng)將請求轉(zhuǎn)發(fā)到健康的服務(wù),提高系統(tǒng)的可用性。
Nginx 和 Apache 是當(dāng)前市面主流的Web服務(wù)容器,具備上述反向代理功能。
Nginx 和 Apache的區(qū)別在哪?
Nginx 和 Apache 都是流行的 Web 服務(wù)容器,但它們在多個(gè)方面存在顯著差異:
- 架構(gòu)和并發(fā)處理:
- Nginx 采用異步非阻塞的事件驅(qū)動(dòng)模型,能夠處理大量并發(fā)連接,適合靜態(tài)內(nèi)容和高并發(fā)場景。
- Apache 采用同步多進(jìn)程模型,每個(gè)連接對應(yīng)一個(gè)進(jìn)程,適合處理動(dòng)態(tài)內(nèi)容,但在高并發(fā)情況下可能會(huì)遇到性能瓶頸。
- 資源占用:
- Nginx 以其輕量級(jí)和低資源占用著稱,適合處理靜態(tài)文件和反向代理。
- Apache 在處理動(dòng)態(tài)內(nèi)容時(shí)資源占用較高,但在動(dòng)態(tài)請求處理方面表現(xiàn)優(yōu)異。
- 配置和靈活性:
- Nginx 的配置文件簡潔,支持正則配置,易于理解和修改。
- Apache 的配置文件復(fù)雜,支持目錄級(jí)別的配置(.htaccess 文件),提供了更高的靈活性。
- 模塊化和擴(kuò)展性:
- Nginx 的模塊化設(shè)計(jì)使其編寫模塊相對簡單,但模塊需要從源代碼編譯。
- Apache 支持動(dòng)態(tài)加載模塊,提供了豐富的第三方模塊和插件,擴(kuò)展性更強(qiáng)。
- 負(fù)載均衡和反向代理:
- Nginx 內(nèi)置了負(fù)載均衡功能,支持多種負(fù)載均衡算法,適合作為反向代理服務(wù)器。
- Apache 通過模塊化架構(gòu)和第三方模塊實(shí)現(xiàn)負(fù)載均衡,但配置和管理較為復(fù)雜。
- 穩(wěn)定性和成熟度:
- Nginx 以其高性能和輕量級(jí)特點(diǎn)著稱,適合高并發(fā)和負(fù)載壓力較大的場景。
- Apache 更為成熟,擁有龐大的開發(fā)者社區(qū)和豐富的文檔資源,適合需要穩(wěn)定性和功能豐富的場景。
- 市場占有率:
- Nginx 是增長最快的網(wǎng)絡(luò)服務(wù)器,市場份額不斷上升,尤其在高流量網(wǎng)站中表現(xiàn)突出。
- Apache 曾經(jīng)是主流,擁有廣泛的用戶群體和成熟的技術(shù),已被Nginx超越。
- 適用場景:
- Nginx 適合處理靜態(tài)內(nèi)容、反向代理和高并發(fā)場景。
- Apache 適合處理動(dòng)態(tài)內(nèi)容、需要高度定制和靈活性的場景。
- 社區(qū)和生態(tài)系統(tǒng):
- Nginx 的社區(qū)非?;钴S,提供了大量的高性能模塊。
- Apache 擁有龐大的開發(fā)者社區(qū)和豐富的第三方模塊。
- 組合使用:
- 許多管理員將 Apache 和 Nginx 結(jié)合使用,利用 Nginx 處理靜態(tài)內(nèi)容和負(fù)載均衡,將動(dòng)態(tài)請求轉(zhuǎn)發(fā)給 Apache 處理。
綜上所述,選擇 Nginx 還是 Apache 應(yīng)根據(jù)具體需求、技術(shù)棧和場景來決定。
Nginx的主要作用有哪些?
以下是 Nginx 的一些主要作用:
- 靜態(tài)內(nèi)容服務(wù):Nginx 可以高效地提供靜態(tài)文件,如 HTML、CSS、JavaScript 和圖片等。
- 反向代理:Nginx 可以作為反向代理服務(wù),將客戶端的請求轉(zhuǎn)發(fā)到后端的服務(wù)上。
- 負(fù)載均衡:Nginx 能夠分配請求到多個(gè)后端服務(wù),提高應(yīng)用的可用性和擴(kuò)展性。
- SSL/TLS 終端:Nginx 支持 SSL/TLS 協(xié)議,可以用于終止 SSL 連接,提高安全性。
- 緩存:Nginx 提供了靜態(tài)內(nèi)容的緩存機(jī)制,可以減少后端服務(wù)的負(fù)載,提高響應(yīng)速度。
- 壓縮:Nginx 可以對傳輸?shù)臄?shù)據(jù)進(jìn)行壓縮,減少帶寬消耗。
- URL 重寫:Nginx 支持 URL 重寫規(guī)則,可以用于實(shí)現(xiàn) SEO 優(yōu)化和重定向。
- 訪問控制:Nginx 提供了訪問控制列表(ACL),可以限制特定 IP 或地理位置的訪問。
- 日志記錄:Nginx 可以記錄訪問日志,幫助分析流量和監(jiān)控訪問模式。
- 模塊化:Nginx 擁有豐富的模塊系統(tǒng),可以擴(kuò)展其功能,如使用第三方模塊。
- 高并發(fā)處理:Nginx 以其高并發(fā)處理能力而聞名,適合處理大量并發(fā)連接。
- 跨平臺(tái):Nginx 可以在多種操作系統(tǒng)上運(yùn)行,包括 Linux、Unix、BSD、Mac OS X 和 Windows。
- 配置靈活:Nginx 提供了靈活的配置選項(xiàng),可以根據(jù)需求進(jìn)行定制。
Nginx 的設(shè)計(jì)哲學(xué)是提供少而精的核心功能,并通過模塊化擴(kuò)展來滿足特定的需求,這使得它在性能和靈活性方面都非常出色。
主要應(yīng)用場景有哪些?
web應(yīng)用容器:對于前后端分離項(xiàng)目,基于vue和react等框架構(gòu)建的前端項(xiàng)目,往往會(huì)選用nginx作為其web應(yīng)用容器。
負(fù)載均衡:在系統(tǒng)架構(gòu)中作為負(fù)載均衡中間件,進(jìn)行七層協(xié)議的轉(zhuǎn)發(fā)。
實(shí)戰(zhàn)
如何下載?
官網(wǎng)下載地址:https://nginx.org/en/download.html
當(dāng)前最新穩(wěn)定版本是1.26.1,windows版下載地址:https://nginx.org/download/nginx-1.26.1.zip
無需安裝,解壓即可,解壓后目錄如下:
注:下文都以該版本為例進(jìn)行配置說明。
常用命令有哪些?
nginx 啟動(dòng)
nginx -s stop 停止
nginx -s quit 安全退出
nginx -s reload 重新加載配置文件
nginx -t 驗(yàn)證配置文件是否正確
注:nginx -s reload命令重新加載配置文件,不會(huì)中斷當(dāng)前的連接或服務(wù)。
配置文件在哪?
Nginx配置文件默認(rèn)在安裝目錄下的conf目錄下,文件名為nginx.conf,可用文本類查看工具直接打開。
典型配置什么樣?
nginx自帶了示例配置,如下:
#user nobody;
worker_processes 1;#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid;events {worker_connections 1024;
}http {include mime.types;default_type application/octet-stream;#log_format main '$remote_addr - $remote_user [$time_local] "$request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for"';#access_log logs/access.log main;sendfile on;#tcp_nopush on;#keepalive_timeout 0;keepalive_timeout 65;#gzip on;server {listen 80;server_name localhost;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}#error_page 404 /404.html;# redirect server error pages to the static page /50x.html#error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {# proxy_pass http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {# root html;# fastcgi_pass 127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one##location ~ /\.ht {# deny all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {# listen 8000;# listen somename:8080;# server_name somename alias another.alias;# location / {# root html;# index index.html index.htm;# }#}# HTTPS server##server {# listen 443 ssl;# server_name localhost;# ssl_certificate cert.pem;# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;# ssl_prefer_server_ciphers on;# location / {# root html;# index index.html index.htm;# }#}}
示例文件中展示的往往是核心的、常用的參數(shù),下面來具體說一下。
常用參數(shù)有哪些?
Nginx 的配置文件通常分為幾個(gè)部分:全局塊、events 塊、http 塊。其中http 塊內(nèi)部有一個(gè)重要節(jié)點(diǎn) server 塊,server塊中又包含一個(gè)重要節(jié)點(diǎn)location塊,配置結(jié)構(gòu)如下:
main # 全局配置
├── events # 配置網(wǎng)絡(luò)連接
├── http # 配置代理、緩存、日志等
│ ├── upstream # 配置負(fù)載均衡
│ ├── server # 配置虛擬主機(jī),可以有多個(gè) server
│ ├── server
│ │ ├── location # 用于匹配 URI(URL 是 URI 的一種),可以有多個(gè) location
│ │ ├── location
│ │ └── ...
│ └── ...
└── ...
注:
1.上面的main代表根節(jié)點(diǎn)的示意,實(shí)際并不真實(shí)存在。
2.upstream塊用于負(fù)載均衡,非必須
全局塊
位于配置文件的頂層,用來進(jìn)行全局化配置,如指定運(yùn)行nginx進(jìn)程的操作系統(tǒng)用戶、配置工作進(jìn)程數(shù)量、指定錯(cuò)誤日志的路徑以及指定nginx進(jìn)程的主進(jìn)程pid存放文件。
user
指定運(yùn)行 Nginx 工作進(jìn)程的用戶,與文件權(quán)限和系統(tǒng)安全性相關(guān),合理配置 user
參數(shù),可以增強(qiáng) Nginx 服務(wù)器的安全性,并確保它能夠正確地訪問和管理所需的資源。
【參數(shù)說明】
- 默認(rèn)設(shè)置:在默認(rèn)的 Nginx 配置中,
user
可能被設(shè)置為nobody
或特定的用戶,如www-data
(在某些 Linux 發(fā)行版中)。
【注意事項(xiàng)】
- 權(quán)限控制:通過指定
user
,可以限制 Nginx 進(jìn)程對系統(tǒng)資源的訪問,因?yàn)椴煌脩艟哂胁煌臋?quán)限。 - 安全性:以非特權(quán)用戶運(yùn)行 Nginx 可以減少潛在的安全風(fēng)險(xiǎn),因?yàn)榧词?Nginx 被惡意攻擊,攻擊者也只能獲得該用戶的權(quán)限。
worker_processes
Nginx的總體架構(gòu)是有一個(gè)主進(jìn)程負(fù)責(zé)整體調(diào)度和管理,然后開啟多個(gè)工作進(jìn)程來干具體的活。
該參數(shù)用來指定 Nginx 啟動(dòng)的工作進(jìn)程數(shù)量。這個(gè)參數(shù)直接影響到 Nginx 服務(wù)器并發(fā)處理請求的能力。
【參數(shù)說明】
- 默認(rèn)行為:默認(rèn)情況下,Nginx 配置文件中的
worker_processes
被設(shè)置為 1,這意味著只有一個(gè)工作進(jìn)程來處理所有的網(wǎng)絡(luò)請求。 - 設(shè)置建議:通常建議將
worker_processes
的值設(shè)置為與 CPU 核心數(shù)相等,以便充分利用多核處理器的優(yōu)勢。如果服務(wù)器有多個(gè) CPU 或多核心 CPU,可以設(shè)置worker_processes
等于 CPU 的核心數(shù)。 - 自動(dòng)檢測:可以將
worker_processes
設(shè)置為auto
,這樣 Nginx 會(huì)自動(dòng)檢測當(dāng)前主機(jī)的 CPU 核心數(shù),并啟動(dòng)對應(yīng)數(shù)量的工作進(jìn)程。
當(dāng)設(shè)置該值為2時(shí),啟動(dòng)nginx服務(wù),從操作系統(tǒng)層面可以看到,實(shí)際有3個(gè)進(jìn)程,1個(gè)是主進(jìn)程,另外兩個(gè)則是工作進(jìn)程。
建議將該值設(shè)置為auto,當(dāng)服務(wù)器增配cpu資源時(shí),nginx可自動(dòng)檢測調(diào)整,無需同步調(diào)整配置。
error_log
日志對于排除 Nginx 服務(wù)問題至關(guān)重要,該參數(shù)定義錯(cuò)誤日志的存放位置和日志級(jí)別。
【參數(shù)說明】
- 默認(rèn)值:Nginx 的默認(rèn)錯(cuò)誤日志文件路徑在linux下通常是
/var/log/nginx/error.log
,并且默認(rèn)日志級(jí)別是error
,在windows系統(tǒng)下位于程序所在目錄的的logs目錄。 - 日志級(jí)別:可以設(shè)置不同的日志級(jí)別,包括
debug
、info
、notice
、warn
、error
、crit
、alert
和emerg
。級(jí)別越高,記錄的信息越少,生產(chǎn)環(huán)境中常用的是warn
、error
和crit
這三個(gè)級(jí)別 。
【注意事項(xiàng)】
- 日志級(jí)別說明:
debug
:輸出最詳細(xì)的信息,主要用于調(diào)試。info
:提供一般信息,可能包含敏感數(shù)據(jù),生產(chǎn)環(huán)境不推薦使用。notice
:正常運(yùn)行時(shí)的提醒信息。warn
:警告信息,表示有潛在的問題。error
:錯(cuò)誤信息,表示處理請求時(shí)出現(xiàn)的問題。crit
:臨界信息,表示嚴(yán)重錯(cuò)誤。alert
和emerg
:緊急信息,表示非常嚴(yán)重的狀況 。
- 在生產(chǎn)環(huán)境中,建議根據(jù)需要選擇合適的日志級(jí)別,避免產(chǎn)生過多的日志信息,影響系統(tǒng)性能。
pid
定義 Nginx 主進(jìn)程的 PID 文件存放路徑。PID 文件記錄了 Nginx 進(jìn)程的進(jìn)程標(biāo)識(shí)符(Process ID),通常用于管理 Nginx 進(jìn)程,比如重啟或停止服務(wù)。
【參數(shù)說明】
- 默認(rèn)設(shè)置:在默認(rèn)情況下,Nginx 可能會(huì)將 PID 文件放在如
/var/run/nginx.pid
的系統(tǒng)運(yùn)行目錄中,但這可能會(huì)因操作系統(tǒng)或安裝方式的不同而有所變化,windows下則存放在程序所在目錄的的logs目錄。
【注意事項(xiàng)】
- 路徑選擇:指定的路徑應(yīng)該是一個(gè)可寫目錄,并且運(yùn)行 Nginx 的用戶對該文件有讀寫權(quán)限。
- 重啟和停止服務(wù):通過 PID 文件,可以方便地使用如
nginx -s stop
或nginx -s reload
命令來控制 Nginx 服務(wù)的啟動(dòng)和停止。 - 多實(shí)例運(yùn)行:如果你在同一臺(tái)服務(wù)器上運(yùn)行多個(gè) Nginx 實(shí)例,每個(gè)實(shí)例的 PID 文件應(yīng)存放在不同的路徑,以避免沖突。
events 塊
worker_connections
定義單個(gè)工作進(jìn)程可以打開的最大連接數(shù)。
【參數(shù)說明】
- 默認(rèn)值:默認(rèn)情況下,
worker_connections
被設(shè)置為 1024。 - 設(shè)置建議:在高并發(fā)場景下,可能需要增加此值以允許更多的并發(fā)連接。
【注意事項(xiàng)】
- 內(nèi)存考量:每個(gè)連接會(huì)占用一定的內(nèi)存資源。連接數(shù)的增加直接影響到內(nèi)存的使用量,因?yàn)槊總€(gè)連接都需要為其分配讀寫事件和相關(guān)數(shù)據(jù)結(jié)構(gòu)。
- 操作系統(tǒng)限制:操作系統(tǒng)對進(jìn)程可以打開的文件描述符數(shù)量有限制,這通常通過
ulimit -n
命令查看(通常為65536)。Nginx 的worker_rlimit_nofile
指令可以用來設(shè)置工作進(jìn)程打開文件描述符的上限,以避免超出系統(tǒng)限制。 - 性能監(jiān)控:在調(diào)整
worker_connections
參數(shù)后,應(yīng)監(jiān)控 Nginx 的性能和資源使用情況,確保配置更改達(dá)到預(yù)期效果,并未對服務(wù)器穩(wěn)定性造成負(fù)面影響。 - 錯(cuò)誤處理:如果
worker_connections
設(shè)置得太低,可能會(huì)導(dǎo)致連接數(shù)超過限制,從而出現(xiàn) “connection reset by peer” 錯(cuò)誤或在日志中記錄警告信息。
【相關(guān)參數(shù)】
events塊下還可以設(shè)置一個(gè)worker_rlimit_nofile
參數(shù),與worker_connections存在差異:
- worker_connections:
- 這個(gè)參數(shù)定義了每個(gè)工作進(jìn)程(worker process)可以打開的最大連接數(shù)。
- 它是
events
塊中的一個(gè)指令,用于設(shè)置 Nginx 能夠同時(shí)處理的活動(dòng)連接數(shù)。 worker_connections
的值通常根據(jù)服務(wù)器的硬件能力(如 CPU 核心數(shù)和內(nèi)存大小)來設(shè)定。例如:worker_connections 1024;
表示每個(gè)工作進(jìn)程可以處理的最大連接數(shù)為 1024。
- worker_rlimit_nofile:
- 這個(gè)參數(shù)用于設(shè)置每個(gè)工作進(jìn)程可以打開的文件描述符的最大數(shù)量。
- 它是
events
塊中的一個(gè)指令,用于配置文件描述符的限制,這包括套接字連接、文件等。 worker_rlimit_nofile
的值應(yīng)該設(shè)置得比worker_connections
大一些,以確保除了連接之外,Nginx 還有額外的文件描述符用于日志文件、臨時(shí)文件等。- 例如:
worker_rlimit_nofile 2048;
表示每個(gè)工作進(jìn)程可以打開的最大文件描述符數(shù)量為 2048。
區(qū)別:
worker_connections
主要關(guān)注網(wǎng)絡(luò)連接的數(shù)量,即每個(gè)工作進(jìn)程能夠同時(shí)處理的客戶端連接數(shù)。worker_rlimit_nofile
更廣泛地關(guān)注所有類型的文件描述符,包括網(wǎng)絡(luò)連接、日志文件、配置文件等。
配置建議:
- 通常建議將
worker_rlimit_nofile
設(shè)置為比worker_connections
高一些的值,以確保 Nginx 有足夠的文件描述符用于其操作。例如,如果worker_connections
設(shè)置為 1024,可以將worker_rlimit_nofile
設(shè)置為 2048 或更高。 - 這些參數(shù)的設(shè)置應(yīng)基于服務(wù)器的硬件規(guī)格和預(yù)期的負(fù)載。在配置時(shí),還需要考慮操作系統(tǒng)級(jí)別的文件描述符限制,確保 Nginx 的設(shè)置不超過操作系統(tǒng)的限制。
通過合理配置這兩個(gè)參數(shù),可以優(yōu)化 Nginx 服務(wù)器的性能和資源利用率。
http 塊
include mime.types;
這是一句引用指令,引入mime.types文件的內(nèi)容,沒有路徑意味著同路徑,即nginx根目錄下conf目錄下有個(gè)名字為mime.types的文件,該文件定義了HTTP響應(yīng)的MIME類型與文件擴(kuò)展名之間的映射關(guān)系,內(nèi)容如下:
types {text/html html htm shtml;text/css css;text/xml xml;image/gif gif;image/jpeg jpeg jpg;application/javascript js;application/atom+xml atom;application/rss+xml rss;text/mathml mml;text/plain txt;text/vnd.sun.j2me.app-descriptor jad;text/vnd.wap.wml wml;text/x-component htc;image/avif avif;image/png png;image/svg+xml svg svgz;image/tiff tif tiff;image/vnd.wap.wbmp wbmp;image/webp webp;image/x-icon ico;image/x-jng jng;image/x-ms-bmp bmp;font/woff woff;font/woff2 woff2;application/java-archive jar war ear;application/json json;application/mac-binhex40 hqx;application/msword doc;application/pdf pdf;application/postscript ps eps ai;application/rtf rtf;application/vnd.apple.mpegurl m3u8;application/vnd.google-earth.kml+xml kml;application/vnd.google-earth.kmz kmz;application/vnd.ms-excel xls;application/vnd.ms-fontobject eot;application/vnd.ms-powerpoint ppt;application/vnd.oasis.opendocument.graphics odg;application/vnd.oasis.opendocument.presentation odp;application/vnd.oasis.opendocument.spreadsheet ods;application/vnd.oasis.opendocument.text odt;application/vnd.openxmlformats-officedocument.presentationml.presentationpptx;application/vnd.openxmlformats-officedocument.spreadsheetml.sheetxlsx;application/vnd.openxmlformats-officedocument.wordprocessingml.documentdocx;application/vnd.wap.wmlc wmlc;application/wasm wasm;application/x-7z-compressed 7z;application/x-cocoa cco;application/x-java-archive-diff jardiff;application/x-java-jnlp-file jnlp;application/x-makeself run;application/x-perl pl pm;application/x-pilot prc pdb;application/x-rar-compressed rar;application/x-redhat-package-manager rpm;application/x-sea sea;application/x-shockwave-flash swf;application/x-stuffit sit;application/x-tcl tcl tk;application/x-x509-ca-cert der pem crt;application/x-xpinstall xpi;application/xhtml+xml xhtml;application/xspf+xml xspf;application/zip zip;application/octet-stream bin exe dll;application/octet-stream deb;application/octet-stream dmg;application/octet-stream iso img;application/octet-stream msi msp msm;audio/midi mid midi kar;audio/mpeg mp3;audio/ogg ogg;audio/x-m4a m4a;audio/x-realaudio ra;video/3gpp 3gpp 3gp;video/mp2t ts;video/mp4 mp4;video/mpeg mpeg mpg;video/quicktime mov;video/webm webm;video/x-flv flv;video/x-m4v m4v;video/x-mng mng;video/x-ms-asf asx asf;video/x-ms-wmv wmv;video/x-msvideo avi;
}
default_type
default_type
主要用于設(shè)置默認(rèn)的 MIME 類型。當(dāng) Nginx 收到一個(gè)請求,且該請求的文件擴(kuò)展名在 mime.types
文件中沒有對應(yīng)的 MIME 類型定義時(shí),Nginx 將使用 default_type
指定的類型來處理該文件。
【參數(shù)說明】
- 默認(rèn)值:如果不顯式設(shè)置
default_type
,則 Nginx 的默認(rèn)值通常是text/plain
,意味著未明確指定類型的文件將被當(dāng)作純文本處理。 - 設(shè)置建議:如果希望所有的未知類型文件都被客戶端作為二進(jìn)制流處理,可以設(shè)置
default_type application/octet-stream;
,這通常用于強(qiáng)制客戶端下載文件而不是嘗試打開或顯示它們。
access_log
訪問日志記錄了客戶端對服務(wù)器的每次請求的詳細(xì)信息,包括請求的 URL、客戶端 IP、請求時(shí)間、響應(yīng)狀態(tài)碼等,這對于分析流量和監(jiān)控網(wǎng)站活動(dòng)非常有用。
該參數(shù)指定訪問日志的存放路徑。
【參數(shù)說明】
- 默認(rèn)值:Nginx 的默認(rèn)訪問日志文件路徑通常是
/var/log/nginx/access.log
,并且默認(rèn)日志格式是combined
(Nginx預(yù)置格式的一種),這種格式記錄了較為詳細(xì)的信息。 - 日志格式:可以通過
log_format
指令定義日志的格式。常見的格式有default
、combined
、x-forwarded-for
等,也可以自定義格式。 - 配置方法:可以在 Nginx 配置文件的
http
、server
或location
塊中設(shè)置access_log
。例如:
access_log /path/to/your/access.log combined;
這表示將訪問日志記錄到指定路徑的文件中,并使用 combined
日志格式。
【注意事項(xiàng)】
- 自定義日志格式:除了預(yù)置的日志格式外,還可以使用
log_format
指令來自定義日志的格式,例如:
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent"';
上面定義了一種新的日志格式,并將其命名為“main”,然后可以指定日志使用這個(gè)格式:
access_log /path/to/your/access.log main;
- 日志切割:可以通過設(shè)置
access_log
的buffer
參數(shù)來控制日志的切割。例如:
access_log /path/to/your/access.log combined buffer=16k flush=1m;
這里 buffer=16k
表示每個(gè)緩沖區(qū)的大小為 16KB,flush=1m
表示每分鐘刷新一次緩沖區(qū),即先將日志寫到內(nèi)存中,然后批量持久化到磁盤,從而提升性能。
- 多日志文件:可以在同一個(gè)
server
或location
塊中定義多個(gè)access_log
,將日志輸出到不同的文件或使用不同的格式。 - 優(yōu)化性能:在高流量的網(wǎng)站上,寫入訪問日志可能會(huì)對性能產(chǎn)生影響。可以通過設(shè)置
open_file_cache
指令來優(yōu)化文件打開操作,減少日志寫入的開銷。
sendfile
用于指定傳輸文件的處理模式。當(dāng)啟用 sendfile
時(shí),Nginx 會(huì)直接將文件內(nèi)容從磁盤發(fā)送到網(wǎng)絡(luò),而不需要將文件內(nèi)容先讀入到緩沖區(qū)(內(nèi)存)中。這可以減少數(shù)據(jù)復(fù)制的開銷,提高文件傳輸效率。使用 sendfile
可以減少內(nèi)存的使用,并顯著提高 Nginx 服務(wù)器在傳輸靜態(tài)文件時(shí)的性能。
【參數(shù)說明】
- 默認(rèn)值:在 Nginx 的默認(rèn)配置中,
sendfile
參數(shù)通常被設(shè)置為on
,意味著啟用了高效的文件傳輸方式。 - 設(shè)置建議:對于靜態(tài)文件服務(wù)器,建議保持
sendfile
為on
,以提高性能。然而,在某些特定場景下,如需要對文件內(nèi)容進(jìn)行處理(例如,SSL 加密或壓縮)時(shí),可能需要將其設(shè)置為off
。
【注意事項(xiàng)】
- 在某些情況下,如果 Nginx 配置了
sendfile
為on
,但實(shí)際并未使用sendfile
系統(tǒng)調(diào)用,可能是因?yàn)椴僮飨到y(tǒng)不支持或配置不當(dāng),可以通過 Nginx 的錯(cuò)誤日志來檢查是否有相關(guān)警告。 <font style="color:rgb(6, 6, 7);">sendfile</font>
系統(tǒng)調(diào)用在不同的操作系統(tǒng)上支持程度不同。在 Linux 上,<font style="color:rgb(6, 6, 7);">sendfile</font>
是高效的,而在其他系統(tǒng)上可能不是。Windows 版本的 Nginx 支持<font style="color:rgb(6, 6, 7);">sendfile</font>
,但由于 Windows 版本的 Nginx 僅使用<font style="color:rgb(6, 6, 7);">select()</font>
和<font style="color:rgb(6, 6, 7);">poll()</font>
作為連接處理方法,因此可能無法達(dá)到與 Linux 版本相同的高性能和可擴(kuò)展性。<font style="color:rgb(6, 6, 7);">sendfile</font>
參數(shù)可以在 Nginx 配置文件的<font style="color:rgb(6, 6, 7);">http</font>
塊、<font style="color:rgb(6, 6, 7);">server</font>
塊或<font style="color:rgb(6, 6, 7);">location</font>
塊中設(shè)置。在不同塊中的設(shè)置將影響不同的配置范圍。
tcp_nopush
在 TCP 協(xié)議中,數(shù)據(jù)傳輸通常是以流的形式進(jìn)行的,這意味著數(shù)據(jù)可以被分割成多個(gè)包發(fā)送?!皌cp_nopush” 選項(xiàng)允許開發(fā)者控制數(shù)據(jù)的發(fā)送時(shí)機(jī),從而優(yōu)化網(wǎng)絡(luò)傳輸?shù)男?。例?#xff0c;在某些應(yīng)用中,可能希望將多個(gè)小的數(shù)據(jù)包合并成一個(gè)大的數(shù)據(jù)包發(fā)送,以減少網(wǎng)絡(luò)開銷和提高傳輸效率。使用 “tcp_nopush” 可以推遲數(shù)據(jù)的發(fā)送,直到有足夠的數(shù)據(jù)量再進(jìn)行發(fā)送。
【參數(shù)說明】
- 默認(rèn)值:在 Nginx 的默認(rèn)配置中,
tcp_nopush
通常被設(shè)置為off
,這意味著 tcp_nopush 選項(xiàng)默認(rèn)是禁用的。 - 設(shè)置建議:如果你的應(yīng)用發(fā)送的響應(yīng)頭較小,而響應(yīng)體較大,啟用
tcp_nopush
可以提高性能,因?yàn)樗试S Nginx 等待更多的數(shù)據(jù)被寫入緩沖區(qū)后再發(fā)送,從而減少網(wǎng)絡(luò)請求的次數(shù)。 - 配置方法:可以在 Nginx 配置文件的
http
、server
或location
塊中設(shè)置tcp_nopush
。
【注意事項(xiàng)】
- 與
sendfile
** 的關(guān)系**:tcp_nopush
通常與sendfile
指令一起使用。sendfile
用于加速靜態(tài)文件的傳輸,而tcp_nopush
可以進(jìn)一步優(yōu)化數(shù)據(jù)的發(fā)送過程。 - 性能影響:啟用
tcp_nopush
可能會(huì)增加內(nèi)存的使用量,因?yàn)閿?shù)據(jù)在發(fā)送前會(huì)在緩沖區(qū)中停留更長時(shí)間。因此,在內(nèi)存資源受限的環(huán)境中使用時(shí)需要謹(jǐn)慎。 - 適用場景:
tcp_nopush
適用于靜態(tài)內(nèi)容的傳輸,特別是當(dāng)文件較大時(shí),可以減少網(wǎng)絡(luò)往返次數(shù),提高傳輸效率。 - tcp_nodelay:與tcp_nopush的功能相反,確保數(shù)據(jù)立即發(fā)送而不是等待,這有助于減少網(wǎng)絡(luò)延遲,默認(rèn)值為開啟。
gzip
用于開啟或關(guān)閉 Gzip 壓縮功能,啟用后將幫助減少傳輸?shù)臄?shù)據(jù)大小,提高頁面加載速度。
【參數(shù)說明】:
- **默認(rèn)值: **off,未開啟,設(shè)置為on打開。
- 配置方法:可以在 Nginx 配置文件的
http
、server
或location
塊中設(shè)置
【注意事項(xiàng)】
Nginx提供了大量相關(guān)參數(shù),具體如下:
- 壓縮級(jí)別:
通過gzip_comp_level
設(shè)置壓縮級(jí)別,范圍從 1 到 9。級(jí)別 1 提供最快的壓縮速度,而級(jí)別 9 提供最佳的壓縮率。通常推薦使用級(jí)別 3 或 6,以在壓縮效果和服務(wù)器 CPU 負(fù)載之間取得平衡。 - 最小壓縮長度:
使用gzip_min_length
指定進(jìn)行壓縮的響應(yīng)數(shù)據(jù)的最小字節(jié)數(shù)。例如,gzip_min_length 1k;
意味著只有超過 1KB 的數(shù)據(jù)才會(huì)被壓縮,這有助于避免小文件壓縮后體積反而增加。 - 緩沖區(qū)設(shè)置:
gzip_buffers
定義了用于壓縮的緩沖區(qū)數(shù)量和大小,例如gzip_buffers 4 16k;
指定了 4 個(gè) 16KB 的緩沖區(qū)。 - HTTP 版本:
gzip_http_version 1.1;
確保即使在 HTTP/1.1 下能進(jìn)行壓縮,因?yàn)樵缙诘?HTTP 版本可能不支持 Gzip 壓縮。 - 壓縮 MIME 類型:
gzip_types
指定了應(yīng)該被壓縮的 MIME 類型。建議包括text/plain
、application/x-javascript
、text/css
等常見類型。 - Vary 響應(yīng)頭:
設(shè)置gzip_vary on;
會(huì)向響應(yīng)頭中添加 “Vary: Accept-Encoding”,這有助于緩存服務(wù)器根據(jù)請求頭中的 Accept-Encoding 字段緩存不同版本的響應(yīng)。 - 代理壓縮設(shè)置:
gzip_proxied
用于作為反向代理時(shí)的壓縮設(shè)置。例如,gzip_proxied expired no-cache no-store private auth;
表示在特定緩存頭存在時(shí)啟用壓縮。 - 禁用 Gzip 壓縮:
gzip_disable
可以用于指定不需要 Gzip 壓縮的 User-Agent。例如,gzip_disable "MSIE [1-6]\.";
可以防止為不支持 Gzip 的舊版 IE 瀏覽器啟用壓縮。
通過這些配置,可以確保 Nginx 的 Gzip 壓縮功能得到有效利用,從而提升網(wǎng)站的性能和用戶體驗(yàn)。
gzip壓縮開啟前后對比圖,效果還是很明顯的,如下圖:
server 塊
在http節(jié)點(diǎn)下,可以配置一個(gè)或多個(gè)server塊。
server相當(dāng)于虛擬主機(jī),即可以通過nginx,實(shí)現(xiàn)在一臺(tái)服務(wù)器上部署多個(gè)web站點(diǎn)的目的。
listen
- 基本功能:
<font style="color:rgb(6, 6, 7);">listen</font>
指令告訴 Nginx 在指定的端口和(可選的)地址上監(jiān)聽傳入的連接請求。
- 默認(rèn)值:
- 如果沒有指定
<font style="color:rgb(6, 6, 7);">listen</font>
參數(shù),Nginx 默認(rèn)監(jiān)聽端口 80(對于 HTTP)和 443(對于 HTTPS)。
- 如果沒有指定
- 配置方法:
<font style="color:rgb(6, 6, 7);">listen</font>
參數(shù)通常在<font style="color:rgb(6, 6, 7);">server</font>
塊中設(shè)置。例如:
server {listen 80;server_name example.com;...
}
- 端口號(hào):
- 必須指定端口號(hào),如
<font style="color:rgb(6, 6, 7);">80</font>
或<font style="color:rgb(6, 6, 7);">443</font>
。端口號(hào)是客戶端用于連接到服務(wù)器的網(wǎng)絡(luò)端口。
- 必須指定端口號(hào),如
- 地址:
- 可以指定監(jiān)聽的 IP 地址,如
<font style="color:rgb(6, 6, 7);">listen 192.168.1.1:80;</font>
。如果省略地址,Nginx 將監(jiān)聽所有 IPv4 地址。
- 可以指定監(jiān)聽的 IP 地址,如
- IPv6 支持:
- 對于 IPv6 地址,可以使用
<font style="color:rgb(6, 6, 7);">[::]:80</font>
來監(jiān)聽所有 IPv6 地址的指定端口。
- 對于 IPv6 地址,可以使用
- 多個(gè)監(jiān)聽端口:
- 可以在同一個(gè)
<font style="color:rgb(6, 6, 7);">server</font>
塊中使用多個(gè)<font style="color:rgb(6, 6, 7);">listen</font>
指令來監(jiān)聽多個(gè)端口,或者在不同的<font style="color:rgb(6, 6, 7);">server</font>
塊中監(jiān)聽不同的端口。
- 可以在同一個(gè)
- SSL/TLS:
- 當(dāng)使用
<font style="color:rgb(6, 6, 7);">listen</font>
參數(shù)監(jiān)聽 443 端口時(shí),通常與 SSL/TLS 配置結(jié)合使用,以提供 HTTPS 服務(wù)。需要確保配置了正確的 SSL 證書和私鑰。
- 當(dāng)使用
配置示例
監(jiān)聽 IPv4 和 IPv6 地址的 HTTP 和 HTTPS 端口:
server {listen 80;listen [::]:80;server_name example.com;...
}server {listen 443 ssl;listen [::]:443 ssl;server_name example.com;ssl_certificate /path/to/cert.pem;ssl_certificate_key /path/to/key.pem;...
}
重定向配置
可以使用 <font style="color:rgb(6, 6, 7);">return</font>
指令在 <font style="color:rgb(6, 6, 7);">server</font>
塊中重定向 HTTP 請求到 HTTPS。例如:
server {listen 80;server_name www.baidu.com;return 301 https://$server_name$request_uri;
}
這樣用戶請求地址若為http://www.baidu.com,會(huì)自動(dòng)重定向到https://www.baidu.com。
server_name
用于定義當(dāng)前 server 塊處理的域名或域名列表。
- 基本功能:
server_name
指令用于指定當(dāng)前 server 塊應(yīng)響應(yīng)的域名。當(dāng)一個(gè)請求到達(dá) Nginx 時(shí),Nginx 會(huì)檢查請求的 Host 頭部信息,并嘗試匹配一個(gè) server 塊。
- 語法格式:
server_name
可以包含一個(gè)或多個(gè)域名,用空格分隔。例如:
server {server_name example.com www.example.com;...
}
- 通配符:
- 可以使用
*
作為通配符來匹配任意數(shù)量的字符。例如:
- 可以使用
server {server_name *.example.com;...
}
這將匹配 blog.example.com
、shop.example.com
等所有以 .example.com
結(jié)尾的域名。
- 正則表達(dá)式:
- 可以使用
~
或~*
來指定一個(gè)正則表達(dá)式。~
表示區(qū)分大小寫的匹配,而~*
表示不區(qū)分大小寫的匹配。例如:
- 可以使用
server {server_name ~^www\..+\.example\.com$;...
}
- ~^: 這表示匹配開始的位置,~是正則表達(dá)式的匹配符號(hào),^表示匹配字符串的開始。
- www.: 匹配文字"www.",其中的反斜杠</font>用于轉(zhuǎn)義點(diǎn).,因?yàn)辄c(diǎn)在正則表達(dá)式中是一個(gè)特殊字符,表示任意字符,所以我們需要用</font>來告訴它我們想匹配實(shí)際的點(diǎn)字符。
- .+: 匹配一個(gè)或多個(gè)任意字符,.表示任意單個(gè)字符,+表示一個(gè)或多個(gè)前面的字符。
- .example.com: 匹配文字".example.com",同樣地,點(diǎn).被轉(zhuǎn)義了,因?yàn)槲覀冃枰ヅ鋵?shí)際的點(diǎn)字符。
- $: 表示匹配字符串的結(jié)尾。
-
默認(rèn) server 塊:
- 如果沒有匹配到任何 server 塊,Nginx 會(huì)使用一個(gè)沒有定義
server_name
的默認(rèn) server 塊來響應(yīng)請求。
- 如果沒有匹配到任何 server 塊,Nginx 會(huì)使用一個(gè)沒有定義
-
端口敏感性:
server_name
指令是端口敏感的。如果在同一端口上配置了多個(gè) server 塊,每個(gè) server 塊都需要明確指定server_name
。
-
重定向:
- 可以使用
server_name
和return
指令實(shí)現(xiàn)基于域名的重定向。例如:
- 可以使用
server {listen 80;server_name olddomain.com;return 301 https://newdomain.com$request_uri;
}
基于該點(diǎn),即使用戶在瀏覽器輸入的是http,系統(tǒng)會(huì)自動(dòng)重定向到https,即實(shí)現(xiàn)了使用https作為系統(tǒng)統(tǒng)一入口的功能。
- 配置優(yōu)先級(jí):
- 如果多個(gè) server 塊配置了相同的
server_name
,Nginx 會(huì)根據(jù)配置文件中的順序選擇第一個(gè)匹配的 server 塊。
- 如果多個(gè) server 塊配置了相同的
- 使用場景:
server_name
常用于處理虛擬主機(jī),即一臺(tái)服務(wù)器托管多個(gè)域名的情況。每個(gè)域名可以有不同的配置,如根目錄、日志文件等。
- 配置示例:
- 為不同的域名配置不同的 server 塊:
server {listen 80;server_name site1.com;root /path/to/site1;...
}server {listen 80;server_name site2.com;root /path/to/site2;...
}
通過合理使用 server_name
指令,可以實(shí)現(xiàn)基于域名的請求路由和處理,為不同的網(wǎng)站提供定制化的服務(wù)和配置。
root
用于定義web服務(wù)的根目錄。這個(gè)指令指定了 Nginx 從哪里提供文件,比如 HTML、圖片、樣式表和腳本文件。
- 基本功能:
root
指令告訴 Nginx 在處理請求時(shí)應(yīng)該從哪個(gè)目錄提供文件。
- 語法格式:
root
后面直接跟文件系統(tǒng)的路徑。例如:
root /path/to/your/root;
路徑可以是絕對路徑,也可以是相對于 nginx.conf
配置文件所在目錄的相對路徑。
- 配置位置:
root
可以在http
、server
或location
塊中設(shè)置。在不同的塊中設(shè)置會(huì)影響不同的配置范圍。
- 默認(rèn)值:
- 如果沒有明確設(shè)置
root
,Nginx 將使用編譯時(shí)定義的默認(rèn)根目錄(Nginx所在目錄下的html目錄)。
- 如果沒有明確設(shè)置
- 路徑解析:
- Nginx 會(huì)將
root
指令中的路徑與下文中的location
塊中定義的 URI 組合,形成完整的文件路徑。
- Nginx 會(huì)將
- 配置示例:
- 在
server
塊中設(shè)置根目錄:
- 在
server {listen 80;server_name example.com;root /path/to/your/root;index index.html;
}
- 與 location 結(jié)合使用:
root
可以與location
塊結(jié)合使用,為不同的路徑提供不同的根目錄。例如:
location /images/ {root /path/to/images;
}
通過合理配置 root
指令,可以確保 Nginx 服務(wù)器正確地提供靜態(tài)內(nèi)容,同時(shí)提高網(wǎng)站的可維護(hù)性和安全性。
index
用于定義在請求特定位置但沒有明確指定文件名時(shí),Nginx 應(yīng)該默認(rèn)提供哪些文件,即通常所說的默認(rèn)首頁。
- 基本功能:
- 當(dāng)客戶端發(fā)起一個(gè)對目錄的請求,而不是對特定文件的請求時(shí),
index
指令告訴 Nginx 返回哪個(gè)文件。
- 當(dāng)客戶端發(fā)起一個(gè)對目錄的請求,而不是對特定文件的請求時(shí),
- 語法格式:
index
后面可以跟一個(gè)或多個(gè)文件名,用空格分隔。例如:
index index.html index.htm;
Nginx 將按順序嘗試提供這些文件,上述配置將首先嘗試提供 index.html
,如果沒有找到,再嘗試 index.htm
。
- 默認(rèn)值:
- 如果沒有設(shè)置
index
指令,Nginx 將默認(rèn)嘗試提供index.html
文件。
- 如果沒有設(shè)置
- 配置位置:
index
可以在http
、server
或location
塊中設(shè)置。在location
塊中設(shè)置時(shí),將覆蓋上級(jí)塊中的設(shè)置。
- 配置示例:
- 設(shè)置默認(rèn)首頁為
index.html
:
- 設(shè)置默認(rèn)首頁為
server {listen 80;server_name example.com;location / {index index.html;}
}
通過合理使用 index
指令,可以確保當(dāng)用戶訪問網(wǎng)站的根目錄或子目錄時(shí),能夠看到合適的默認(rèn)頁面,從而提供更好的導(dǎo)航體驗(yàn)和網(wǎng)站可用性。
charset
用于指定對特定類型的響應(yīng)內(nèi)容應(yīng)用字符集轉(zhuǎn)換。這通常用于確保發(fā)送給客戶端的內(nèi)容具有正確的字符編碼。
- 基本功能:
charset
指令定義了響應(yīng)內(nèi)容的默認(rèn)字符編碼。當(dāng)響應(yīng)內(nèi)容的Content-Type
頭部包含charset
參數(shù)時(shí),Nginx 默認(rèn)不會(huì)修改它。如果響應(yīng)頭中只有Content-Type
而沒有charset
,Nginx 將添加charset
指令中指定的字符集。
- 配置方法:
charset
可以在http
、server
或location
塊中設(shè)置。例如:
charset utf-8;
- 指定的字符集應(yīng)該是有效的字符編碼名稱,如 `utf-8`、`iso-8859-1` 等。
- 默認(rèn)值:
- 如果沒有設(shè)置
charset
指令,Nginx 不會(huì)自動(dòng)添加字符集到響應(yīng)頭中。
- 如果沒有設(shè)置
- 類型指定:
charset
可以指定為所有響應(yīng)的默認(rèn)字符集,或者僅用于特定的 MIME 類型。例如,可以只為text
類型的響應(yīng)設(shè)置字符集:
charset text/plain utf-8;
- 配置示例:
- 為所有響應(yīng)設(shè)置默認(rèn)字符集:
http {charset utf-8;
}
- 為特定 MIME 類型設(shè)置字符集:
server {location / {charset text/html utf-8;}
}
通過合理配置 charset
參數(shù),可以確保客戶端正確解析響應(yīng)內(nèi)容的字符編碼,避免出現(xiàn)亂碼或其他顯示問題。這對于國際化站點(diǎn)尤為重要。
error_page
用于定義特定錯(cuò)誤代碼的自定義響應(yīng)頁面的指令。
- 基本功能:
error_page
指令允許你為特定的 HTTP 錯(cuò)誤代碼指定一個(gè)自定義的錯(cuò)誤頁面。當(dāng)發(fā)生這些錯(cuò)誤時(shí),Nginx 將顯示你指定的頁面或重定向到你指定的 URL。
- 語法格式:
error_page
的基本語法是指定一個(gè)錯(cuò)誤代碼,后跟一個(gè)可選的響應(yīng)狀態(tài)碼和 URI。例如:
error_page 404 /404.html;
- 錯(cuò)誤代碼:
- 可以為多種 HTTP 錯(cuò)誤代碼定義自定義頁面,如 404(未找到)、403(禁止訪問)、500(內(nèi)部服務(wù)器錯(cuò)誤)等。
- 重寫響應(yīng)狀態(tài)碼:
- 在某些情況下,你可能希望在返回自定義錯(cuò)誤頁面時(shí)使用不同的 HTTP 狀態(tài)碼??梢酝ㄟ^在
error_page
指令中指定來實(shí)現(xiàn)。例如:
- 在某些情況下,你可能希望在返回自定義錯(cuò)誤頁面時(shí)使用不同的 HTTP 狀態(tài)碼??梢酝ㄟ^在
error_page 404 =200 /custom_404.html;
服務(wù)端返回了404響應(yīng)狀態(tài)碼時(shí),由Nginx重寫為200,并重定向到 /404.html
頁面。
- 使用變量:
- 自定義錯(cuò)誤頁面的 URI 中可以使用 Nginx 內(nèi)置變量,如
$uri
(請求的 URI)和$args
(請求的參數(shù)字符串)。
- 自定義錯(cuò)誤頁面的 URI 中可以使用 Nginx 內(nèi)置變量,如
- 配置示例:
- 為多個(gè)錯(cuò)誤代碼定義相同的自定義頁面:
error_page 404 502 503 /errors/404.html;
- 使用變量定義錯(cuò)誤頁面:
error_page 404 =200 /not_found?uri=$uri&args=$args;
通過合理使用 error_page
指令,可以提供更友好的用戶體驗(yàn),并且在發(fā)生錯(cuò)誤時(shí)提供更多的上下文信息或重定向用戶到更適當(dāng)?shù)奈恢谩?/p>
https
大部分配置跟http都一致,只是監(jiān)聽的默認(rèn)端口,由80變更為了443,同時(shí)增加了證書配置,示例如下:
server {#SSL 默認(rèn)訪問端口號(hào)為 443listen 443 ssl; #請?zhí)顚懡壎ㄗC書的域名server_name meet.popsoft.tech; #證書文件的絕對路徑。ssl_certificate C:\\publish\\cer\\meet.popsoft.tech_bundle.crt; #私鑰文件的絕對路徑。ssl_certificate_key C:\\publish\\cer\\meet.popsoft.tech.key; #會(huì)話時(shí)長ssl_session_timeout 5m;#協(xié)議配置ssl_protocols TLSv1.2 TLSv1.3; #配置加密套件,寫法遵循 openssl 標(biāo)準(zhǔn)。ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #優(yōu)先考慮服務(wù)器端的加密套件偏好ssl_prefer_server_ciphers on;……}
注意listen的寫法,需要在端口號(hào)后加ssl。
ssl_certificate屬性指定證書文件的地址。
ssl_certificate_key屬性指定證書密鑰的地址。
location
核心的指令,用于定義請求的處理規(guī)則。
- 基本功能:
location
指令用于匹配請求的 URI(路徑部分)或命名位置,并根據(jù)匹配結(jié)果應(yīng)用不同的配置。
- 語法格式:
location
后面跟隨一個(gè) URI 模式,然后是一個(gè)大括號(hào){}
包含的配置塊。例如:
location / {root /path/to/directory;index index.html;
}
- try_files 指令:
- 嘗試按順序查找并使用列表中的文件來響應(yīng)客戶端的請求,可結(jié)合nginx內(nèi)置變量使用,例如:
location / {try_files $uri $uri/ /index.html;
}
這個(gè)配置將首先嘗試提供請求的 URI,如果不存在,再嘗試提供 URI 的目錄索引,如果還是不存在,最后提供根目錄下的 index.html
文件。
- 精確匹配:
- 使用等號(hào)
=
后跟 URI 可以進(jìn)行精確匹配。例如,location = /
僅匹配根路徑。
- 使用等號(hào)
- 正則表達(dá)式匹配:
- 使用波浪線
~
開頭表示使用正則表達(dá)式匹配 URI。例如:
- 使用波浪線
location ~ \.php$ {fastcgi_pass backend;
}
~表示這是一個(gè)正則表達(dá)式匹配,.php是匹配PHP文件的正則表達(dá)式,$表示字符串的結(jié)尾,確保只有以.php結(jié)尾的URL才會(huì)被匹配。
- 前綴匹配:
- 沒有特殊字符的普通字符串將被視為前綴匹配。例如,
location /images/
將匹配以/images/
開頭的任何 URI。
- 沒有特殊字符的普通字符串將被視為前綴匹配。例如,
- 通配符匹配:
- 使用星號(hào)
*
作為通配符可以匹配任意字符。例如,location /images/*.jpg
匹配/images/
下的任何以.jpg
結(jié)尾的文件。
- 使用星號(hào)
- 地址重寫:
- 使用rewrite指令,可以重寫地址,如
location /pro/ { proxy_pass http://localhost:18080; rewrite "^/pro/(.*)$" /$1 break ;
}
"^/pro/(.*)$": 這是一個(gè)正則表達(dá)式,用來匹配URL。
- `^` 表示URL的開始。
- `/pro/` 是一個(gè)固定的字符串,表示URL中必須包含 "/pro/"。
- `(.*)` 是一個(gè)捕獲組,匹配 "/pro/" 后面的任何字符,直到URL的末尾。
- `$` 表示URL的結(jié)束。
/$1: 這指定了重寫的目標(biāo)URL。
- `$1` 是一個(gè)反向引用,引用了正則表達(dá)式中的第一個(gè)捕獲組(即 `^/pro/(.*)$` 中的 `(.*)`)。這意味著將URL中 "/pro/" 后面的部分替換為原始URL中 "/pro/" 后面的部分。
break: 這個(gè)指令告訴服務(wù)器在執(zhí)行完這條規(guī)則后停止進(jìn)一步的重寫處理。
這條規(guī)則的作用是將所有以 “/pro/” 開頭的URL重寫為只包含 “/pro/” 后面的部分,然后停止進(jìn)一步的URL重寫處理。
- 配置示例:
- 為靜態(tài)文件設(shè)置根目錄:
location /static/ {root /path/to/static/files;
}
- 為 PHP 文件設(shè)置 FastCGI 處理:
location ~ \.php$ {fastcgi_pass backend;include fastcgi_params;
}
- 優(yōu)先級(jí):
- 如果有多個(gè)
location
塊能夠匹配同一個(gè)請求,Nginx 將選擇具有最高優(yōu)先級(jí)的匹配。優(yōu)先級(jí)順序?yàn)?#xff1a;精確匹配 > 正則表達(dá)式匹配 > 通配符匹配 > 前綴匹配。
- 如果有多個(gè)
- 嵌套使用:
location
塊可以嵌套在其他location
塊中,以提供更具體的配置。
通過合理使用 location
指令,可以對不同的請求路徑應(yīng)用不同的處理規(guī)則,實(shí)現(xiàn)復(fù)雜的路由邏輯和內(nèi)容服務(wù)策略。
如何配置負(fù)載均衡?
配置負(fù)載均衡主要涉及將客戶端的請求分發(fā)到多個(gè)后端服務(wù)器上。
負(fù)載均衡需要配置一個(gè) upstream
塊,該塊可以放在http中,也可以放到server塊中。
upstream
用于定義負(fù)載均衡服務(wù)器組的部分,它允許你將客戶端請求分發(fā)到多個(gè)后端服務(wù)器上。
- 基本功能:
upstream
塊允許你指定一個(gè)服務(wù)器組,Nginx 將使用這個(gè)組中的服務(wù)器來處理客戶端請求。
- 語法格式:
upstream
塊以關(guān)鍵字upstream
開始,后面跟著服務(wù)器組的名稱,大括號(hào){}
內(nèi)包含具體的服務(wù)器配置。例如:
upstream myapp {server backend1.example.com;server backend2.example.com;
}
- 服務(wù)器定義:
- 在
upstream
塊內(nèi),使用server
指令來指定后端服務(wù)器的地址和可選的配置參數(shù)。
- 在
- 與 location 塊結(jié)合使用:
- 在
server
塊中的location
塊里使用proxy_pass
指令來指定請求轉(zhuǎn)發(fā)到哪個(gè)upstream
組。
- 在
location / {proxy_pass http://myapp;}
通過合理配置 upstream
,可以有效地實(shí)現(xiàn)請求的負(fù)載均衡,提高應(yīng)用程序的可用性和伸縮性。不同的負(fù)載均衡算法適用于不同的場景,因此在選擇時(shí)需要考慮應(yīng)用程序的特性和服務(wù)器的負(fù)載情況。
負(fù)載均衡算法有哪些?
Nginx 支持多種負(fù)載均衡算法,可以根據(jù)不同的策略來分發(fā)請求到后端服務(wù)器。以下是一些常見的負(fù)載均衡算法及其配置方法:
- 輪詢(默認(rèn)):
- 輪詢算法是 Nginx 默認(rèn)的負(fù)載均衡方法,按照服務(wù)器的順序輪流分配請求。
- 無需特別配置,只需在
upstream
塊中列出所有服務(wù)器即可。
- 權(quán)重:
- 權(quán)重算法允許你為每個(gè)服務(wù)器指定一個(gè)權(quán)重值,不指定默認(rèn)權(quán)重值為1,權(quán)重越高的服務(wù)器將接收更多的請求。
- 在
server
指令中添加weight
參數(shù):
upstream myapp {server backend1.example.com weight=3;server backend2.example.com weight=2;server backend3.example.com weight=1;
}
換個(gè)角度看,輪詢相當(dāng)于權(quán)重的一種特例,即所有的服務(wù)器權(quán)重值都是1,所以收到的請求數(shù)量也是基本相同的。
- 最少連接:
- 最少連接算法將請求分配給當(dāng)前活躍連接數(shù)最少的服務(wù)器。
- 在
upstream
塊中添加least_conn
參數(shù):
upstream myapp {least_conn;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
- IP 哈希:
- IP 哈希算法根據(jù)客戶端 IP 地址進(jìn)行哈希,并將請求定向到同一個(gè)服務(wù)器,從而會(huì)話保持一致。
- 在
upstream
塊中添加ip_hash
參數(shù):
upstream myapp {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
- URL 哈希:
- URL 哈希算法根據(jù)請求的 URL 進(jìn)行哈希,并將請求定向到同一個(gè)服務(wù)器。
- 在
upstream
塊中添加hash
參數(shù),并在server
指令中添加hash
參數(shù):
upstream myapp {hash $request_uri;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
該模式的意義在于,相同的請求都會(huì)轉(zhuǎn)發(fā)到同一臺(tái)服務(wù)器,結(jié)合緩存使用可以提高緩存命中率,提升性能。
- 第三方模塊:
- Nginx 社區(qū)提供了一些第三方模塊,如
ngx_http_upstream_hash
,可以實(shí)現(xiàn)更復(fù)雜的負(fù)載均衡算法。
- Nginx 社區(qū)提供了一些第三方模塊,如
完整示例
server {upstream myapp {server backend1.example.com;server backend2.example.com;}location / {proxy_pass http://myapp;}
}
如何實(shí)現(xiàn)會(huì)話保持?
如系統(tǒng)的身份認(rèn)證基于session-cookie模式,在集群多節(jié)點(diǎn)模式下,如不做會(huì)話保持策略,則可能發(fā)生用戶在A節(jié)點(diǎn)登錄,后續(xù)請求被路由到B服務(wù)器,而B服務(wù)器中并沒有用戶的會(huì)話數(shù)據(jù),從而出現(xiàn)身份認(rèn)證失敗的問題。
針對上述問題,一種比較簡便的處理策略就是進(jìn)行會(huì)話保持,即確保某一用戶始終路由到某一個(gè)固定的后端服務(wù)節(jié)點(diǎn),也即上面說的,通過ip_hash的模式來實(shí)現(xiàn)。
upstream myapp {ip_hash;server backend1.example.com;server backend2.example.com;server backend3.example.com;
}
注:通常情況下,短時(shí)間內(nèi)用戶的ip地址是固定不變的,因此基于ip的hash算法,計(jì)算結(jié)果也會(huì)固定到某一個(gè)后端節(jié)點(diǎn)。
如何正常顯示ip地址?
通過nginx進(jìn)行負(fù)載均衡時(shí),系統(tǒng)獲取客戶端ip地址,默認(rèn)情況下會(huì)顯示為127.0.0.1或0:0:0:0:0:0:0:1,如下圖所示:
需要增加以下配置,使用proxy_set_header指令來將源ip地址傳遞,如下:
upstream myapp {server backend1.example.com;server backend2.example.com;
}server {listen 80;location / {proxy_pass http://myapp;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}
這里有兩種場景,一種是請求鏈路中無代理,通過$remote_addr可以拿到請求的源ip地址,然后通過指令proxy_set_header X-Real-IP r e m o t e a d d r , 將 其 放 到 h t t p h e a d e r 中 的 X ? R e a l ? I P 屬 性 中 ; 另 一 種 是 請 求 鏈 路 中 有 代 理 , 這 時(shí) 候 則 使 用 內(nèi) 置 變 量 remote_addr,將其放到http header中的X-Real-IP屬性中;另一種是請求鏈路中有代理,這時(shí)候則使用內(nèi)置變量 remotea?ddr,將其放到httpheader中的X?Real?IP屬性中;另一種是請求鏈路中有代理,這時(shí)候則使用內(nèi)置變量proxy_add_x_forwarded_for,它包含了原始請求的 X-Forwarded-For
頭信息(如果有的話),后面附加了當(dāng)前客戶端的 IP 地址,這樣可以確保即使請求經(jīng)過了多個(gè)代理,原始客戶端的 IP 地址也不會(huì)丟失。
應(yīng)用系統(tǒng)獲取請求源ip地址時(shí),也需要按約定處理,以java為例,代碼如下:
/*** 獲取當(dāng)前請求者IP地址** @return*/public static String getRemoteAddr() {String ip = "";if (RequestContextHolder.getRequestAttributes() != null) {ServletRequestAttributes requestAttributes =(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();if (requestAttributes != null) {HttpServletRequest request = requestAttributes.getRequest();ip = request.getHeader("x-forwarded-for");if (StringUtils.isNotBlank(ip) && !UNKNOWN.equalsIgnoreCase(ip)) {if (ip.indexOf(COMMA) != -1) {ip = ip.substring(0, ip.indexOf(","));}}if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getHeader("X-Real-IP");}if (StringUtils.isBlank(ip) || UNKNOWN.equalsIgnoreCase(ip)) {ip = request.getRemoteAddr();}}}return ip;}
其處理邏輯就是首先從http的header頭中獲取x-forwarded-for屬性,如存在且不為空,按逗號(hào)拆分,取首段,這是源ip地址,后面都是經(jīng)過的代理的ip地址;如為空,則找X-Real-IP屬性,如依舊為空,再調(diào)用jdk原始的getRemoteAddr來獲取,即盡最大可能獲取到用戶請求的真實(shí)源ip地址。
如何搭建集群?
nginx可以作為后端服務(wù)的負(fù)載均衡,配置多個(gè)節(jié)點(diǎn)防止單點(diǎn)故障。不過從整個(gè)系統(tǒng)架構(gòu)視角看,nginx會(huì)成為新的單點(diǎn)故障的隱患點(diǎn)。
解決方案就是搭建兩個(gè)nginx節(jié)點(diǎn),然后配合keepalived,實(shí)現(xiàn)nginx集群,提升系統(tǒng)的高可用性。
由于nginx自身高度穩(wěn)定,訪問量有限的中小型應(yīng)用,可以考慮單節(jié)點(diǎn)運(yùn)行。
502報(bào)錯(cuò)如何處理?
問題描述
Nginx 返回 502 Bad Gateway 錯(cuò)誤,通常表示作為代理服務(wù)器的 Nginx 無法從上游服務(wù)器(如后端應(yīng)用服務(wù)器)獲取有效的響應(yīng)。一般發(fā)生在壓力測試或者高并發(fā)系統(tǒng)的生產(chǎn)環(huán)境,這時(shí)候我們查看后端服務(wù)器,會(huì)發(fā)現(xiàn)有大量tcp連接處于time_wait狀態(tài),從而影響了系統(tǒng)的吞吐量和對請求的響應(yīng)。
原因分析
出現(xiàn)502報(bào)錯(cuò),大多數(shù)情況下是由于未使用長連接,所有請求都是短連接,造成tcp連接頻繁建立和銷毀,而服務(wù)器承載tcp連接的數(shù)量是有限的。注意這里有個(gè)誤區(qū),就是很多時(shí)候會(huì)誤以為可用端口數(shù)耗光了,實(shí)際上單臺(tái)服務(wù)器,可用端口在幾萬,而可支撐的tcp連接往往只有幾千。
按照tcp協(xié)議,每個(gè)連接四次揮手后,進(jìn)入time_wait狀態(tài),默認(rèn)需要2分鐘后才會(huì)徹底銷毀,釋放連接及端口資源。該值可以通過調(diào)整操作系統(tǒng)參數(shù)縮短,問題會(huì)一定程度上緩解,但不會(huì)徹底解決。
解決方案
啟用http的長連接功能,復(fù)用tcp連接,減少tcp連接創(chuàng)建和銷毀的開銷,實(shí)際上就是將tcp連接池化,一個(gè)tcp連接可以復(fù)用,為多個(gè)http請求提供服務(wù)。長連接功能是http1.1新增的功能,http 1.0則只能建立短連接。
對于客戶(瀏覽器)到nginx再到tomcat(后端)的請求,實(shí)際是兩段。
正常情況下,從瀏覽器到nginx前半段,走的都是http1.1協(xié)議,在請求頭中有Connection屬性,且其值為keep-alive。
Nginx默認(rèn)也開啟了長連接配置,主要涉及到兩個(gè)參數(shù):一是keepalive_timeout 參數(shù),定義連接在保持空閑狀態(tài)時(shí)的超時(shí)時(shí)間,比如設(shè)置為65秒,意味著tcp連接如果在65秒內(nèi)沒有收到新的請求后再退出;二是keepalive_requests,定義一個(gè)tcp連接上可以服務(wù)的最大請求數(shù)目,默認(rèn)值是100,一般情況的請求量也足夠用了。
但如果并發(fā)量特別大,qps特別高,比如10000qps,即每秒鐘有1w請求,而每個(gè)tcp連接只能復(fù)用100次,意味著有每秒鐘有大約100個(gè)tcp連接需要銷毀和新建,從而查看nginx所在的服務(wù)器,會(huì)有相當(dāng)數(shù)量的tcp連接因銷毀產(chǎn)生的time_wait狀態(tài)。這種情況下可以考慮適當(dāng)調(diào)高keepalive_requests的值。
對于nginx到后端服務(wù)這一段,正常情況下也會(huì)使用長連接,但不排除一些特別因素影響導(dǎo)致使用了短連接,比如請求協(xié)議走的是http1.0而不是http1.1,或者協(xié)議版本是1.1,但請求頭中出現(xiàn)了Connection屬性,其值還是close等各種奇怪的情況,導(dǎo)致長連接未生效。
nginx這邊有幾個(gè)參數(shù)來解決該問題,如下:
http {server {upstream backend {server backend1.example.com;server backend2.example.com;# 連接數(shù)量keepalive 30;}location / {proxy_pass http://backend;# 設(shè)置http版本為1.1proxy_http_version 1.1;# 去除header中的Connection屬性proxy_set_header Connection "";}}
}
一是設(shè)置nginx跟后端服務(wù)起的連接的復(fù)用數(shù)量。
在 Nginx 的 upstream
塊中,keepalive
指令用于定義與后端服務(wù)器連接的復(fù)用數(shù)量。當(dāng)設(shè)置 keepalive
參數(shù)為一個(gè)正整數(shù)時(shí),Nginx 會(huì)嘗試與后端服務(wù)器保持一定數(shù)量的連接處于打開狀態(tài),以便快速處理后續(xù)的請求。
keepalive 30;
這個(gè)配置的含義是,Nginx 將與每個(gè)后端服務(wù)器保持最多 30 個(gè)長連接(persistent connections)。
這些長連接會(huì)在不同的請求之間復(fù)用,減少連接建立和關(guān)閉的開銷,從而提高請求處理的效率。這對于動(dòng)態(tài)內(nèi)容的服務(wù)器尤其有用,因?yàn)樗鼈兛赡苄枰l繁地處理來自同一客戶端的多個(gè)請求。
二是通過指令強(qiáng)行指定http協(xié)議版本以及清除請求頭中的Connection屬性
對于http協(xié)議1.1版本,不需要在header頭上傳輸Connection屬性,如果出現(xiàn)了反而會(huì)存在問題,所以需要通過proxy_set_header指令去除。
如何部署前端項(xiàng)目?
nginx本身是一個(gè)低資源占用,高性能的http web服務(wù)容器,可以部署vue、react等實(shí)現(xiàn)的前端項(xiàng)目。
部署 Vue 項(xiàng)目到 Nginx 服務(wù)器通常涉及以下步驟:
- 構(gòu)建 Vue 項(xiàng)目:
- 在本地開發(fā)環(huán)境中運(yùn)行 Vue 項(xiàng)目構(gòu)建命令來生成生產(chǎn)環(huán)境的構(gòu)建文件。這通常通過運(yùn)行以下命令完成:
npm run build
打包完成后前端內(nèi)容如下:
- 拷貝內(nèi)容
將第一步打包產(chǎn)生的文件,上傳的服務(wù)器,有兩種做法,一是直接將其放到nginx所在目錄的html下,這是nginx的存放站點(diǎn)內(nèi)容的默認(rèn)目錄,在server塊中無需使用root來指定站點(diǎn)目錄;二是將其放到服務(wù)器任意目錄,在server塊中通過root指令設(shè)置目錄。第二種方式更靈活,我們將其拷貝到c:/publish/meet/frontend目錄下。
- 配置nginx
server {#監(jiān)聽端口號(hào)listen 80; #域名server_name meet.popsoft.tech; location / {root c:/publish/meet/frontend;index index.html;try_files $uri $uri/ /index.html;} location /pro/ { proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:18080; rewrite "^/pro/(.*)$" /$1 break ;}}
這里的location涉及到兩部分,一類是匹配/,用于用戶訪問前端,通過root指定到vue的發(fā)布目錄;另一類是匹配/pro/,前端vue訪問后端服務(wù)都是以pro作為起始,但后端服務(wù)沒有pro這段,所以通過rewrite指令,去除前綴后再訪問后端服務(wù)。后端springboot服務(wù)暴漏的端口是18080,通過proxy_pass http://localhost:18080來轉(zhuǎn)發(fā)。