Ngnix是什么
Nginx(發音為“engine-x”)是一個開源的高性能HTTP服務器、反向代理服務器、負載均衡器和郵件代理服務器。它由俄羅斯程序員Igor Sysoev開發,首次發布于2004年,旨在解決C10K問題(即如何高效地處理10,000個并發連接)。Nginx以其高并發處理能力、低內存消耗和穩定性而聞名,廣泛應用于Web服務器、反向代理、負載均衡和API網關等場景。
Nginx的核心定義:
Nginx是一個事件驅動、異步架構的服務器軟件,主要用于:
- HTTP服務器:直接處理客戶端請求并返回靜態或動態內容。
- 反向代理:將客戶端請求轉發到后端服務器,并將響應返回給客戶端。
- 負載均衡:在多個后端服務器之間分發請求,以提高系統的性能和可用性。
- 郵件代理:支持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:推薦使用系統包管理器(如
apt
、yum
、dnf
)安裝 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 | 設置開機自動啟動 Nginx | sudo systemctl enable nginx |
sudo systemctl disable nginx | 取消開機自動啟動 | sudo systemctl disable nginx | |
版本信息 | nginx -v | 查看 Nginx 版本 | nginx -v |
nginx -V | 查看詳細版本及編譯參數(用于排查兼容性問題) | nginx -V | |
進程管理 | `ps aux | grep 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> | 重新加載配置文件(等效于 reload ) | sudo 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
:指定事件模型(如epoll
、kqueue
等)。
示例:
events {worker_connections 1024;use epoll;
}
4. HTTP 塊
HTTP 塊是 Nginx 配置文件的核心部分,用于定義 HTTP 服務器的行為。常見的指令包括:
include
:引入其他配置文件(如mime.types
、sites-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 ok
和test 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_certificate
和ssl_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_upgrade
和proxy_set_header Connection "Upgrade"
:支持 WebSocket 協議。
總結
Nginx 的反向代理功能非常強大,適用于多種場景,如基本反向代理、負載均衡、SSL/TLS 加密、路徑匹配和 WebSocket 支持。通過合理配置,可以輕松實現請求的轉發和后端服務器的管理。
負載均衡
以下是一個 Nginx 配置負載均衡的實例,幫助您理解如何通過 Nginx 將請求分發到多個后端服務器,以提高系統的性能和可用性。
場景描述
假設:
- 有三臺后端服務器:
backend1.example.com:8080
、backend2.example.com:8080
和backend3.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=2
和weight=1
:分別為backend2.example.com:8080
和backend3.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. 限制靜態資源訪問
如果需要限制某些靜態資源的訪問權限,可以結合 allow
和 deny
指令。
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,可以高效地提供靜態資源服務,并優化性能、緩存和安全性。以下是靜態資源配置的常見優化點:
優化項 | 說明 |
---|---|
緩存 | 設置 expires 和 Cache-Control 頭,減少客戶端重復請求。 |
壓縮 | 啟用 gzip 壓縮,減少傳輸文件的大小。 |
高效文件傳輸 | 啟用 sendfile 和 tcp_nopush ,優化文件傳輸性能。 |
訪問控制 | 使用 allow 和 deny 限制訪問權限。 |
默認文件 | 設置 index ,自動返回默認文件(如 index.html )。 |
希望這些實例能幫助您更好地理解和配置 Nginx 的靜態資源服務!
Ngnix原理
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 處理請求的流程如下:
- 接收請求:客戶端發起請求,Nginx 監聽端口并接收連接。
- 解析請求:Nginx 解析 HTTP 請求頭,確定請求的路徑、方法等信息。
- 匹配 Location:根據配置文件中的
location
塊,匹配請求的 URL 路徑。 - 處理請求:根據匹配的
location
塊,執行相應的操作(如返回靜態文件、轉發請求到后端服務器等)。 - 返回響應:Nginx 生成響應并返回給客戶端。
6. 反向代理與負載均衡
Nginx 作為反向代理服務器時,其工作原理如下:
- 反向代理:Nginx 接收客戶端請求,并將其轉發到后端服務器,然后將后端服務器的響應返回給客戶端。
- 負載均衡:Nginx 支持多種負載均衡策略(如輪詢、加權輪詢、IP 哈希等),將請求分發到多個后端服務器,以提高系統的性能和可用性。
7. 性能優化
Nginx 通過以下方式優化性能:
- 連接池:Nginx 使用連接池管理客戶端和后端服務器的連接,避免頻繁創建和銷毀連接的開銷。
- 緩存:Nginx 支持靜態文件緩存和反向代理緩存,減少后端服務器的負載。
- 壓縮:Nginx 支持 Gzip 壓縮,減少傳輸文件的大小。
總結
Nginx 的工作原理可以概括為:
- 基于 事件驅動模型 和 異步非阻塞架構,高效處理大量并發連接。
- 采用 多進程模型,充分利用多核 CPU 的性能。
- 通過 模塊化設計,靈活擴展功能。
- 支持 反向代理 和 負載均衡,提升系統的性能和可用性。
這些特性使得 Nginx 成為高性能、高并發的 Web 服務器和反向代理服務器的首選。
Ngnix搭建高可用集群實例
以下是一個利用 Nginx 搭建高可用集群的實例,結合 負載均衡 和 故障轉移 技術,確保系統的高可用性和高性能。
場景描述
假設:
- 有兩臺 Nginx 服務器(
nginx1
和nginx2
)作為負載均衡器,通過 Keepalived 實現高可用。 - 有三臺后端應用服務器(
app1
、app2
和app3
)提供 Web 服務。 - 目標是確保即使一臺 Nginx 或應用服務器宕機,系統仍能正常運行。
架構圖
客戶端|+---> [Nginx1 (主)] ---> [App1]| || +---> [App2]| || +---> [App3]|+---> [Nginx2 (備)] ---> [App1]|+---> [App2]|+---> [App3]
步驟 1:配置后端應用服務器
在三臺后端服務器上部署 Web 應用,并確保它們可以通過 HTTP 訪問。例如:
app1
:http://app1.example.com:8080
app2
:http://app2.example.com:8080
app3
:http://app3.example.com:8080
步驟 2:配置 Nginx 負載均衡
在 nginx1
和 nginx2
上配置負載均衡,將請求分發到后端應用服務器。
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 實現高可用
在 nginx1
和 nginx2
上安裝并配置 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 MASTER
:nginx1
為主服務器,nginx2
為備份服務器。virtual_router_id 51
:虛擬路由 ID,確保主備服務器使用相同的 ID。priority
:優先級,主服務器的優先級高于備份服務器。virtual_ipaddress
:虛擬 IP 地址,客戶端通過該 IP 訪問 Nginx。
步驟 4:測試高可用集群
-
啟動服務:
- 啟動
nginx1
和nginx2
上的 Nginx 和 Keepalived 服務。 - 啟動后端應用服務器。
- 啟動
-
訪問服務:
- 客戶端通過虛擬 IP
192.168.1.100
訪問服務,Nginx 會將請求分發到后端服務器。
- 客戶端通過虛擬 IP
-
模擬故障:
- 停止
nginx1
的 Keepalived 服務,觀察nginx2
是否接管虛擬 IP 并繼續提供服務。 - 停止一臺后端服務器,觀察 Nginx 是否將請求分發到其他服務器。
- 停止
總結
通過 Nginx 負載均衡 和 Keepalived 高可用 技術,可以搭建一個高可用集群,確保即使一臺 Nginx 或后端服務器宕機,系統仍能正常運行。以下是該架構的關鍵點:
組件 | 作用 |
---|---|
Nginx | 作為負載均衡器,將請求分發到后端服務器。 |
Keepalived | 實現 Nginx 的高可用,確保主備服務器自動切換。 |
后端服務器 | 提供 Web 服務,Nginx 將請求分發到多臺服務器以提高性能和可用性。 |
這種架構適用于需要高可用性和高性能的場景,如電商網站、API 服務等。