一、引言:配置即代码,场景即价值
Nginx 的强大并非源于其二进制文件本身,而是源于那份名为nginx.conf的配置文件。它就像一份精确的“作战指令”,告诉 Nginx 如何处理流量、如何与后端交互、如何保障安全。
然而,面对眼花缭乱的指令和模块,初学者往往感到无从下手。本文采用“结构先行,场景驱动”的方式,先为你拆解 Nginx 配置文件的核心骨架,再通过六个最经典的应用场景,手把手教你如何编写出高效、可靠的配置。
💡核心价值:
学完本文,你不仅能看懂任何 Nginx 配置,更能根据自己的业务需求,独立设计并实现完整的解决方案!
二、基石:Nginx 配置文件的核心骨架
一个标准的nginx.conf文件遵循清晰的层次化结构,主要由五大块组成:
# ============ 1. 全局块 (Global Block) ============ # 影响整个 Nginx 服务的指令 user nginx; worker_processes auto; # 通常设为CPU核心数 error_log /var/log/nginx/error.log warn; pid /run/nginx.pid; # ============ 2. Events 块 ============ # 配置网络连接处理模型 events { worker_connections 1024; # 单个Worker能处理的最大连接数 use epoll; # Linux下高性能的事件驱动模型 } # ============ 3. HTTP 块 (核心!) ============ # 所有HTTP相关配置都在这里 http { include /etc/nginx/mime.types; # 引入MIME类型 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; # ============ 4. Server 块 (虚拟主机) ============ # 定义一个独立的网站或服务 server { listen 80; server_name example.com; # ============ 5. Location 块 (路径匹配) ============ # 定义针对特定URL路径的处理规则 location / { root /usr/share/nginx/html; index index.html; } } # 可以包含多个 server 块 server { ... } }理解这五大块的关系至关重要:
- 全局块和Events块是全局设置。
- HTTP块是所有 Web 服务的容器。
- Server块在 HTTP 块内,用于定义不同的虚拟主机(基于域名或IP)。
- Location块在 Server 块内,用于精细化控制不同 URL 路径的行为。
掌握了这个骨架,我们就可以开始填充具体的业务逻辑了。
三、实战:六大核心应用场景与配置详解
场景一:静态网站托管(最基础)
目标:部署一个纯前端项目(如 Vue/React 构建产物)。
配置要点:
- 使用
root指令指定网站根目录。 - 使用
index指定默认首页。 - 对于 SPA 应用,需配置
try_files以支持前端路由。
server { listen 80; server_name my-frontend-app.com; root /var/www/my-app/dist; # 前端构建产物目录 index index.html; # SPA 路由支持:所有请求都返回 index.html location / { try_files $uri $uri/ /index.html; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control "public, immutable"; } }场景二:反向代理(最常用)
目标:将api.example.com的请求转发给后端 Java/Node.js 服务。
配置要点:
- 使用
proxy_pass指向后端地址。 - 必须设置
proxy_set_header传递客户端真实信息。
server { listen 80; server_name api.example.com; location / { proxy_pass http://localhost: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; } }场景三:负载均衡(高可用必备)
目标:将流量分发到多台后端服务器,提升系统吞吐量和容错能力。
配置要点:
- 使用
upstream块定义服务器组。 - 选择合适的负载均衡策略(轮询、加权、IP哈希等)。
# 定义上游服务器组 upstream backend_servers { # 加权轮询 server 192.168.1.10:8080 weight=3; server 192.168.1.11:8080 weight=1; # 备份服务器 server 192.168.1.12:8080 backup; } server { listen 80; server_name app.example.com; location / { proxy_pass http://backend_servers; # 转发到 upstream proxy_set_header ...; # 同上,略 } }场景四:动静分离(性能优化)
目标:让 Nginx 直接处理静态文件,动态请求才交给后端,减轻后端压力。
配置要点:
- 使用
location的正则匹配区分静态和动态请求。
server { listen 80; server_name www.example.com; root /var/www/html; # 静态资源由 Nginx 直接返回 location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ { expires 30d; } # 动态请求(如 /api/)代理给后端 location /api/ { proxy_pass http://backend_app; proxy_set_header ...; } }场景五:HTTPS/SSL 终结(安全基石)
目标:为网站启用 HTTPS,统一处理加密解密。
配置要点:
- 监听
443 ssl端口。 - 指定证书和私钥路径。
- 通常配合 HTTP 到 HTTPS 的重定向。
# HTTP -> HTTPS 重定向 server { listen 80; server_name secure.example.com; return 301 https://$server_name$request_uri; } # HTTPS 服务 server { listen 443 ssl http2; server_name secure.example.com; ssl_certificate /path/to/fullchain.pem; # 证书 ssl_certificate_key /path/to/privkey.pem; # 私钥 # 推荐的安全配置 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers off; location / { proxy_pass http://backend; proxy_set_header ...; } }场景六:API 网关(微服务入口)
目标:作为微服务架构的统一入口,进行路由、限流和认证。
配置要点:
- 使用多个
location块进行路径路由。 - 结合
limit_req模块进行限流。
server { listen 443 ssl; server_name gateway.example.com; # 用户服务 location /api/users/ { proxy_pass http://user-service-cluster; } # 订单服务 location /api/orders/ { proxy_pass http://order-service-cluster; } # 全局限流:每秒最多10个请求,突发20个 limit_req_zone $binary_remote_addr zone=global_limit:10m rate=10r/s; limit_req zone=global_limit burst=20 nodelay; # 限流应用于所有API location /api/ { limit_req zone=global_limit; proxy_pass http://backend; } }四、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!