目錄
一、前言提要
二、核心特點
三、核心作用
四、架構優勢
五、應用場景
六、常用命令
七、性能對比——Nginx vs Apache
八、典型用戶
九、配置示例
十、Java應用需配合的配置
十一、性能優化策略
十二、常見問題排查
十三、文件結構配置
十四、總結歸納概述
一、前言提要
? ? ? ?Nginx(發音是 :“engine-x")是一款開源、高性能的Web 服務器、反向代理服務器和負載均衡器。由俄羅斯工程師 Igor Sysoev 于 2004 年首次發布,現已成為全球最流行的 Web 服務器之一(占據約34%的活躍網站份額,來源:W3Techs)。在Java應用部署中,Nginx常作為反向代理、負載均衡器和靜態資源服務器使用。
二、核心特點
1. 高性能 & 高并發?
? ?- 采用 **事件驅動架構**(非阻塞 I/O 模型),單機可輕松支持 **10萬+ 并發連接**。 ?
? ?- 內存消耗極低(靜態資源請求僅需 2.5MB/萬連接)。
2. 輕量級 & 模塊化??
? ?- 核心代碼精簡,通過模塊擴展功能(如 HTTP/2、gzip、SSL 等)。
3. 反向代理??
? ?- 將客戶端請求轉發至后端服務器(如 Tomcat、Node.js),隱藏真實服務器 IP。
4. 負載均衡?
? ?- 支持輪詢、加權輪詢、IP 哈希、最少連接等策略分發流量。
5. 靜態內容服務?
? ?- 高效處理 HTML/CSS/JS/圖片等靜態文件,響應速度遠超傳統服務器。
三、核心作用
1. 反向代理
? ?- 將客戶端請求轉發給后端的Java應用(如Tomcat、Spring Boot)
? ?- 隱藏后端服務器細節,提升安全性
2. 負載均衡
? ?- 分發請求到多個Java應用實例,提高并發能力
3. 靜態資源處理
? ?- 直接處理CSS/JS/圖片等靜態文件,減輕Java應用壓力
4. SSL終結
? ?- 處理HTTPS加密/解密,后端用HTTP通信
四、架構優勢
? ? A[客戶端] --> B[Nginx]
? ? B -->|靜態請求| C[本地磁盤]
? ? B -->|動態請求| D[Tomcat 集群]
? ? B -->|API 請求| E[Spring Cloud 微服務]
? ? D & E --> F[(數據庫)]
- 單線程事件循環:避免進程/線程切換開銷 ?
- Master-Worker 模式: ?
? - `Master`:管理進程(讀取配置、綁定端口) ?
? - `Worker`:工作進程(處理請求,數量 = CPU 核心數)
五、應用場景
場景 | 說明 |
---|---|
Web 服務器 | 直接托管靜態網站(替代 Apache) |
反向代理 | 將請求轉發給 Java/Python/PHP 等后端應用 |
API 網關 | 路由、限流、認證微服務請求 |
SSL/TLS 終端 | 統一管理 HTTPS 證書,減輕后端壓力 |
內容緩存 | 緩存動態內容,降低后端負載 |
動靜分離 | 靜態資源由 Nginx 處理,動態請求轉發至應用服務器 |
六、常用命令
nginx ? ? ? ? ? ? ? # 啟動
nginx -s reload ? ? # 重載配置(不中斷服務)
nginx -s stop ? ? ? # 立即停止
nginx -t ? ? ? ? ? ?# 測試配置語法
tail -f /var/log/nginx/access.log ?# 查看訪問日志
七、性能對比——Nginx vs Apache
指標 | Nginx | Apache |
---|---|---|
并發連接處理 | 事件驅動(高效) | 進程/線程(較重) |
靜態文件響應速度 | ? 快 3x+ | █ 較慢 |
內存占用 | ★ 極低 | ▲ 較高 |
動態內容支持 | 需反向代理 | 原生支持 |
.htaccess | 不支持 | 支持 |
八、典型用戶
- Netflix、Dropbox、Cloudflare ?
- 國內:淘寶、騰訊、百度 ?
- 適用于高并發場景:直播、電商大促、API 網關 ?
九、配置示例
1. 反向代理(單應用)
//nginx
server {listen 80;server_name your-domain.com;location / {proxy_pass http://localhost:8080; ?# 轉發到Java應用proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
}
2. 負載均衡(多實例)
//nginx
upstream java_servers {server 192.168.1.10:8080 weight=3; ?# 權重3server 192.168.1.11:8080; ? ? ? ? ? # 默認權重1server 192.168.1.12:8080 backup; ? ?# 備用節點
}server {listen 80;location / {proxy_pass http://java_servers;}
}
3. 動靜分離
//nginx
server {location / {proxy_pass http://tomcat_app; ?# 動態請求轉Java}location ~* \.(jpg|css|js)$ {root /data/static/; ?# 靜態資源由Nginx直接處理expires 30d; ? ? ? ? # 客戶端緩存30天}
}
十、Java應用需配合的配置
1. 獲取真實客戶端IP
? ?- Nginx設置頭信息:
? ? ?proxy_set_header X-Real-IP $remote_addr;
? ?- Java代碼獲取IP:
? ? ?String clientIP = request.getHeader("X-Real-IP");
2. 會話保持
? ?- 使用`ip_hash`(基于客戶端IP):
//nginx
upstream java_servers {ip_hash;server 192.168.1.10:8080;server 192.168.1.11:8080;}
十一、性能優化策略
1. 調整連接池參數
? ?proxy_http_version 1.1;
? ?proxy_set_header Connection "";
? ?keepalive 32; ?# 連接池大小
2. 啟用Gzip壓縮
? ?gzip on;
? ?gzip_types text/plain application/json;
3. 緩存靜態資源
? ?location ~* \.(png|ico)$ {
? ? ? ?expires 365d;
? ? ? ?add_header Cache-Control "public";
? ?}
十二、常見問題排查
1. 502 Bad Gateway
? ?- 檢查后端Java應用是否運行
? ?- 查看Nginx錯誤日志:`/var/log/nginx/error.log`
2. 連接超時
? ?- 增加超時設置:
? ? ?proxy_connect_timeout 60s;
? ? ?proxy_read_timeout 120s;
十三、文件結構配置
Nginx 配置位于 `/etc/nginx/nginx.conf`,采用層次化語法:
//nginx
# 全局配置
user nginx;
worker_processes auto; ?# 工作進程數 = CPU 核心數events {worker_connections 1024; ?# 每個進程最大連接數
}http {# HTTP 通用配置include /etc/nginx/mime.types;# 服務器塊(虛擬主機)server {listen 80;server_name example.com;location / {root /var/www/html; ?# 網站根目錄}location /api {proxy_pass http://backend; ?# 轉發到后端}}# 上游服務器組(負載均衡)upstream backend {server 10.0.1.101:8080 weight=5;server 10.0.1.102:8080;}
}
十四、總結歸納概述
? ? ? Nginx 是現代化 Web 架構的基石,尤其適合需要高并發處理、負載均衡和反向代理的場景。其低資源消耗和高穩定性使其成為云原生時代的首選服務器。