一、Nginx 基础概念
- Nginx 是什么?
-
- 一款高性能的HTTP 服务器、反向代理服务器和负载均衡器。
-
- 特点:轻量级、高并发(支持 10 万 + 并发连接)、低内存占用、可扩展性强。
- Nginx 与 Apache 的核心区别?
对比项 | Nginx | Apache |
---|---|---|
并发处理 | 基于异步非阻塞 IO 模型(事件驱动) | 基于多进程 / 多线程模型 |
内存占用 | 低(并发 1 万时约 2-3MB / 进程) | 高(并发 1 万时内存占用明显更高) |
适用场景 | 高并发静态资源、反向代理、负载均衡 | 动态内容(如 PHP 模块集成) |
- Nginx 的工作模式(master-worker 模型)
-
- master 进程:管理 worker 进程(启动、重启、关闭),读取配置文件。
-
- worker 进程:处理实际请求(并发连接),数量通常设为CPU 核心数(充分利用多核)。
-
- 优势:某个 worker 进程异常退出时,master 会自动重启,保证服务可用性。
二、Nginx 核心功能及应用场景
- 反向代理
-
- 定义:客户端请求 Nginx,Nginx 转发到后端服务器,再将结果返回客户端(客户端不知道后端服务器)。
-
- 作用:隐藏后端服务 IP、统一入口管理、实现动静分离。
-
- 核心配置:
location /api/ {
proxy_pass http://backend_server; # 转发到后端服务
proxy_set_header Host $host; # 传递客户端Host头
proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP
}
- 负载均衡
-
- 定义:将客户端请求均匀分发到多个后端服务器,避免单点压力过大。
-
- 常用策略(upstream模块):
策略 | 说明 | 适用场景 |
---|---|---|
轮询(默认) | 按顺序依次分发请求 | 后端服务器性能一致时 |
权重(weight) | server 192.168.1.1 weight=5; | 后端服务器性能不均(权重越高分配越多) |
ip_hash | 同一 IP 请求固定分发到同一服务器 | 需保持会话的场景(如登录状态) |
least_conn | 优先分发到连接数最少的服务器 | 后端负载差异大时 |
-
- 配置示例:
upstream backend {
ip_hash; # 启用IP哈希策略
server 192.168.1.101 weight=3; # 权重3
server 192.168.1.102 weight=2; # 权重2
server 192.168.1.103 down; # 标记为不可用
}
server {
listen 80;
location / {
proxy_pass http://backend; # 引用upstream
}
}
- 静态资源服务
-
- 优势:Nginx 处理静态资源(HTML、CSS、JS、图片)效率远高于 Tomcat 等应用服务器。
-
- 核心配置:
server {
listen 80;
server_name static.example.com;
root /usr/share/nginx/static; # 静态资源目录
# 缓存配置(减少重复请求)
location ~* \.(jpg|jpeg|png|css|js)$ {
expires 7d; # 缓存7天
add_header Cache-Control "public";
}
}
- 动静分离
-
- 定义:静态资源(HTML、图片)由 Nginx 直接处理,动态资源(JSP、PHP)转发到后端应用服务器。
-
- 作用:减轻后端服务器压力,提高访问速度。
-
- 配置示例:
server {
listen 80;
server_name example.com;
# 静态资源(Nginx直接处理)
location ~* \.(html|css|js|jpg)$ {
root /usr/share/nginx/static;
}
# 动态资源(转发到Tomcat)
location /api {
proxy_pass http://tomcat_server:8080;
}
}
- SSL/TLS 加密(HTTPS)
-
- 作用:通过 SSL 证书加密传输,保障数据安全。
-
- 核心配置:
server {
listen 443 ssl;
server_name example.com;
# SSL证书配置
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
# 加密协议优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
}
# HTTP自动跳转HTTPS
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}
三、Nginx 配置文件结构
核心配置文件:/etc/nginx/nginx.conf(主配置)、/etc/nginx/conf.d/(子配置,通过include引入)。
配置结构(从外到内)
# 1. 全局块(main):影响整个Nginx
user nginx; # 运行用户
worker_processes auto; # worker进程数(建议设为CPU核心数)
error_log /var/log/nginx/error.log; # 错误日志
# 2. 事件块(events):影响Nginx网络连接
events {
worker_connections 10240; # 每个worker最大连接数
use epoll; # 事件驱动模型(Linux推荐epoll)
}
# 3. HTTP块:HTTP协议相关配置(可包含多个server)
http {
include mime.types; # MIME类型
default_type application/octet-stream;
# 4. 上游服务器(负载均衡)
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
}
# 5. 服务器块(server):虚拟主机配置
server {
listen 80; # 监听端口
server_name example.com; # 域名
# 6. location块:匹配URL路径,处理请求
location / {
root /usr/share/nginx/html;
index index.html;
}
}
}
四、Nginx 性能优化核心配置
- 并发连接优化
events {
worker_connections 10240; # 每个worker最大连接数(默认1024)
multi_accept on; # 允许worker同时接收多个连接
}
-
- 最大并发数 = worker_processes × worker_connections
- 连接超时优化
http {
keepalive_timeout 65; # 长连接超时时间(默认75s)
tcp_nodelay on; # 禁用Nagle算法,减少延迟
client_header_timeout 10s; # 客户端请求头超时
client_body_timeout 10s; # 客户端请求体超时
}
- 缓存与压缩优化
# 启用gzip压缩(减小传输体积)
gzip on;
gzip_types text/plain text/css application/json; # 压缩指定类型
gzip_comp_level 5; # 压缩级别(1-9,5平衡性能和压缩率)
# 静态资源缓存
location ~* \.(jpg|css|js)$ {
expires 30d; # 缓存30天
add_header Cache-Control "public, max-age=2592000";
}
- CPU 亲和性(减少进程切换)
worker_processes 4; # 4核CPU
worker_cpu_affinity 0001 0010 0100 1000; # 绑定每个worker到不同核心
五、Nginx 常见问题及解决方案
- 502 Bad Gateway
-
- 原因:后端服务器未启动、后端崩溃、连接超时。
-
- 排查:
-
-
- 检查后端服务器是否正常:curl http://backend_server
-
-
-
- 增加超时配置:
-
location / {
proxy_pass http://backend;
proxy_connect_timeout 30s; # 连接后端超时
proxy_read_timeout 60s; # 读取后端响应超时
}
- 504 Gateway Timeout
-
- 原因:后端处理请求超时(如数据库查询慢)。
-
- 解决:
-
-
- 优化后端业务逻辑(如减少查询耗时)。
-
-
-
- 调整 Nginx 超时参数:proxy_read_timeout 120s;
-
Nginx 启动失败
-
- 常见原因:配置文件语法错误(nginx -t检查)、端口被占用(netstat -tulpn | grep 80)。
- 如何实现 Nginx 高可用?
-
- 方案:结合Keepalived实现主从架构,主节点故障时自动切换到从节点。
-
- 核心:双机共享虚拟 IP(VIP),通过健康检查监测 Nginx 状态。
六、Nginx 高频面试题
- Nginx 的 worker 进程数为什么设为 CPU 核心数?
-
- 答:Nginx 基于异步非阻塞模型,每个 worker 进程可处理多个连接;绑定 CPU 核心能减少进程切换开销,充分利用多核性能。
- 反向代理和正向代理的区别?
-
- 正向代理:代理客户端(如 VPN),客户端知道目标服务器。
-
- 反向代理:代理服务器(如 Nginx),客户端不知道后端服务器。
- Nginx 负载均衡的 ip_hash 策略解决了什么问题?
-
- 答:解决会话保持问题(如用户登录状态),确保同一用户的请求始终分发到同一后端服务器。
- 如何查看 Nginx 的访问日志和错误日志?
-
- 访问日志:默认/var/log/nginx/access.log(记录请求来源、URL、状态码)。
-
- 错误日志:默认/var/log/nginx/error.log(记录启动、运行错误)。
- Nginx 如何实现限流?
-
- 用limit_req模块限制请求频率:
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; # 每IP每秒10个请求
server {
location / {
limit_req zone=one burst=5; # 允许5个突发请求
}
}
}