Ngnix介紹、安裝、實戰及用法!!!

一、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 的用戶(通常是 nginxwww-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 進程的管理(如啟動、停止、重載配置等)非常有用。

總結:

  1. user nobody;:指定運行 Nginx 的用戶(這里注釋掉了,使用默認用戶)。
  2. worker_processes 1;:指定 Nginx 啟動的工作進程數,通常建議設置為 CPU 核心數。
  3. error_log logs/error.log;:設置錯誤日志的文件路徑(默認 logs/error.log)。
  4. 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.jpgimage/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.comwww.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.htmlindex.htm,如果文件存在,它們會作為響應內容返回。
  • 解釋:當用戶訪問該服務器時,如果請求路徑是 /(即根路徑),Nginx 會尋找 html 目錄下的 index.htmlindex.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 的匹配是按照以下順序進行的:

  1. 精確匹配:匹配最準確的路徑。
  2. 前綴匹配:從長到短的匹配(最長的前綴優先)。
  3. 正則匹配:最后使用正則表達式進行匹配。

因此,正則表達式匹配會在前綴匹配之后進行。為了確保正確的匹配順序,通常推薦正則匹配規則使用 ~(大小寫敏感)或 ~*(大小寫不敏感),并且它們通常放在后面。

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 的目標地址。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64469.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

05.HTTPS的實現原理-HTTPS的握手流程(TLS1.2)

05.HTTPS的實現原理-HTTPS的握手流程(TLS1.2) 簡介1. TLS握手過程概述2. TLS握手過程細化3. 主密鑰(對稱密鑰)生成過程4. 密碼規范變更 簡介 主要講述了混合加密流程完成后,客戶端和服務器如何共同獲得相同的對稱密鑰…

YOLO11全解析:從原理到實戰,全流程體驗下一代目標檢測

前言 一、模型介紹 二、網絡結構 1.主干網絡(Backbone) 2.頸部網絡(Neck) 3.頭部網絡(Head) 三、算法改進 1.增強的特征提取 2.優化的效率和速度 3.更高的準確性與更少的參數 4.環境適應性強 5.…

C++ 與 Python(靜態類型語言與動態語言)

C 與 Python(靜態類型語言與動態語言) 一、說明 Python和C到底有啥區別?在使用的時候有啥特殊的益處?這種問題的意義在于:如果對語言了解越清楚,越能夠更加大膽地應用哪些極限功能,從而最大限…

Jenkins 構建流水線

在 Linux 系統上安裝 Jenkins 服務,以及配置自動化構建項目 前置準備環境:docker、docker-compose、jdk、maven 一、環境搭建 1. Jenkins 安裝 (1)拉取鏡像 # 安裝鏡像包,默認安裝最新版本 docker pull jenkins/jen…

【Java】面試題 并發安全 (1)

文章目錄 synchronized1. 基本概念與作用2. 使用方式3. 底層原理(基于monitor)4. 面試題回答要點5. 注意事項與進階理解 Java中synchronized鎖相關知識總結Java內存模型(JMM)CAS概述及重要性volatile關鍵字AQS簡介 synchronized …

前端項目 npm報錯解決記錄

1.首先嘗試解決思路 npm報錯就切換yarn , yarn報錯就先切換npm刪除 node_modules 跟 package-lock.json文件重新下載依 2. 報錯信息: Module build failed: Error: Missing binding D:\vue-element-admin\node_modules\node-sass\vendor\win32-x64-8…

深度學習中batch_size

Batch size調整和epoch/iteration的關系 訓練數據集總共有1000個樣本。若batch_size10,那么訓練完全體樣本集需要100次迭代,1次epoch。 訓練樣本10000條,batchsize設置為20,將所有的訓練樣本在同一個模型中訓練5遍,則…

Redis 數據類型全解析:基礎與進階應用場景

前言:Redis 是一個高性能的內存數據庫,支持多種數據類型,能夠高效處理各種場景的數據存儲和操作。 以下是Redis數據類型的數據結構及其應用場景的詳細說明: 基礎數據類型 1. 字符串 (String) 底層數據結構 Simple Dynamic Stri…

評分模型在路網通勤習慣分析中的應用——提出問題(1)

1、問題的由來、目標和意義 最近一段時間和公司其它業務部門討論時,發現一個有趣的交通路網問題,車輛從S點行駛到V點共用時40分鐘,這段時間內路網中的卡口攝像頭識別到了車輛通過的信息。如下圖所示: 設計師需要通過這些有限的路…

leetcode 面試經典 150 題:刪除有序數組中的重復項

鏈接刪除有序數組中的重復項題序號26題型數組解題方法雙指針難度簡單熟練度????? 題目 給你一個 非嚴格遞增排列 的數組 nums ,請你 原地 刪除重復出現的元素,使每個元素 只出現一次 ,返回刪除后數組的新長度。元素的 相對順序 應該保…

提升生產力工具

VSCODE插件 干貨:用好這13款VSCode插件,工作效率提升10倍 - 程序員檸檬 - 博客園 Sourcetrail Sourcetrail 是一個開源且免費的源碼閱讀工具,以其強大的代碼導航、可視化及跨平臺支持特性,成為開發者理解復雜代碼庫的得力助手。…

什么是 Git Hooks?

在團隊開發中,當成員提交代碼的描述信息不符合約定提交規范的時候,需要阻止當前的提交,而要實現這個目的,我們就需要先來了解一個概念,叫做 Git hooks,即Git 在執行某個事件之前或之后進行一些其他額外的操…

Go語言方法和接收器類型詳解

Go語言方法和接收器類型詳解 1. 方法接收器類型 1.1 值接收器 值接收器方法不會改變接收器的狀態,因為Go語言會在調用時復制接收器的值。因此,任何對接收器成員變量的修改都只會影響副本,而不會影響原始結構體實例。 type Person struct …

MS SQL Server 實戰 排查多列之間的值是否重復

目錄 需求 范例運行環境 數據樣本設計 功能實現 上傳EXCEL文件到數據庫 SQL語句 小結 需求 在日常的應用中,排查列重復記錄是經常遇到的一個問題,但某些需求下,需要我們排查一組列之間是否有重復值的情況。比如我們有一組題庫數據&am…

抖去推碰一碰系統技術源碼/open SDK轉發技術開發

抖去推碰一碰系統技術源碼/open SDK轉發技術開發 碰一碰智能系統#碰碰卡系統#碰一碰系統#碰一碰系統技術源頭開發 碰碰卡智能營銷系統開發是一種集成了人工智能和NFC技術的工具,碰碰卡智能營銷系統通過整合數據分析、客戶關系管理、自動化營銷活動、多渠道整合和個…

redis優化

在高并發、高性能、高可用系統中,Redis 的優化至關重要。以下是一些在面試中可以詳細說明的 Redis 優化策略,以及具體的實踐經驗和技術亮點: 1. 數據模型與結構設計優化 使用合適的數據結構 :根據業務需求選擇合適的 Redis 數據結…

WEB攻防-通用漏洞-文件上傳-js驗證-MIME驗證-user.ini-語言特征

目錄 定義 1.前端驗證 2.MIME驗證 3.htaccess文件和.user. ini 4.對內容進行了過濾,做了內容檢測 5.[ ]符號過濾 6.內容檢測php [] {} ; 7.()也被過濾了 8.反引號也被過濾 9.文件頭檢測 定義 文件上傳漏洞是指攻擊者上傳了一個可執行文件(如木馬…

探索與決策的完美結合:Actor-Critic 方法及其衍生算法

引言 在強化學習領域,如何讓智能體學會做出最優決策是一個關鍵問題。Actor-Critic 方法提供了一種高效的解決方案,它結合了策略梯度(Actor)和值函數(Critic)的優點,使智能體能夠在復雜的環境中…

未來網絡技術的新征程:5G、物聯網與邊緣計算(10/10)

一、5G 網絡:引領未來通信新潮流 (一)5G 網絡的特點 高速率:5G 依托良好技術架構,提供更高的網絡速度,峰值要求不低于 20Gb/s,下載速度最高達 10Gbps。相比 4G 網絡,5G 的基站速度…

數據交易和聯邦學習的背景下的安全屬性

數據交易和聯邦學習的背景下的安全屬性 在數據交易和聯邦學習的背景下,安全屬性對于保護數據隱私、確保系統可靠性和維護交易公平性至關重要。以下將分析文章中涉及的安全屬性以及分析這些屬性的目的。 涉及的安全屬性 雙向認證:文章雖未明確提及傳統意義上的雙向認證機制,…