目录
一、前言提要
二、核心特点
三、核心作用
四、架构优势
五、应用场景
六、常用命令
七、性能对比——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 架构的基石,尤其适合需要高并发处理、负载均衡和反向代理的场景。其低资源消耗和高稳定性使其成为云原生时代的首选服务器。