一、Nginx簡介
1、Nginx概述 ? ? ??
? ? ? ? Nginx (“engine x”) 是一個高性能的 HTTP 和 反向代理服務器,特點是占有內存少,并發能力強,能經受高負載的考驗,有報告表明能支持高達 50,000 個并發連接數 。
2、正向代理
? ? ? ? 正向代理:如果把局域網外的 Internet 想象成一個巨大的資源庫,則局域網中的客戶端要訪問 Internet,則需要通過代理服務器來訪問,這種代理服務就稱為正向代理。
【在瀏覽器配置代理服務器,通過代理服務器去訪問這個網址】
3、反向代理
? ??
? ? ? ? 反向代理,其實客戶端對代理是無感知的(和正向代理的區別,剛剛說正向代理是需要在客戶端瀏覽器中配置代理服務器),因為客戶端不需要任何配置就可以訪問,我們只需要將請求發送到反向代理服務器,由反向代理服務器(9001)去選擇目標服務器(8001)獲取數據后,在返回給客戶端,此時反向代理服務器和目標服務器對外就是一個服務器,暴露的是代理服務器地址(9001),隱藏了真實服務器 IP 地址(8001)。
反向代理服務器比如端口號是9001,真正的內部服務器是8001,但是客戶端不知道,把后面的tomcat和反向代理服務器當作一個整體。
4、負載均衡
? ? ? ? 一般請求
? ? ? ? 單個服務器解決不了,我們增加服務器的數量,然后將請求分發到各個服務器上,將原先請求集中到單個服務器的情況改為將請求分發到多個服務器上,將負載分發到不同的服務器,也就是所謂的負載均衡。
? ? ? ? 把15個請求平均分發到3個服務器,每個服務器5個請求。
5、動靜分離
? ? ? ? 為了加快網站的解析速度,可以把動態頁面和靜態頁面由不同的服務器來解析,加快解析速度,降低原來單個服務器的壓力。
二、Nginx安裝
我這邊ngnix就在windows上面安裝【一般安裝在linux系統中才能發揮它最大的效果】
下載安裝包
nginx: download
直接解壓即可
三、Ngnix配置文件?
我們這邊就直接看配置文件
D:\nginx-1.26.2\conf\ngnix.conf
一般打開會有一些內容,但是很多地方都有注釋
#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;# }#}}
總共三部分組成,大致如下:
這是我去掉之前注釋后剩下的部分:?
worker_processes 1; #第一部分events {worker_connections 1024; #第二部分
}http { #第三部分include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;location / {root html;index index.html index.htm;}error_page 500 502 503 504 /50x.html;location = /50x.html {root html;}}}
第一部分:全局塊
? ? ? ? 從配置文件開始到 events 塊之間的內容,主要會設置一些影響 nginx 服務器整體運行的配置指令,主要包括配置運行 Nginx 服務器的用戶(組)、允許生成的 worker process 數,進程 PID 存放路徑、日志存放路徑和類型以及配置文件的引入等。
1.
user nobody;
這行是注釋掉的,它的作用是指定 Nginx 進程的運行用戶。在 Linux 系統中,每個進程都有一個用戶身份,
user
指令允許你指定 Nginx 工作進程運行時所使用的用戶和用戶組。
- 如果取消注釋并且配置為
user nobody;
,那么 Nginx 會以nobody
用戶身份運行。- 默認情況下,Nginx 會使用啟動 Nginx 的用戶(通常是
nginx
或www-data
,具體取決于你在安裝時配置的用戶)。一般來說,如果你不修改這個配置,Nginx 會自動選擇一個默認的用戶,通常是
nginx
。
worker_processes ?1;?
這是Ngnix服務器并發處理服務的關鍵配置,worker_processes值越大,可以支持的并發處理量越多,但是會受到硬件、軟件等設備的制約。?
這個配置指示 Nginx 啟動的 工作進程 數量。
- 工作進程 是 Nginx 處理請求的單位,每個工作進程負責處理一定的連接。通常情況下,Nginx 是事件驅動模型,即每個工作進程可以同時處理多個連接。
worker_processes
的值通常設置為服務器的 CPU 核心數,以充分利用多核 CPU 的性能。如果你的服務器有多個核心,可以將其設置為多于 1 的值,例如worker_processes 4;
。但在這段配置中,設置的是1
,意味著 Nginx 將啟動一個工作進程。注意: 在生產環境中,通常建議根據服務器的 CPU 核心數來調整
worker_processes
,以提高并發性能。
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
這三行配置是關于 錯誤日志 的設置,但它們被注釋掉了(以
#
開頭)。具體含義如下:
error_log logs/error.log;
- 該指令用于設置 Nginx 錯誤日志的文件路徑。默認情況下,Nginx 會將錯誤日志寫入
logs/error.log
文件中。- 如果你取消注釋并配置它,Nginx 會將錯誤日志記錄在該路徑下。
- 錯誤日志用于記錄 Nginx 運行中的各種錯誤信息,如啟動失敗、配置文件錯誤等。
error_log logs/error.log notice;
- 該行指定了日志的級別為
notice
。Nginx 支持多種日志級別,例如:
debug
: 最詳細的日志,用于調試。info
: 一般信息,記錄普通的運行時信息。notice
: 比info
級別更重要的信息,通常用于表示正常的操作。warn
: 警告信息,表示有潛在的問題,但不影響正常運行。error
: 錯誤信息,表示出現了問題。crit
: 嚴重錯誤,通常需要馬上處理。
error_log logs/error.log info;
- 該行將日志級別設置為
info
,表示記錄更詳細的信息。總結:
- 這三行的作用是控制日志記錄的詳細程度,通過不同的日志級別來控制哪些信息需要被記錄。默認情況下,日志等級可能設置為
error
,但可以根據需要調整。
#pid logs/nginx.pid;
這行配置是注釋掉的,指示 Nginx 將其進程 ID(PID)存儲在一個文件中。
pid
用于指定保存 Nginx 主進程 ID 的文件路徑,通常該文件會存儲在logs/nginx.pid
。- 取消注釋并配置該行后,Nginx 會將主進程的 PID 寫入
logs/nginx.pid
文件中。這對于 Nginx 進程的管理(如啟動、停止、重載配置等)非常有用。
總結:
user nobody;
:指定運行 Nginx 的用戶(這里注釋掉了,使用默認用戶)。worker_processes 1;
:指定 Nginx 啟動的工作進程數,通常建議設置為 CPU 核心數。error_log logs/error.log;
:設置錯誤日志的文件路徑(默認logs/error.log
)。pid logs/nginx.pid;
:指定主進程的 PID 存儲路徑(默認logs/nginx.pid
)。這段配置文件主要是設置 Nginx 運行時的一些基本參數,通常在開發、調試或者生產環境中,根據需要進行適當的調整。
第二部分:events塊
? ? ? ? events 塊涉及的指令主要影響 Nginx 服務器與用戶的網絡連接,常用的設置包括是否開啟對多 work process 下的網絡連接進行序列化,是否允許同時接收多個網絡連接,選取哪種事件驅動模型來處理連接請求,每個 word process 可以同時支持的最大連接數等。
? ? ? ? 下圖例子就表示每個 work process 支持的最大連接數為 1024. 這部分的配置對 Nginx 的性能影響較大,在實際中應該靈活配置。
events {worker_connections 1024;
}
第三部分:http塊
? ? ? ? 這算是 Nginx 服務器配置中最頻繁的部分,代理、緩存和日志定義等絕大多數功能和第三方模塊的配置都在這里。
? ? ? ? 需要注意的是:http 塊也可以包括 http 全局塊、server 塊。
①、http 全局塊
? ? ? ? http 全局塊配置的指令包括文件引入、MIME-TYPE 定義、日志自定義、連接超時時間、單鏈接請求數上限等。如下
1.
include mime.types;
- 作用:這行配置告訴 Nginx 加載
mime.types
文件,這個文件定義了常見的文件擴展名與 MIME 類型之間的映射關系。比如.html
文件類型是text/html
,.jpg
是image/jpeg
等。- 解釋:
mime.types
文件通常包含了一些標準的 MIME 類型,Nginx 會根據文件擴展名來推斷文件的類型,確保它能夠正確地設置Content-Type
響應頭。2.
default_type application/octet-stream;
- 作用:這個配置指定了默認的 MIME 類型。如果 Nginx 在
mime.types
文件中找不到某個文件的 MIME 類型,它會使用這個默認值。- 解釋:
application/octet-stream
是一個通用的二進制文件類型,通常用于無法識別的文件類型。這樣做的好處是,在沒有明確的 MIME 類型時,可以保證文件不會被錯誤處理。3.
作用:這段配置是被注釋掉的,它定義了訪問日志的格式。Nginx 的訪問日志是非常重要的,用于記錄訪問者的請求。
解釋:
$remote_addr
:客戶端的 IP 地址。$remote_user
:客戶端的用戶名(如果啟用了基本認證)。$time_local
:請求發生的本地時間。$request
:請求的原始字符串,例如GET /index.html HTTP/1.1
。$status
:HTTP 響應狀態碼。$body_bytes_sent
:響應體的字節數。$http_referer
:請求來源的 URL。$http_user_agent
:客戶端瀏覽器的信息。$http_x_forwarded_for
:客戶端的真實 IP(當通過代理服務器訪問時)。如果取消注釋并啟用這一行,它會影響 Nginx 如何記錄訪問日志。你可以定義不同的格式來滿足你的日志需求。
4.
#access_log logs/access.log main;
- 作用:配置訪問日志的文件路徑以及日志格式(此處是
main
格式)。- 解釋:如果啟用這行配置,Nginx 將會將訪問日志寫入到
logs/access.log
文件中,并且使用前面定義的main
格式。如果你想要自定義日志路徑或日志格式,可以修改這行配置。5.
sendfile on;
- 作用:開啟
sendfile
功能。- 解釋:
sendfile
用于高效地傳輸文件,它允許 Nginx 從磁盤直接將文件傳輸到網絡連接,而不需要先將文件讀取到內存中。這對于大文件的傳輸非常有效,能夠提高文件的傳輸效率。6.
#tcp_nopush on;
作用:這行被注釋掉了,默認情況下它是關閉的。啟用后,會影響 Nginx 向客戶端發送響應數據包的方式。
解釋:
tcp_nopush
可以提高大文件(如圖片、視頻等)的傳輸效率。它會將多個小的數據包合并成一個大包一起發送,從而減少了網絡上的數據包數量,提高了效率。在某些情況下,這個選項可以幫助減少網絡帶寬的消耗,提高文件傳輸的性能。
7.
#keepalive_timeout 0;
- 作用:這行配置被注釋掉了,默認情況下是
65
秒。它設置了 連接的保持活動時間,即 Nginx 在處理完請求后,保持與客戶端的連接處于活動狀態的時間。- 解釋:
keepalive_timeout
設置了服務器保持客戶端連接的最大時間。在此時間內,如果客戶端繼續請求,Nginx 會復用該連接,而不是重新建立連接。如果設置為
0
,表示禁用連接保持(即每次請求都會創建一個新的連接)。但通常會將其設置為非零值(例如65
),因為保持連接能夠減少連接建立的開銷,提高性能。8.
keepalive_timeout 65;
- 作用:這行配置指定了保持活動連接的超時時間。
- 解釋:
keepalive_timeout 65;
意味著在沒有新請求的情況下,Nginx 會保持與客戶端的連接 65 秒。如果超過這個時間沒有新請求,連接將會被關閉。- 保持連接活躍(keep-alive)有助于提高性能,因為它減少了建立新連接的開銷。
9.
#gzip on;
- 作用:這行配置被注釋掉了,默認情況下是關閉的。它指示是否啟用 gzip 壓縮。
- 解釋:
- 啟用
gzip
后,Nginx 會在響應中對內容進行壓縮,減小數據大小,加速頁面加載,尤其適合傳輸文本類型的文件(如 HTML、CSS、JS 文件)。- 如果啟用這行配置,Nginx 會根據請求頭的
Accept-Encoding
來決定是否對響應內容進行壓縮。
如下圖:?
②、server 塊
? ? ? ? 這塊和虛擬主機有密切關系,虛擬主機從用戶角度看,和一臺獨立的硬件主機是完全一樣的,該技術的產生是為了節省互聯網服務器硬件成本。每個 http 塊可以包括多個 server 塊,而每個 server 塊就相當于一個虛擬主機。而每個 server 塊也分為全局 server 塊,以及可以同時包含多個 locaton 塊。
1、全局 server 塊
? ? ? ? 最常見的配置是本虛擬機主機的監聽配置和本虛擬主機的名稱或 IP 配置。
1.
listen 80;
- 作用:指示 Nginx 在端口
80
上監聽請求。80
是 HTTP 協議的標準端口,通常用于接收瀏覽器發出的普通 HTTP 請求。- 解釋:當用戶訪問這個服務器時,如果沒有指定端口,默認會訪問
80
端口。【可以理解為ngnix運行占用了80端口,在瀏覽器訪問80端口就是訪問ngnix服務器(Nginx是一個高性能的HTTP和反向代理web服務器)】
“監聽”(listening)通常指的是一個網絡服務(如Nginx、后端服務器等)在某個特定的端口上等待并接收來自客戶端的連接請求?。
當它在80端口上監聽時,它實際上是在說:“我在這臺機器的80端口上等待,準備接收任何HTTP請求。監聽也可以理解為占用該端口
當提到Nginx在端口80上監聽請求時,這意味著Nginx服務器被配置為在其網絡接口上監聽TCP協議的80端口,以接收來自客戶端(如Web瀏覽器)的HTTP請求。端口80是HTTP協議的默認端口,意味著當用戶在瀏覽器中訪問一個網址(如
http://example.com
)而沒有指定端口號時,瀏覽器會自動嘗試通過80端口與服務器通信。
2.
server_name localhost;
- 作用:定義ngnix服務器的域名或 IP 地址。這里設置為
localhost
,表示當請求的主機名為localhost
時,將會匹配此server
塊。- 解釋:
localhost
通常指代本地計算機(127.0.0.1)。你可以根據需要替換為自己的域名或 IP 地址。例如,example.com
或www.example.com
。
server_name
指定了 Nginx 服務器響應的域名或 IP 地址,但它的作用并不是直接定義 Nginx 服務器運行的 IP 地址,而是決定 Nginx 如何根據請求中的Host
頭部來選擇匹配的server
塊。假設:
server_name example.com;
:當請求的Host
頭部為example.com
時,Nginx 會使用這個server
塊來處理請求。server_name localhost;
:當請求的Host
頭部為localhost
時,Nginx 會使用這個server
塊來處理請求。server {listen 80;server_name example.com; }server {listen 80;server_name localhost; }
?總之,可以理解:
?這段配置確實表明Nginx會在
localhost
的80端口上運行,并準備接收和處理HTTP請求。
server {listen 9080;server_name localhost,pay-test.anjulian.com.cn,172.25.52.60;
?也可能有這種配置:這個server_name雖然有三個名字,不過都代表一臺服務器。
3.
#charset koi8-r;
- 作用:這行是注釋掉的,表示你可以設置字符集(例如
koi8-r
是一種字符集,常用于俄語)。- 解釋:如果啟用的話,它會設置服務器響應的默認字符編碼。在此配置中,默認編碼是
UTF-8
。4.
#access_log logs/host.access.log main;
- 作用:這行也被注釋掉了,通常是用于定義訪問日志的位置和格式。Nginx 將請求的詳細信息記錄到指定的文件中。
- 解釋:如果取消注釋并啟用,它會將訪問日志寫入
logs/host.access.log
文件,并使用main
格式記錄日志。日志記錄了客戶端的請求信息,包括 IP 地址、請求的 URL、響應狀態碼等。
2、location 塊
? ? ? ? 一個 server 塊可以配置多個 location 塊。
? ? ? ? 這塊的主要作用是基于 Nginx 服務器接收到的請求字符串(例如 server_name/uri-string),對虛擬主機名稱(也可以是 IP 別名)之外的字符串(例如 前面的 /uri-string)進行匹配,對特定的請求進行處理。地址定向、數據緩存和應答控制等功能,還有許多第三方模塊的配置也在這里進行。
location / {root html;index index.html index.htm;}
- 作用:定義了請求的根目錄
/
如何處理。
root html;
:將請求的根目錄映射到本地的html
目錄(通常是網站的根目錄)。index index.html index.htm;
:指定當訪問根路徑時,默認查找的文件是index.html
或index.htm
,如果文件存在,它們會作為響應內容返回。- 解釋:當用戶訪問該服務器時,如果請求路徑是
/
(即根路徑),Nginx 會尋找html
目錄下的index.html
或index.htm
文件,并將其返回給客戶端。
location = /50x.html { root html; }
- 作用:這個
location
配置定義了當訪問/50x.html
時,應該返回哪個文件。- 解釋:
root html;
表示50x.html
文件位于 Nginx 配置的html
目錄中。
?
后面注釋的地方不用管了?
③、總結:
????????虛擬主機是一種技術概念,它指的是在單個物理服務器上通過軟件技術劃分出多個邏輯上的服務器。這些邏輯上的服務器各自獨立運行,仿佛它們是獨立的物理服務器一樣。Nginx 作為一個高性能的 HTTP 和反向代理服務器,通過其強大的配置功能,可以在單個服務器上配置多個?
server
?塊,每個?server
?塊代表一個虛擬主機。????????其次,每個?
server
?塊可以監聽不同的域名、IP 地址或端口號,并根據請求的不同將請求轉發到對應的虛擬主機上進行處理。這樣,雖然物理上只有一臺服務器,但邏輯上卻可以實現多個獨立運行的服務器,每個服務器都可以有自己的域名、根目錄、日志文件等配置信息。定義了兩個?
server
?塊,每個塊都監聽一個不同的端口(9080 和 9443)。因此,當啟動 Nginx 服務器時,它會同時占用這兩個端口。訪問不同的端口,然后根據不同的server塊處理請求。
server
塊中的location
指令用于定義請求的路由規則。它可以根據請求的URL路徑將請求轉發到不同的后端服務器、文件系統位置或者執行特定的操作(如重定向等)server {listen 80;server_name blog.example.com;location / {root /var/www/blog;index index.html;}location /images/ {root /var/www/blog;} }
在這個server塊配置中,當用戶訪問http://blog.example.com時,Nginx會從/var/www/blog目錄下查找index.html文件作為響應。而當用戶訪問以http://blog.example.com/images/開頭的URL路徑時,Nginx會從/var/www/blog/images/目錄下查找對應的文件進行響應。
server {listen 80;server_name api.example.com;location / {proxy_pass http://backend-api-server:8080;proxy_set_header Host $host;proxy_set_header X - Real - IP $remote_ip;} }
此示例展示了server塊作為反向代理的功能。當用戶訪問http://api.example.com相關的請求時,Nginx會將請求轉發到運行在backend - api - server:8080的后端API服務器上。同時,通過proxy_set_header指令設置了一些請求頭信息,使得后端服務器能夠正確獲取請求的來源信息。
?四、Nginx啟動
我們先就默認配置啟動,雙擊一下,然后如果看到畫面一閃而過,代表啟動成功
我們直接瀏覽器輸入localhost?就可以進入,這個畫面其實在前面說過,就是下面第二張圖中html目錄下面的index.html(默認配置就是訪問的這個界面),如果啟動失敗那應該會訪問50x.html。
出現下面界面代表啟動成功
五、Nginx配置實戰
1、Nginx配置實例-反向代理
將請求轉發到后端服務器
實例一
一般我們這里是用的打包后的前端項目,然后指定到后端sprinboot項目(自帶tomcat)
反向代理配置
? ? ? ? 修改host文件(地址直接參照以下圖片)
? ? ? ? 加上一行:將www.123.com映射到192.168.179.137(ip是Linux地址)
192.168.179.137 www.123.com
因為我這里是window是所以這里就不用了
啟動ngnix:
start nginx
停止:
nginx.exe -s quit
總結:
因為我們這里是測試的反向代理,我這里本地啟動了一個springbooot服務、localhost:8080,我在瀏覽器輸入這個即可進入到一個界面,然后我用ngnix做反向代理,我輸入的是localhost:80即可進入這個界面
實例二
這里就描述一下:
(1)準備兩個tomcat服務器,一個8080端口,一個8081端口
~代表正則表達式的形式,有edu就8080,有vod就8081
? ? ? ?
在 Nginx 中,
location
指令用于配置 URI 路徑匹配規則。location ~/edu/
和location /edu/
看似相似,但它們有一些重要的區別,主要體現在匹配方式上。1.
location /edu/
- 這種形式的
location
是 前綴匹配(prefix matching),意味著它會匹配以/edu/
開頭的所有 URI。- 它會匹配任何包含
/edu/
前綴的路徑,無論后面接什么內容,都會被這條規則捕獲。- 這種匹配規則是 最常見的,適用于常見的路徑匹配需求。
例如,以下路徑會匹配
location /edu/
:
/edu/
/edu/index.html
/edu/abc/xyz
location /edu/ { # 處理以 /edu/ 開頭的路徑 }
2.
location ~/edu/
- 這種形式的
location
是 正則表達式匹配(regex matching),它會使用正則表達式對路徑進行匹配。- 在
~/
前綴后跟著的/edu/
是一個正則表達式,用來匹配符合該表達式的路徑。- 注意,正則表達式匹配的順序是 較晚 的,所以如果有其他的
location
路徑匹配規則符合該路徑,它將不會是優先匹配的規則,只有在沒有找到前綴匹配時,正則表達式匹配才會被應用。例如,以下路徑會匹配
location ~/edu/
:
/edu/
/path/to/edu/
/abc/edu/xyz/
/course/edu/class/
location ~/edu/ { # 處理通過正則表達式匹配的路徑,大小寫敏感、區分大小寫 }
主要區別
- 前綴匹配 (
/edu/
): 直接根據路徑的前綴來匹配,不考慮路徑中的其他部分。- 正則匹配 (
~/edu/
): 使用正則表達式匹配,允許更復雜的匹配邏輯,例如大小寫不敏感、包含多個字符等。匹配順序
在 Nginx 中,
location
的匹配是按照以下順序進行的:
- 精確匹配:匹配最準確的路徑。
- 前綴匹配:從長到短的匹配(最長的前綴優先)。
- 正則匹配:最后使用正則表達式進行匹配。
因此,正則表達式匹配會在前綴匹配之后進行。為了確保正確的匹配順序,通常推薦正則匹配規則使用
~
(大小寫敏感)或~*
(大小寫不敏感),并且它們通常放在后面。
2、Nginx負載均衡
大概是實現效果就是每次請求80端口刷新,輪詢請求一個服務器,可能是8080,可能是8081
? ??
1、輪詢(默認)
? ? ? ? 每個請求按時間順序逐一分配到不同的后端服務器,如果后端服務器 down 掉,能自動剔除。
upstream myserver{server 192.168.77.130:8080;server 192.168.77.130:8081;
}
?2、weight
? ? ? ? weight 代表權重默認為 1,權重越高被分配的客戶端越多 。
? ? ? ? 指定輪詢幾率,weight 和訪問比率成正比,用于后端服務器性能不均的情況。 例如:
upstream myserver{server 192.168.77.130:8080 weight=10;server 192.168.77.130:8081 weight=5;
}
3、 ip_hash
? ? ? ? 每個請求按訪問 ip 的 hash 結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決 session 的問題。也就是說,客戶第一次訪問這個服務器,之后訪問的都是這個服務器。
upstream myserver{
ip_hash;server 192.168.77.130:8080 ;server 192.168.77.130:8081 ;
}
4、fair
? ? ? ? 按后端服務器的響應時間來分配請求,響應時間短的優先分配。
upstream myserver{server 192.168.77.130:8080;server 192.168.77.130:8081;fair;
}
3、Nginx動靜分離
? ? ? ? 實現效果:不同資源訪問不同服務器。
一般在linux系統中,這個root就是根目錄,所以可以直接用data
如果是在windows系統中,之前有一個默認示例,就是html中的靜態頁面,root應該就是從nginx的目錄下開始
準備工作
? ? ? ? 在/data里面準備兩個文件夾/image和/www,里面分別放入01.jpg和a.html來模擬靜態資源。
Niginx具體配置
? ? ? ? autoindex on:目的是為了在訪問 /image 時,能夠顯示目錄里面的內容,當然這里也可以通過expire設置緩存過期時間 。
?或者直接
http://192.168.17.129/image/01.jpg
如果是訪問http://192.168.17.129/www/沒有autoindex on,所以是404
但是可以http://192.168.17.129/www/a.html。可以看到頁面
個人理解:
前面請求服務器就是動態請求,這里就是訪問靜態頁面。
注意還是有點區別:
1、比如訪問服務器的時候localtion后面的路徑代表可能要走不同的端口
2、如果是訪問靜態資源,這里可能是代表靜態資源的文件夾
3、還有就是前端打包的時候,動靜結合。
六、項目打包實戰
1、測試
start nginx
tasklist | findstr nginx
?重新加載配置啟動?
nginx -s reload
檢查配置是否有效:
nginx -t
?關閉ngnix
nginx -s quit
tasklist | findstr nginx
不返回結果,代表關閉?
? ? ?
proxy_pass http://localhost:9100/;
注意路徑后面有一個“/"?
?和前面的反向代理一樣。這里可以直接訪問到后端服務器,但是我們一般用ngnix部署前端
2、若依打包部署
不能這樣寫:
location / {root html/dist;proxy_pass http://localhost:9100/;index index.html index.htm;
}
即使你配置了 root html/dist;
來提供靜態文件,proxy_pass
會將請求轉發到 http://localhost:9100
,而不是直接訪問靜態文件。
通常,前端和后端請求會被分開處理,前端靜態文件由 Nginx 提供,而后端 API 請求通過
proxy_pass
進行代理。你可以通過不同的location
塊來分別處理靜態文件和后端 API 請求。假設你的前端文件位于
html/dist
目錄,而后端服務運行在http://localhost:9100
,你可以按以下方式配置:# 提供靜態文件 location / {root html/dist;index index.html index.htm;try_files $uri $uri/ /index.html; # 如果靜態文件沒有找到,重定向到 index.html }# 代理后端 API 請求 location /gateway/slhy-mgr-ui/ {proxy_pass http://localhost:9100;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; }
路徑后面有一個”/",這里漏了
???????不過一般vue.config.js,后面沒有/
若依前端掛Nginx、打包部署運行!!!!-CSDN博客?
在 Nginx 中,當使用
proxy_pass
指定目標地址時,URL 中是否包含尾隨的/
會影響路徑的重寫行為。這是一個容易引起混淆但非常重要的細節。?1. 不加
/
的行為:proxy_pass http://192.168.1.30:8085;
效果:
- Nginx 會將客戶端請求路徑的整個路徑部分追加到目標地址。
- 原始請求路徑不會被剪裁,而是直接拼接到
proxy_pass
的目標地址。示例:
假設客戶端請求
GET /gateway/slhy-mgr-ui/test
在上述配置下,轉發到后端的 URL 將會是:
http://192.168.1.30:8085/gateway/slhy-mgr-ui/test
可能的問題:
如果后端服務期望
/gateway/slhy-mgr-ui/
前綴已經被去掉(例如后端只處理/test
),這種配置會導致路徑不匹配,返回 404 或其他錯誤。2. 加
/
的行為:proxy_pass http://192.168.1.30:8085/;
效果:
- Nginx 會將客戶端請求路徑中與
location
配置匹配的部分剪裁掉,然后將剩余路徑追加到目標地址。proxy_pass
的目標地址中的尾隨/
告訴 Nginx:匹配的路徑部分需要被替換,而不是直接追加。示例:
假設
location
配置如下:location /gateway/slhy-mgr-ui/ {proxy_pass http://192.168.1.30:8085/; }
客戶端請求:
GET /gateway/slhy-mgr-ui/test
轉發到后端的 URL 將會是:
http://192.168.1.30:8085/test
為什么有這個變化?
- Nginx 根據
location
的路徑部分/gateway/slhy-mgr-ui/
匹配到請求,然后將匹配部分剪裁掉。- 剩余的
/test
被追加到proxy_pass
的目標地址。
?