← 回到列表
Nginx 配置知识总结与面试题
这一页
Nginx 配置知识总结与面试题
Nginx 的配置与运维实践:讲解 master-worker 架构、配置文件层级结构,给出反向代理、负载均衡、HTTPS、静态资源缓存等常用配置示例,并附性能优化要点与面试题。
一、Nginx 基础概念
1. 什么是 Nginx?
- 高性能的 HTTP 和反向代理服务器
- 事件驱动、异步非阻塞架构
- 轻量级、内存占用少、并发能力强
- 常用于静态资源服务、反向代理、负载均衡
2. Nginx 核心特点
- 高并发:基于事件驱动,能处理数万级并发连接
- 高性能:内存占用低,响应速度快
- 模块化设计:支持多种模块扩展
- 热部署:支持平滑升级和配置重载
3. Nginx 应用场景
- 静态资源服务(HTML、CSS、JS、图片)
- 反向代理(负载均衡、缓存)
- API 网关
- HTTPS 证书配置
- 动静分离
二、Nginx 架构
1. 进程模型
┌─────────────────────────────────────────────┐│ Master Process ││ - 读取配置文件 ││ - 管理 Worker 进程 ││ - 监听信号(如 reload、stop) │└───────────────────┬─────────────────────────┘ │ ┌───────────┼───────────┐ ▼ ▼ ▼┌─────────────┐ ┌─────────────┐ ┌─────────────┐│ Worker 1 │ │ Worker 2 │ │ Worker N ││ - 处理请求 │ │ - 处理请求 │ │ - 处理请求 ││ - 连接管理 │ │ - 连接管理 │ │ - 连接管理 │└─────────────┘ └─────────────┘ └─────────────┘2. 事件驱动机制
- 使用 epoll(Linux)或 kqueue(BSD)实现高效的事件监听
- 每个 Worker 进程可以处理数千个并发连接
- 非阻塞 I/O,避免线程阻塞
三、核心配置文件结构
1. 主配置文件 nginx.conf
# 全局配置user nginx;worker_processes auto; # 工作进程数,通常设为 CPU 核心数error_log /var/log/nginx/error.log;pid /var/run/nginx.pid;# 事件配置events { worker_connections 1024; # 每个 Worker 最大连接数 use epoll; # 使用 epoll 事件模型 multi_accept on; # 尽可能多地接收连接}# HTTP 配置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; # 启用零拷贝 tcp_nopush on; # 发送数据时合并包 tcp_nodelay on; # 不延迟发送小数据包 keepalive_timeout 65; # 长连接超时时间 # 包含其他配置文件 include /etc/nginx/conf.d/*.conf;}2. Server 配置
server { listen 80; server_name example.com www.example.com; # 根目录和默认页面 root /usr/share/nginx/html; index index.html index.htm; # 访问日志 access_log /var/log/nginx/example.access.log main; # 错误页面 error_page 404 /404.html; error_page 500 502 503 504 /50x.html; # 位置匹配 location / { try_files $uri $uri/ =404; }}四、常用配置示例
1. 反向代理
server { listen 80; server_name api.example.com; location / { proxy_pass http://127.0.0.1:3000; 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; }}2. 负载均衡
http { upstream backend { # 轮询(默认) server 192.168.1.100:8080; server 192.168.1.101:8080; server 192.168.1.102:8080 backup; # 备份服务器 } server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_set_header Host $host; } }}3. 负载均衡策略
| 策略 | 说明 |
|---|---|
round_robin |
轮询(默认) |
least_conn |
最少连接数 |
ip_hash |
基于客户端 IP 哈希 |
weight |
加权轮询 |
upstream backend { ip_hash; # 基于 IP 哈希 server 192.168.1.100:8080 weight=3; server 192.168.1.101:8080 weight=2; server 192.168.1.102:8080;}4. HTTPS 配置
server { listen 443 ssl http2; server_name example.com; ssl_certificate /etc/nginx/ssl/example.crt; ssl_certificate_key /etc/nginx/ssl/example.key; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers off; location / { root /usr/share/nginx/html; index index.html; }}# HTTP 重定向到 HTTPSserver { listen 80; server_name example.com; return 301 https://$server_name$request_uri;}5. 静态资源缓存
server { listen 80; server_name example.com; location /static/ { root /var/www; expires 30d; # 缓存 30 天 add_header Cache-Control "public, immutable"; } location ~* \.(jpg|jpeg|png|gif|svg|css|js)$ { root /var/www; expires 7d; add_header Cache-Control "public"; }}6. Gzip 压缩
http { gzip on; gzip_vary on; gzip_min_length 1024; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;}7. 限流配置
http { limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s; server { location /api/ { limit_req zone=mylimit burst=20 nodelay; proxy_pass http://backend; } }}8. 防盗链
server { listen 80; server_name example.com; location ~* \.(jpg|png|gif)$ { valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; } }}五、常用命令
# 启动 Nginxnginx# 停止 Nginxnginx -s stop# 优雅停止nginx -s quit# 重新加载配置nginx -s reload# 测试配置文件nginx -t# 查看版本nginx -v# 查看详细信息nginx -V六、Nginx 模块
1. 核心模块
ngx_http_core_module:核心 HTTP 功能ngx_http_access_module:访问控制ngx_http_auth_basic_module:基本认证ngx_http_gzip_module:Gzip 压缩
2. 第三方模块
ngx_http_rewrite_module:URL 重写ngx_http_proxy_module:反向代理ngx_http_upstream_module:负载均衡ngx_http_ssl_module:SSL/TLS 支持
七、性能优化
1. Worker 进程优化
worker_processes auto; # 设置为 CPU 核心数worker_cpu_affinity auto; # 绑定 CPU 核心worker_rlimit_nofile 65535; # 增大文件描述符限制2. 连接优化
events { worker_connections 10240; # 增大连接数 use epoll; multi_accept on;}3. 缓存优化
http { proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; server { location /api/ { proxy_cache my_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; } }}八、常见面试题
基础概念
Q1:Nginx 是什么?它的主要特点是什么?
- 高性能 HTTP 和反向代理服务器
- 事件驱动、异步非阻塞架构
- 高并发、低内存占用、热部署
Q2:Nginx 的进程模型是怎样的?
- Master 进程:管理配置和 Worker 进程
- Worker 进程:处理实际请求
- 每个 Worker 进程独立处理连接,避免锁竞争
Q3:Nginx 和 Apache 的区别?
| 维度 | Nginx | Apache |
|---|---|---|
| 架构 | 事件驱动 | 多进程/多线程 |
| 并发能力 | 高(万级) | 中等(千级) |
| 内存占用 | 低 | 高 |
| 静态资源 | 优秀 | 一般 |
配置相关
Q4:如何配置反向代理?
- 使用
proxy_pass指令 - 设置
proxy_set_header传递请求头 - 配置超时时间和缓冲区
Q5:Nginx 有哪些负载均衡策略?
- 轮询(默认)
- 最少连接数(least_conn)
- IP 哈希(ip_hash)
- 加权轮询(weight)
Q6:如何配置 HTTPS?
- 配置 SSL 证书和密钥
- 设置 SSL 协议版本和加密套件
- 配置 HTTP 到 HTTPS 的重定向
进阶问题
Q7:Nginx 如何处理请求的?
- 接收连接
- 解析请求行和请求头
- 查找匹配的 Server
- 查找匹配的 Location
- 处理请求(静态文件或反向代理)
- 返回响应
Q8:什么是 Keep-Alive?如何配置?
- 保持长连接,避免频繁建立 TCP 连接
- 通过
keepalive_timeout配置超时时间 - 通过
keepalive_requests配置每个连接处理的请求数
Q9:如何实现动静分离?
- 将静态资源和动态请求分开处理
- 静态资源直接返回,动态请求转发到后端
- 使用
location匹配不同类型的请求
Q10:Nginx 如何实现限流?
- 使用
limit_req_zone定义限流规则 - 使用
limit_req应用限流规则 - 配置 burst 和 nodelay 参数处理突发流量
性能优化
Q11:如何优化 Nginx 性能?
- 调整 Worker 进程数和连接数
- 启用 sendfile 和 tcp_nopush
- 配置 Gzip 压缩
- 使用缓存减少后端压力
- 优化 SSL 配置
Q12:Nginx 日志分为哪几种?
- access_log:访问日志,记录所有请求
- error_log:错误日志,记录服务器错误
实战经验
Q13:如何实现 URL 重写?
- 使用
rewrite指令 - 支持正则表达式匹配
- 可以重定向或内部重写
Q14:如何配置防盗链?
- 使用
valid_referers指令 - 检查 Referer 请求头
- 对于非法请求返回 403
Q15:Nginx 如何处理大文件上传?
- 调整
client_max_body_size - 配置
client_body_buffer_size - 使用
proxy_request_buffering off禁用请求缓冲
九、注意事项
- 配置语法:Nginx 配置文件使用分号结尾,注意括号匹配
- 路径问题:使用绝对路径,避免相对路径
- 权限问题:确保 Nginx 进程对文件和目录有访问权限
- 日志管理:定期清理日志文件,避免磁盘空间不足
- 安全加固:禁用不必要的模块,限制访问权限
十、总结
Nginx 是一个高性能的 Web 服务器和反向代理服务器,广泛应用于现代 Web 架构中。掌握其核心配置、负载均衡、反向代理和性能优化技巧,是成为优秀运维工程师或后端开发者的必备技能。