202518 | Ngnix

Ngnix是什么

Nginx(發音為“engine-x”)是一個開源的高性能HTTP服務器反向代理服務器負載均衡器郵件代理服務器。它由俄羅斯程序員Igor Sysoev開發,首次發布于2004年,旨在解決C10K問題(即如何高效地處理10,000個并發連接)。Nginx以其高并發處理能力低內存消耗穩定性而聞名,廣泛應用于Web服務器、反向代理、負載均衡和API網關等場景。

Nginx的核心定義:

Nginx是一個事件驅動異步架構的服務器軟件,主要用于:

  1. HTTP服務器:直接處理客戶端請求并返回靜態或動態內容。
  2. 反向代理:將客戶端請求轉發到后端服務器,并將響應返回給客戶端。
  3. 負載均衡:在多個后端服務器之間分發請求,以提高系統的性能和可用性。
  4. 郵件代理:支持IMAP、POP3和SMTP協議,用于郵件代理服務。

Nginx的關鍵特性:

  • 高性能:采用事件驅動模型,能夠高效處理大量并發連接。
  • 輕量級:占用內存少,適合資源受限的環境。
  • 模塊化:支持通過模塊擴展功能。
  • 靈活的配置:配置文件簡潔且功能強大,易于定制。
  • 高可靠性:以穩定性著稱,適合生產環境長時間運行。

Nginx的應用場景:

  • Web服務器:托管靜態文件或動態內容。
  • 反向代理:作為后端服務器的網關,隱藏服務器細節。
  • 負載均衡:在多個服務器之間分發請求,提高系統性能。
  • API網關:處理請求路由、認證、限流等。
  • 緩存服務器:通過緩存內容減少后端服務器的負載。

Ngnix安裝

以下是 Nginx 在 Linux 和 macOS 中的安裝步驟,分別針對常見的發行版和系統版本進行說明:


Nginx 在 Linux 中的安裝步驟

1. Ubuntu/Debian

使用 apt 包管理器安裝:
# 更新包列表
sudo apt update# 安裝 Nginx
sudo apt install nginx# 啟動 Nginx
sudo systemctl start nginx# 設置開機自啟動
sudo systemctl enable nginx# 檢查狀態
sudo systemctl status nginx
驗證安裝:

打開瀏覽器,訪問 http://localhost 或服務器的 IP 地址,如果看到 Nginx 的歡迎頁面,說明安裝成功。


2. CentOS/RHEL

使用 yum 包管理器安裝:
# 更新包列表
sudo yum update# 安裝 EPEL 倉庫(如果未安裝)
sudo yum install epel-release# 安裝 Nginx
sudo yum install nginx# 啟動 Nginx
sudo systemctl start nginx# 設置開機自啟動
sudo systemctl enable nginx# 檢查狀態
sudo systemctl status nginx
驗證安裝:

打開瀏覽器,訪問 http://localhost 或服務器的 IP 地址,如果看到 Nginx 的歡迎頁面,說明安裝成功。


3. Fedora

使用 dnf 包管理器安裝:
# 更新包列表
sudo dnf update# 安裝 Nginx
sudo dnf install nginx# 啟動 Nginx
sudo systemctl start nginx# 設置開機自啟動
sudo systemctl enable nginx# 檢查狀態
sudo systemctl status nginx
驗證安裝:

打開瀏覽器,訪問 http://localhost 或服務器的 IP 地址,如果看到 Nginx 的歡迎頁面,說明安裝成功。


Nginx 在 macOS 中的安裝步驟

1. 使用 Homebrew 安裝

安裝 Homebrew(如果未安裝):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
安裝 Nginx:
# 更新 Homebrew
brew update# 安裝 Nginx
brew install nginx# 啟動 Nginx
brew services start nginx# 檢查狀態
brew services list
驗證安裝:

打開瀏覽器,訪問 http://localhost:8080,如果看到 Nginx 的歡迎頁面,說明安裝成功。


2. 手動安裝

下載并編譯 Nginx:
# 安裝依賴(如 PCRE 和 OpenSSL)
brew install pcre openssl# 下載 Nginx 源碼
curl -O http://nginx.org/download/nginx-1.24.0.tar.gz
tar -zxvf nginx-1.24.0.tar.gz
cd nginx-1.24.0# 配置并編譯
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-pcre
make
sudo make install# 啟動 Nginx
sudo /usr/local/nginx/sbin/nginx# 檢查狀態
ps aux | grep nginx
驗證安裝:

打開瀏覽器,訪問 http://localhost,如果看到 Nginx 的歡迎頁面,說明安裝成功。


Nginx 配置文件路徑

  • Linux/etc/nginx/nginx.conf
  • macOS(Homebrew)/usr/local/etc/nginx/nginx.conf
  • macOS(手動安裝)/usr/local/nginx/conf/nginx.conf

總結

  • Linux:推薦使用系統包管理器(如 aptyumdnf)安裝 Nginx,方便快捷。
  • macOS:推薦使用 Homebrew 安裝 Nginx,簡單易用;如果需要自定義編譯,可以選擇手動安裝。

無論是 Linux 還是 macOS,安裝完成后都可以通過瀏覽器訪問 http://localhost 或服務器的 IP 地址來驗證 Nginx 是否正常運行。

Ngnix常用命令

功能分類命令說明示例
服務管理sudo systemctl start nginx啟動 Nginx 服務sudo systemctl start nginx
sudo systemctl stop nginx停止 Nginx 服務sudo systemctl stop nginx
sudo systemctl restart nginx重啟 Nginx 服務(中斷連接)sudo systemctl restart nginx
sudo systemctl reload nginx重新加載配置文件(不中斷連接)sudo systemctl reload nginx
sudo systemctl status nginx查看服務狀態(運行狀態、進程信息等)sudo systemctl status nginx
配置相關sudo nginx -t檢查配置文件語法是否正確sudo nginx -t
nginx -T顯示所有配置文件內容(調試用)sudo nginx -T
開機自啟sudo systemctl enable nginx設置開機自動啟動 Nginxsudo systemctl enable nginx
sudo systemctl disable nginx取消開機自動啟動sudo systemctl disable nginx
版本信息nginx -v查看 Nginx 版本nginx -v
nginx -V查看詳細版本及編譯參數(用于排查兼容性問題)nginx -V
進程管理`ps auxgrep nginx`查看當前運行的 Nginx 進程
sudo kill -QUIT <nginx主進程PID>優雅停止 Nginx(等待請求處理完成)sudo kill -QUIT 1234
sudo kill -TERM <nginx主進程PID>強制停止 Nginx(立即終止,不等待請求完成)sudo kill -TERM 1234
sudo kill -HUP <nginx主進程PID>重新加載配置文件(等效于 reloadsudo kill -HUP 1234
日志管理sudo nginx -s reopen重新打開日志文件(適用于日志切割后刷新)sudo nginx -s reopen
高級操作sudo nginx -s upgrade平滑升級 Nginx(需提前替換二進制文件)sudo nginx -s upgrade

Ngnix配置文件

Nginx 的配置文件是其核心部分,用于定義服務器的行為、路由規則、負載均衡、緩存等。Nginx 的配置文件通常位于 /etc/nginx/nginx.conf(Linux)或 /usr/local/etc/nginx/nginx.conf(macOS Homebrew)。以下是 Nginx 配置文件的結構詳解


Nginx 配置文件結構

1. 配置文件的基本結構

Nginx 配置文件采用 分塊結構,由 指令 組成。指令用于設置參數,塊用于分組指令。配置文件通常包括以下部分:

  • 全局塊:定義全局配置,適用于整個 Nginx 實例。
  • Events 塊:定義事件處理模型,影響 Nginx 的性能。
  • HTTP 塊:定義 HTTP 服務器的配置。
  • Server 塊:定義虛擬主機的配置。
  • Location 塊:定義特定 URL 路徑的處理規則。

2. 全局塊

全局塊位于配置文件的最外層,用于設置全局參數。常見的指令包括:

  • user:指定運行 Nginx 的用戶和組。
  • worker_processes:定義工作進程的數量(通常設置為 CPU 核心數)。
  • error_log:定義錯誤日志的路徑和級別。
  • pid:定義 Nginx 主進程的 PID 文件路徑。

示例

user www-data;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

3. Events 塊

Events 塊用于定義 Nginx 的事件處理模型,影響其并發性能。常見的指令包括:

  • worker_connections:定義每個工作進程的最大連接數。
  • use:指定事件模型(如 epollkqueue 等)。

示例

events {worker_connections 1024;use epoll;
}

4. HTTP 塊

HTTP 塊是 Nginx 配置文件的核心部分,用于定義 HTTP 服務器的行為。常見的指令包括:

  • include:引入其他配置文件(如 mime.typessites-enabled/* 等)。
  • default_type:定義默認的 MIME 類型。
  • log_format:定義日志格式。
  • access_log:定義訪問日志的路徑。
  • sendfile:啟用高效文件傳輸模式。
  • keepalive_timeout:定義客戶端連接的保持時間。
  • gzip:啟用 Gzip 壓縮。

示例

http {include       /etc/nginx/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  /var/log/nginx/access.log  main;sendfile        on;keepalive_timeout  65;gzip  on;include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;
}

5. Server 塊

Server 塊用于定義虛擬主機(即一個域名或 IP 地址的配置)。常見的指令包括:

  • listen:定義監聽的端口和 IP 地址。
  • server_name:定義虛擬主機的域名。
  • root:定義網站的根目錄。
  • index:定義默認的索引文件。
  • error_page:定義自定義錯誤頁面。

示例

server {listen       80;server_name  example.com;root   /var/www/html;index  index.html index.htm;error_page  404  /404.html;error_page  500 502 503 504  /50x.html;location / {try_files $uri $uri/ =404;}
}

6. Location 塊

Location 塊用于定義特定 URL 路徑的處理規則。常見的指令包括:

  • try_files:嘗試查找文件,如果不存在則返回指定狀態碼。
  • proxy_pass:將請求轉發到后端服務器。
  • rewrite:重寫 URL。
  • alias:定義文件路徑的別名。
  • allow/deny:控制訪問權限。

示例

location /images/ {alias /var/www/images/;try_files $uri $uri/ =404;
}location /api/ {proxy_pass http://backend_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;
}location ~ \.php$ {include fastcgi_params;fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

7. 其他常見配置

負載均衡
upstream backend {server backend1.example.com;server backend2.example.com;server backend3.example.com;
}server {location / {proxy_pass http://backend;}
}
SSL/TLS 配置
server {listen       443 ssl;server_name  example.com;ssl_certificate      /etc/nginx/ssl/example.com.crt;ssl_certificate_key  /etc/nginx/ssl/example.com.key;ssl_protocols       TLSv1.2 TLSv1.3;ssl_ciphers         HIGH:!aNULL:!MD5;ssl_session_cache   shared:SSL:10m;ssl_session_timeout 10m;location / {root   /var/www/html;index  index.html index.htm;}
}

8. 配置文件的管理

  • 測試配置文件

    sudo nginx -t
    

    如果配置文件語法正確,會顯示 syntax is oktest is successful

  • 重新加載配置文件

    sudo nginx -s reload
    

總結

Nginx 的配置文件采用模塊化設計,主要分為 全局塊Events 塊HTTP 塊Server 塊Location 塊。通過靈活配置,可以實現虛擬主機、負載均衡、反向代理、SSL/TLS 加密等功能。掌握配置文件的結構和常用指令,是高效管理 Nginx 的關鍵。

Ngnix配置實例

反向代理

以下是一個 Nginx 配置反向代理的實例,幫助您理解如何通過 Nginx 將客戶端請求轉發到后端服務器。


場景描述

假設:

  • Nginx 服務器監聽 80 端口。
  • 客戶端訪問 http://example.com 時,Nginx 將請求轉發到后端服務器 http://backend_server:8080

Nginx 反向代理配置

1. 基本反向代理配置
server {listen       80;server_name  example.com;location / {proxy_pass http://backend_server:8080;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;}
}
配置說明
  • listen 80:Nginx 監聽 80 端口。
  • server_name example.com:匹配域名 example.com
  • location /:匹配所有路徑。
  • proxy_pass http://backend_server:8080:將請求轉發到后端服務器 http://backend_server:8080
  • proxy_set_header:設置請求頭,確保后端服務器能獲取客戶端的真實 IP 和其他信息。

2. 負載均衡反向代理

如果后端有多臺服務器,可以使用 upstream 模塊實現負載均衡。

upstream backend_servers {server backend1.example.com:8080;server backend2.example.com:8080;server backend3.example.com:8080;
}server {listen       80;server_name  example.com;location / {proxy_pass http://backend_servers;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;}
}
配置說明
  • upstream backend_servers:定義后端服務器組,Nginx 會按照默認的輪詢策略將請求分發到各個服務器。
  • proxy_pass http://backend_servers:將請求轉發到 backend_servers 組中的服務器。

3. SSL/TLS 反向代理

如果客戶端通過 HTTPS 訪問 Nginx,Nginx 需要配置 SSL/TLS 證書,并將請求轉發到 HTTP 后端服務器。

server {listen       443 ssl;server_name  example.com;ssl_certificate      /etc/nginx/ssl/example.com.crt;ssl_certificate_key  /etc/nginx/ssl/example.com.key;ssl_protocols       TLSv1.2 TLSv1.3;ssl_ciphers         HIGH:!aNULL:!MD5;ssl_session_cache   shared:SSL:10m;ssl_session_timeout 10m;location / {proxy_pass http://backend_server:8080;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;}
}server {listen       80;server_name  example.com;return       301 https://$host$request_uri;
}
配置說明
  • listen 443 ssl:Nginx 監聽 443 端口,并啟用 SSL/TLS。
  • ssl_certificatessl_certificate_key:指定 SSL 證書和私鑰的路徑。
  • proxy_pass http://backend_server:8080:將 HTTPS 請求轉發到 HTTP 后端服務器。
  • return 301 https://$host$request_uri:將 HTTP 請求重定向到 HTTPS。

4. 路徑匹配反向代理

如果希望將不同路徑的請求轉發到不同的后端服務器,可以使用多個 location 塊。

server {listen       80;server_name  example.com;location /api/ {proxy_pass http://api_server:8080;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;}location /static/ {proxy_pass http://static_server:8080;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;}
}
配置說明
  • location /api/:將 /api/ 路徑的請求轉發到 http://api_server:8080
  • location /static/:將 /static/ 路徑的請求轉發到 http://static_server:8080

5. WebSocket 反向代理

如果后端服務器提供 WebSocket 服務,需要額外配置 WebSocket 支持。

server {listen       80;server_name  example.com;location /ws/ {proxy_pass http://websocket_server:8080;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";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;}
}
配置說明
  • proxy_http_version 1.1:將 HTTP 協議版本設置為 1.1。
  • proxy_set_header Upgrade $http_upgradeproxy_set_header Connection "Upgrade":支持 WebSocket 協議。

總結

Nginx 的反向代理功能非常強大,適用于多種場景,如基本反向代理、負載均衡、SSL/TLS 加密、路徑匹配和 WebSocket 支持。通過合理配置,可以輕松實現請求的轉發和后端服務器的管理。

負載均衡

以下是一個 Nginx 配置負載均衡的實例,幫助您理解如何通過 Nginx 將請求分發到多個后端服務器,以提高系統的性能和可用性。


場景描述

假設:

  • 有三臺后端服務器:backend1.example.com:8080backend2.example.com:8080backend3.example.com:8080
  • Nginx 作為負載均衡器,將客戶端請求分發到這三臺服務器。

Nginx 負載均衡配置

1. 基本負載均衡配置
http {upstream backend_servers {server backend1.example.com:8080;server backend2.example.com:8080;server backend3.example.com:8080;}server {listen       80;server_name  example.com;location / {proxy_pass http://backend_servers;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;}}
}
配置說明
  • upstream backend_servers:定義后端服務器組,Nginx 會按照默認的輪詢策略將請求分發到各個服務器。
  • server:定義后端服務器的地址和端口。
  • proxy_pass http://backend_servers:將請求轉發到 backend_servers 組中的服務器。
  • proxy_set_header:設置請求頭,確保后端服務器能獲取客戶端的真實 IP 和其他信息。

2. 加權負載均衡

如果某些服務器的性能較強,可以為其分配更高的權重,使其處理更多的請求。

http {upstream backend_servers {server backend1.example.com:8080 weight=3;server backend2.example.com:8080 weight=2;server backend3.example.com:8080 weight=1;}server {listen       80;server_name  example.com;location / {proxy_pass http://backend_servers;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;}}
}
配置說明
  • weight=3:為 backend1.example.com:8080 分配權重 3,使其處理更多的請求。
  • weight=2weight=1:分別為 backend2.example.com:8080backend3.example.com:8080 分配權重 2 和 1。

3. IP 哈希負載均衡

如果需要將同一客戶端的請求始終分發到同一臺服務器,可以使用 IP 哈希策略。

http {upstream backend_servers {ip_hash;server backend1.example.com:8080;server backend2.example.com:8080;server backend3.example.com:8080;}server {listen       80;server_name  example.com;location / {proxy_pass http://backend_servers;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;}}
}
配置說明
  • ip_hash:啟用 IP 哈希策略,確保同一客戶端的請求始終分發到同一臺服務器。

4. 健康檢查

Nginx 支持對后端服務器進行健康檢查,自動剔除不可用的服務器。

http {upstream backend_servers {server backend1.example.com:8080;server backend2.example.com:8080;server backend3.example.com:8080;# 健康檢查health_check interval=5s fails=3 passes=2;}server {listen       80;server_name  example.com;location / {proxy_pass http://backend_servers;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;}}
}
配置說明
  • health_check:啟用健康檢查,每隔 5 秒檢查一次,連續失敗 3 次后剔除服務器,連續成功 2 次后重新加入。

5. 故障轉移

如果某臺服務器不可用,Nginx 會自動將請求分發到其他服務器。

http {upstream backend_servers {server backend1.example.com:8080;server backend2.example.com:8080 backup;server backend3.example.com:8080;}server {listen       80;server_name  example.com;location / {proxy_pass http://backend_servers;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;}}
}
配置說明
  • backup:將 backend2.example.com:8080 標記為備份服務器,當其他服務器不可用時,才會將請求分發到備份服務器。

總結

Nginx 的負載均衡功能非常強大,支持多種策略(如輪詢、加權、IP 哈希)和高級特性(如健康檢查、故障轉移)。通過合理配置,可以顯著提高系統的性能和可用性。以下是常見負載均衡策略的對比:

策略描述
輪詢默認策略,按順序將請求分發到各個服務器。
加權輪詢根據權重分配請求,權重越高的服務器處理更多的請求。
IP 哈希根據客戶端 IP 地址分發請求,確保同一客戶端的請求始終分發到同一臺服務器。
健康檢查定期檢查后端服務器的健康狀態,自動剔除不可用的服務器。
故障轉移當主服務器不可用時,將請求分發到備份服務器。

希望這些實例能幫助您更好地理解和配置 Nginx 的負載均衡功能!

靜態資源

以下是一個 Nginx 配置靜態資源的實例,幫助您理解如何通過 Nginx 高效地提供靜態文件服務(如 HTML、CSS、JavaScript、圖片等)。


場景描述

假設:

  • 靜態資源存放在 /var/www/static 目錄下。
  • 客戶端訪問 http://example.com/static/ 時,Nginx 從 /var/www/static 目錄提供文件。

Nginx 靜態資源配置

1. 基本靜態資源配置
server {listen       80;server_name  example.com;location /static/ {alias /var/www/static/;autoindex on;  # 啟用目錄列表}
}
配置說明
  • location /static/:匹配以 /static/ 開頭的 URL 路徑。
  • alias /var/www/static/:將 /static/ 路徑映射到 /var/www/static/ 目錄。
  • autoindex on:啟用目錄列表功能,如果請求的路徑是目錄且沒有默認文件(如 index.html),Nginx 會顯示目錄內容。

2. 優化靜態資源配置

為了提高性能,可以啟用緩存、壓縮和高效文件傳輸。

server {listen       80;server_name  example.com;location /static/ {alias /var/www/static/;autoindex off;  # 禁用目錄列表# 啟用緩存expires 30d;add_header Cache-Control "public, no-transform";# 啟用 Gzip 壓縮gzip on;gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;# 啟用高效文件傳輸sendfile on;tcp_nopush on;}
}
配置說明
  • expires 30d:設置靜態資源的緩存時間為 30 天。
  • add_header Cache-Control "public, no-transform":添加緩存控制頭,禁止代理服務器修改內容。
  • gzip on:啟用 Gzip 壓縮,減少傳輸文件的大小。
  • gzip_types:指定需要壓縮的文件類型。
  • sendfile on:啟用高效文件傳輸模式。
  • tcp_nopush on:優化 TCP 數據包傳輸。

3. 限制靜態資源訪問

如果需要限制某些靜態資源的訪問權限,可以結合 allowdeny 指令。

server {listen       80;server_name  example.com;location /static/ {alias /var/www/static/;autoindex off;# 限制訪問權限allow 192.168.1.0/24;deny all;}
}
配置說明
  • allow 192.168.1.0/24:允許 192.168.1.0/24 網段的客戶端訪問。
  • deny all:拒絕其他所有客戶端的訪問。

4. 設置默認文件

如果請求的路徑是目錄,可以設置默認文件(如 index.html)。

server {listen       80;server_name  example.com;location /static/ {alias /var/www/static/;index index.html;}
}
配置說明
  • index index.html:如果請求的路徑是目錄,Nginx 會嘗試返回 index.html 文件。

5. 靜態資源與動態請求分離

如果同時提供靜態資源和動態請求,可以將它們分離到不同的 location 塊。

server {listen       80;server_name  example.com;# 靜態資源location /static/ {alias /var/www/static/;expires 30d;add_header Cache-Control "public, no-transform";}# 動態請求location /api/ {proxy_pass http://backend_server:8080;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;}
}
配置說明
  • /static/:處理靜態資源請求。
  • /api/:處理動態請求,并將請求轉發到后端服務器。

總結

通過合理配置 Nginx,可以高效地提供靜態資源服務,并優化性能、緩存和安全性。以下是靜態資源配置的常見優化點:

優化項說明
緩存設置 expiresCache-Control 頭,減少客戶端重復請求。
壓縮啟用 gzip 壓縮,減少傳輸文件的大小。
高效文件傳輸啟用 sendfiletcp_nopush,優化文件傳輸性能。
訪問控制使用 allowdeny 限制訪問權限。
默認文件設置 index,自動返回默認文件(如 index.html)。

希望這些實例能幫助您更好地理解和配置 Nginx 的靜態資源服務!

Ngnix原理

image-20250318213405509

Nginx 是一款高性能的 HTTP 服務器反向代理服務器,其核心原理基于 事件驅動模型異步非阻塞架構。以下是 Nginx 的工作原理的簡要介紹:


1. 事件驅動模型

Nginx 采用 事件驅動模型(Event-Driven Model),能夠高效地處理大量并發連接。與傳統的多線程/多進程模型不同,Nginx 使用 單線程少量工作進程 來處理多個連接,避免了線程切換和上下文切換的開銷。

  • 事件循環:Nginx 使用一個事件循環(Event Loop)來監聽所有連接的事件(如讀、寫、超時等)。
  • 非阻塞 I/O:Nginx 使用非阻塞 I/O 操作,當某個連接沒有數據可讀或可寫時,Nginx 不會阻塞等待,而是繼續處理其他連接。

2. 異步非阻塞架構

Nginx 的 異步非阻塞架構 是其高性能的關鍵。它通過以下方式實現:

  • 異步處理:Nginx 不會等待某個操作(如讀取文件或網絡請求)完成,而是立即處理其他任務,待操作完成后通過回調函數繼續處理。
  • 非阻塞 I/O:Nginx 使用非阻塞 I/O 操作,確保單個連接不會阻塞整個進程。

這種架構使得 Nginx 能夠以極低的資源消耗處理大量并發連接。


3. 多進程模型

Nginx 采用 多進程模型 來充分利用多核 CPU 的性能:

  • 主進程(Master Process):負責管理配置、啟動工作進程、監控工作進程狀態等。
  • 工作進程(Worker Process):負責處理客戶端請求。每個工作進程都是獨立的,能夠處理多個并發連接。

通過多進程模型,Nginx 可以充分利用多核 CPU 的計算能力。


4. 模塊化設計

Nginx 采用 模塊化設計,核心功能(如事件處理、連接管理)與擴展功能(如 HTTP 處理、反向代理、負載均衡)分離。這種設計使得 Nginx 非常靈活,可以通過加載不同的模塊來擴展功能。

  • 核心模塊:負責事件處理、連接管理、進程管理等基礎功能。
  • HTTP 模塊:負責處理 HTTP 請求、靜態文件服務、反向代理等功能。
  • 第三方模塊:可以通過加載第三方模塊擴展 Nginx 的功能(如 Lua 腳本支持、緩存管理等)。

5. 請求處理流程

Nginx 處理請求的流程如下:

  1. 接收請求:客戶端發起請求,Nginx 監聽端口并接收連接。
  2. 解析請求:Nginx 解析 HTTP 請求頭,確定請求的路徑、方法等信息。
  3. 匹配 Location:根據配置文件中的 location 塊,匹配請求的 URL 路徑。
  4. 處理請求:根據匹配的 location 塊,執行相應的操作(如返回靜態文件、轉發請求到后端服務器等)。
  5. 返回響應:Nginx 生成響應并返回給客戶端。

6. 反向代理與負載均衡

Nginx 作為反向代理服務器時,其工作原理如下:

  • 反向代理:Nginx 接收客戶端請求,并將其轉發到后端服務器,然后將后端服務器的響應返回給客戶端。
  • 負載均衡:Nginx 支持多種負載均衡策略(如輪詢、加權輪詢、IP 哈希等),將請求分發到多個后端服務器,以提高系統的性能和可用性。

7. 性能優化

Nginx 通過以下方式優化性能:

  • 連接池:Nginx 使用連接池管理客戶端和后端服務器的連接,避免頻繁創建和銷毀連接的開銷。
  • 緩存:Nginx 支持靜態文件緩存和反向代理緩存,減少后端服務器的負載。
  • 壓縮:Nginx 支持 Gzip 壓縮,減少傳輸文件的大小。

總結

Nginx 的工作原理可以概括為:

  • 基于 事件驅動模型異步非阻塞架構,高效處理大量并發連接。
  • 采用 多進程模型,充分利用多核 CPU 的性能。
  • 通過 模塊化設計,靈活擴展功能。
  • 支持 反向代理負載均衡,提升系統的性能和可用性。

這些特性使得 Nginx 成為高性能、高并發的 Web 服務器和反向代理服務器的首選。

Ngnix搭建高可用集群實例

以下是一個利用 Nginx 搭建高可用集群的實例,結合 負載均衡故障轉移 技術,確保系統的高可用性和高性能。


場景描述

假設:

  • 有兩臺 Nginx 服務器(nginx1nginx2)作為負載均衡器,通過 Keepalived 實現高可用。
  • 有三臺后端應用服務器(app1app2app3)提供 Web 服務。
  • 目標是確保即使一臺 Nginx 或應用服務器宕機,系統仍能正常運行。

架構圖

客戶端|+---> [Nginx1 (主)] ---> [App1]|         ||         +---> [App2]|         ||         +---> [App3]|+---> [Nginx2 (備)] ---> [App1]|+---> [App2]|+---> [App3]

步驟 1:配置后端應用服務器

在三臺后端服務器上部署 Web 應用,并確保它們可以通過 HTTP 訪問。例如:

  • app1http://app1.example.com:8080
  • app2http://app2.example.com:8080
  • app3http://app3.example.com:8080

步驟 2:配置 Nginx 負載均衡

nginx1nginx2 上配置負載均衡,將請求分發到后端應用服務器。

Nginx 配置文件
http {upstream backend_servers {server app1.example.com:8080;server app2.example.com:8080;server app3.example.com:8080;}server {listen       80;server_name  example.com;location / {proxy_pass http://backend_servers;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;}}
}
配置說明
  • upstream backend_servers:定義后端服務器組,Nginx 會按照默認的輪詢策略將請求分發到各個服務器。
  • proxy_pass http://backend_servers:將請求轉發到后端服務器組。

步驟 3:配置 Keepalived 實現高可用

nginx1nginx2 上安裝并配置 Keepalived,實現高可用。

安裝 Keepalived
sudo apt update
sudo apt install keepalived
Keepalived 配置文件(nginx1)
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1234}virtual_ipaddress {192.168.1.100}
}
Keepalived 配置文件(nginx2)
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1234}virtual_ipaddress {192.168.1.100}
}
配置說明
  • state MASTERnginx1 為主服務器,nginx2 為備份服務器。
  • virtual_router_id 51:虛擬路由 ID,確保主備服務器使用相同的 ID。
  • priority:優先級,主服務器的優先級高于備份服務器。
  • virtual_ipaddress:虛擬 IP 地址,客戶端通過該 IP 訪問 Nginx。

步驟 4:測試高可用集群

  1. 啟動服務

    • 啟動 nginx1nginx2 上的 Nginx 和 Keepalived 服務。
    • 啟動后端應用服務器。
  2. 訪問服務

    • 客戶端通過虛擬 IP 192.168.1.100 訪問服務,Nginx 會將請求分發到后端服務器。
  3. 模擬故障

    • 停止 nginx1 的 Keepalived 服務,觀察 nginx2 是否接管虛擬 IP 并繼續提供服務。
    • 停止一臺后端服務器,觀察 Nginx 是否將請求分發到其他服務器。

總結

通過 Nginx 負載均衡Keepalived 高可用 技術,可以搭建一個高可用集群,確保即使一臺 Nginx 或后端服務器宕機,系統仍能正常運行。以下是該架構的關鍵點:

組件作用
Nginx作為負載均衡器,將請求分發到后端服務器。
Keepalived實現 Nginx 的高可用,確保主備服務器自動切換。
后端服務器提供 Web 服務,Nginx 將請求分發到多臺服務器以提高性能和可用性。

這種架構適用于需要高可用性和高性能的場景,如電商網站、API 服務等。

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

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

相關文章

WP Mail 郵件發送:WordPress Mail SMTP設置

在我們WordPress搭建個人網站完成后&#xff0c;讀者或者客戶發送的電子郵件&#xff0c;包括你的WPForms電子郵件通知&#xff0c;如果無法到達預定收件人收件箱&#xff0c;這會對我們網站的運營造成很大的影響&#xff0c;問題在于WordPress Mail SMTP的發送方式。 SMTP&am…

小智機器人關鍵函數解析:MqttProtocol::SendAudio()對輸入的音頻數據進行加密處理,通過UDP發送加密后的音頻數據

MqttProtocol::SendAudio()對輸入的音頻數據進行加密處理&#xff0c;通過UDP發送加密后的音頻數據。 源碼&#xff1a; void MqttProtocol::SendAudio(const std::vector<uint8_t>& data) {// 使用互斥鎖保護臨界區&#xff0c;確保同一時間只有一個線程可以訪問該…

Hadoop 常用命令集總覽

Hadoop 常用命令集總覽 在大數據處理領域&#xff0c;Hadoop 作為一種廣泛應用的分布式系統基礎架構&#xff0c;其重要性不言而喻。熟練掌握 Hadoop 的常用命令對于高效的數據處理和分析工作至關重要。本文將對 Hadoop 的常用命令進行專業而詳盡的列舉&#xff0c;并結合實例進…

mac m4 Homebrew安裝MySQL 8.0

1.使用Homebrew安裝MySQL8 在終端中輸入以下命令來安裝MySQL8&#xff1a; brew install mysql8.0 安裝完成后&#xff0c;您可以通過以下命令來驗證MySQL是否已成功安裝&#xff1a; 2.配置mysql環境變量 find / -name mysql 2>/dev/null #找到mysql的安裝位置 cd /op…

GoLand 2024.3 中文 GO語言開發工具

GoLand 2024.3 中文 GO語言開發工具 文章目錄 GoLand 2024.3 中文 GO語言開發工具一、介紹二、效果三、下載 一、介紹 JetBrains GoLand 2024 &#xff0c;是一款GO語言開發工具&#xff0c;全行代碼補全&#xff1a;能使用本地運行的上下文感知深度學習模型&#xff0c;可以自…

Excel去掉單元格里面的換行的方法

方法一&#xff1a;使用“查找和替換”功能 ?選中單元格?&#xff1a;首先選中需要替換換行符的單元格或區域。 ?打開替換窗口?&#xff1a;按下“CtrlH”快捷鍵&#xff0c;打開“查找和替換”對話框。 ?輸入換行符?&#xff1a; 在“查找內容”框中&#xff0c;你可…

React 中的 Props

Props&#xff08;Properties 的縮寫&#xff09;是 React 中用于組件間通信的核心機制。它們允許數據從父組件單向傳遞到子組件。Props 是 React 組件不可變&#xff08;只讀&#xff09;的輸入參數&#xff0c;這種特性使得組件更加可預測且易于維護。 Props 的核心特性 單…

基于簡單神經網絡的線性回歸

一、概述 本代碼實現了一個簡單的神經網絡進行線性回歸任務。通過生成包含噪聲的線性數據集&#xff0c;定義一個簡單的神經網絡類&#xff0c;使用梯度下降算法訓練網絡以擬合數據&#xff0c;并最終通過可視化展示原始數據、真實線性關系以及模型的預測結果。 二、依賴庫 …

?19.思科路由器:OSPF協議引入直連路由的實驗研究

思科路由器:OSPF協議引入直連路由的實驗研究 一、實驗拓撲二、基本配置2.1、sw1的配置2.2、開啟交換機三層功能三、ospf的配置3.1、R1的配置3.2、R2的配置3.3、重啟ospf進程四、引入直連路由五、驗證結果隨著互聯網技術的不斷發展,路由器作為網絡互聯的關鍵設備,其性能與穩定…

USB——刪除注冊表信息

文章目錄 背景工具下載地址工具使用刪除注冊表信息背景 注測表中已記錄這個設備的信息,但現在設備描述符又指定為了 WinUSB 設備,所以當設備再次插入的時候,不會發送 0xEE 命令,造成了枚舉失敗。 兩種處理方式: 修改枚舉時候的 VID/PID刪除 USB 的注冊表信息工具下載地址…

如何快速解決django報錯:cx_Oracle.DatabaseError: ORA-00942: table or view does not exist

我們在使用django連接oracle進行編程時&#xff0c;使用model進行表映射對接oracle數據時&#xff0c;默認表名組成結構為&#xff1a;應用名_類名&#xff08;如&#xff1a;OracleModel_test&#xff09;&#xff0c;故即使我們庫中存在表test&#xff0c;運行查詢時候&#…

從 0 到跑通的 Qt + OpenGL + VS 項目的完整流程

&#x1f9e9; 全流程目標&#xff1a; 在 Visual Studio 中成功打開、編譯并運行一個 Qt OpenGL 項目&#xff08;.vcxproj 格式&#xff09; ? 第 1 步&#xff1a;安裝必要環境 工具說明Visual Studio 2017 / 2019 / 2022必須勾選 “使用 C 的桌面開發” 和 “MSVC 工具…

鴻蒙開發03樣式相關介紹(二)

文章目錄 一、樣式復用1.1 Styles修飾符1.2 Extend修飾符 二、多態樣式 一、樣式復用 在頁面開發過程中&#xff0c;會出出現大量重復的樣式設置代碼&#xff0c;可以使用Styles和Extend修飾符將幫助我們進行樣式復用。 1.1 Styles修飾符 Styles裝飾器可以將多條樣式設置提煉…

裝飾器模式與模板方法模式實現MyBatis-Plus QueryWrapper 擴展

pom <dependency><groupId>com.github.yulichang</groupId><artifactId>mybatis-plus-join-boot-starter</artifactId> <!-- MyBatis 聯表查詢 --> </dependency>MPJLambdaWrapperX /*** 拓展 MyBatis Plus Join QueryWrapper 類&…

05-031-自考數據結構(20331)- 哈希表 - 例題分析

哈希表考題主要涵蓋四大類型:1)函數設計類(如除留余數法計算地址,需掌握質數p的選擇技巧);2)沖突處理類(線性探測法要解決堆積現象,鏈地址法需繪制鏈表結構);3)性能分析類(重點計算ASL,理解裝填因子α的影響規律);4)綜合應用類(如設計ISBN查詢系統,需結合實際問…

rustdesk 自建服務器 key不匹配

請確保id_ed25519文件的權限為&#xff1a; -rw------- 1 root root 88 Apr 31 10:02 id_ed25519在rustdesk安裝目錄執行命令&#xff1a; chmod 700 id_ed25519

Dify 深度集成 MCP實現災害應急響應

一、架構設計 1.1 分層架構 #mermaid-svg-5dVNjmixTX17cCfg {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5dVNjmixTX17cCfg .error-icon{fill:#552222;}#mermaid-svg-5dVNjmixTX17cCfg .error-text{fill:#552222…

AI與.NET技術實操系列(三):在 .NET 中使用大語言模型(LLMs)

1. 引言 在技術迅猛發展的今天&#xff0c;大語言模型&#xff08;Large Language Models, LLMs&#xff09;已成為人工智能領域的核心驅動力之一。從智能對話系統到自動化內容生成&#xff0c;LLMs的應用正在深刻改變我們的工作與生活方式。對于.NET開發者而言&#xff0c;掌…

一個極簡的詞法分析器實現

文章目錄 推薦&#xff1a;Tiny Lexer - 一個極簡的C語言詞法分析器特點核心代碼實現學習價值擴展建議 用Java實現一個簡單的詞法分析器完整實現代碼代碼解析示例輸出擴展建議 用Go實現極簡詞法分析器完整實現代碼代碼解析示例輸出擴展建議 最近兩天搞一個DSL&#xff0c;不得不…

強制用戶裸奔,微軟封鎖唯一后門操作

周末剛結束&#xff0c;那個常年將「用戶為中心」掛嘴邊的微軟又雙叒叕開始作妖&#xff01; 不錯&#xff0c;大伙兒今后可能再沒法通過「OOBE\BYPASSNRO」命令繞過微軟強制聯網要求了。 熟悉 Windows 11 操作系統的都知道&#xff0c;除硬件上諸多限制外&#xff1b; 軟件層…