一、核心底座:Nginx 简介与基础操作
1. 什么是 Nginx?
Nginx(engine x)是一款 高性能、轻量级 的 HTTP 服务器、反向代理服务器,同时支持 IMAP/POP3/SMTP 协议代理。由伊戈尔・赛索耶夫开发,2004 年首次公开版本,因稳定性强、资源消耗低、并发能力突出(支持高达 50,000 并发连接)被广泛应用,国内百度、京东、淘宝等大厂均在使用。
核心定位:作为系统入口,承担反向代理、负载均衡、动静分离等核心职责,是企业级应用架构的必备组件。
2. Nginx 核心优势
| 优势 | 说明 |
|---|---|
| 高性能 | 事件驱动 + 异步处理,并发能力强,适合高流量场景 |
| 高可靠性 | 支持 7*24 小时不间断运行,热部署无需重启 |
| 低资源消耗 | 轻量级设计,占用内存少,单机可支撑大量连接 |
| 灵活性强 | 配置文件简洁,支持多种自定义配置 |
| 扩展性好 | 模块化架构,可通过插件扩展功能(如缓存、SSL) |
| 跨平台 | 支持 Linux、Unix、MacOS 等多种操作系统 |
| 安全性高 | 内置防 DDoS、SQL 注入等基础安全防护 |
| 多协议支持 | 除 HTTP/HTTPS 外,还支持 SMTP、POP3 等协议 |
3. 下载与基础操作
(1)下载地址
官方网址:nginx.org/download/,提供 Mainline(开发版)、Stable(稳定版)、Legacy(legacy 版),推荐生产环境使用 Stable 版。
(2)目录结构(解压后)
| 目录 / 文件 | 说明 |
|---|---|
| conf | 配置文件目录(核心为 nginx.conf) |
| contrib | 辅助工具目录 |
| docs | 文档目录 |
| html | 默认静态资源目录 |
| logs | 日志文件目录(访问日志、错误日志) |
| temp | 临时文件目录 |
| nginx.exe | Windows 平台启动程序 |
(3)启动与停止
bash
# 启动(Windows 命令行,需切换到解压目录)
nginx.exe
# 启动验证:浏览器访问 http://localhost:80,出现 "Welcome to nginx!" 则成功
# 注意:安装目录不可含中文,否则启动报错
# 停止命令
nginx -s stop # 快速停止(可能丢失未保存数据)
nginx -s quit # 有序停止(安全关闭)
# 强制停止(Windows 适用)
taskkill /f /t /im nginx.exe
# 配置修改生效(热重载,无需重启)
nginx -s reload
二、核心功能一:反向代理(Nginx 核心能力)
1. 反向代理定义与对比
(1)正向代理 vs 反向代理
| 类型 | 核心特点 | 用途 | 访问链路 |
|---|---|---|---|
| 正向代理 | 客户端知道目标服务器,代理代表客户端访问 | 科学上网、缓存加速 | 客户端 → 正向代理 → 目标网站 |
| 反向代理 | 客户端不知道目标服务器,代理代表后端服务器提供服务 | 负载均衡、安全防护、统一入口 | 客户端 → 反向代理(Nginx) → 后端服务器群 |
(2)反向代理核心价值
- 隐藏后端服务器地址,提升安全性;
- 统一入口管理,简化配置;
- 为后续负载均衡、动静分离奠定基础。
2. 反向代理配置示例
(1)简单反向代理(代理本地应用)
nginx
http {
server {
listen 80; # 监听端口
server_name example.com; # 域名
location / {
proxy_pass http://localhost:3000; # 代理到本地3000端口应用
}
}
}
(2)完整基础配置(生产级)
nginx
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://127.0.0.1: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;
# 超时配置
proxy_connect_timeout 60s; # 连接超时
proxy_send_timeout 60s; # 发送超时
proxy_read_timeout 60s; # 读取超时
proxy_buffering off; # 关闭代理缓冲(适用于实时应用)
}
}
(3)带负载均衡的反向代理
nginx
http {
# 定义后端服务器组(负载均衡核心)
upstream backend_servers {
server 192.168.1.101:8080 weight=3; # 权重3,承担30%请求
server 192.168.1.102:8080 weight=2; # 权重2,承担20%请求
server 192.168.1.103:8080 weight=5; # 权重5,承担50%请求
max_fails=3; # 失败3次标记为不可用
fail_timeout=30s; # 30秒后重试不可用服务器
}
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_servers; # 代理到服务器组
# 失败重试配置
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3; # 最多重试3次
# 保持长连接
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
}
三、核心功能二:负载均衡(高可用核心)
1. 负载均衡定义
将客户端请求智能分发到多台后端服务器,避免单台服务器过载,提升系统吞吐量、可用性和扩展性。
2. 基础配置
nginx
http {
# 1. 定义上游服务器组
upstream backend_servers {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
# 2. 应用负载均衡
server {
listen 80;
server_name app.example.com;
location / {
proxy_pass http://backend_servers; # 指向服务器组
}
}
}
3. 核心负载均衡算法(5 种常用)
(1)轮询(Round Robin)- 默认
- 配置:无需额外参数,按顺序分发请求;
- 特点:简单公平,适用于后端服务器配置一致的场景;
- 示例:
nginx
upstream backend {
server 192.168.1.101:8080;
server 192.168.1.102:8080;
server 192.168.1.103:8080;
}
(2)权重轮询(Weighted Round Robin)
- 配置:通过
weight参数指定权重,权重越高处理请求越多; - 特点:适配服务器配置差异(CPU、内存不同);
- 示例:
nginx
upstream backend {
server 192.168.1.101:8080 weight=3; # 30%请求
server 192.168.1.102:8080 weight=5; # 50%请求
server 192.168.1.103:8080 weight=2; # 20%请求
}
(3)IP 哈希(IP Hash)- 会话保持
- 配置:添加
ip_hash;指令,基于客户端 IP 哈希分配; - 特点:同一 IP 始终访问同一服务器,适用于需要 Session 保持的场景;
- 示例:
nginx
upstream backend {
ip_hash; # 启用IP哈希
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
(4)最少连接(Least Connections)
- 配置:添加
least_conn;指令,请求分发到当前连接数最少的服务器; - 特点:适配请求处理时间不均的场景(如长连接应用);
- 示例:
nginx
upstream backend {
least_conn; # 启用最少连接算法
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
(5)一致性哈希(Consistent Hash)
- 配置:
hash $request_uri consistent;,基于请求 URI 哈希; - 特点:相同 URI 始终访问同一服务器,服务器扩容 / 缩容时影响最小;
- 示例:
nginx
upstream backend {
hash $request_uri consistent; # 基于URI的一致性哈希
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
四、核心功能三:动静分离(性能优化关键)
1. 动静分离定义
将静态资源请求 (图片、CSS、JS 等)与动态请求(API、业务逻辑、数据库操作)分开处理:
- 静态资源:由 Nginx 直接处理(无需转发到后端),速度快;
- 动态请求:转发到后端应用服务器(如 Java、Node.js 服务)处理。
2. 为什么需要动静分离?
- 性能提升:Nginx 处理静态资源效率是应用服务器的 10-100 倍;
- 降低负载:减少后端服务器的无效请求(如静态资源读取);
- 缓存友好:静态资源可设置长时间缓存,减少重复请求。
3. 基础配置示例
nginx
server {
listen 80;
server_name example.com;
root /var/www/html; # 静态资源根目录
# 静态资源处理(正则匹配常见静态文件后缀)
location ~* \.(jpg|jpeg|png|gif|ico|css|js|woff|woff2|ttf|svg)$ {
expires 30d; # 缓存30天
access_log off; # 不记录访问日志
add_header Cache-Control "public, immutable"; # 缓存策略
}
# 动态API请求转发
location /api/ {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 前端SPA应用转发
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
# 支持WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
4. 生产级完整配置(含优化)
nginx
http {
# 基础优化配置
sendfile on; # 开启高效文件传输
tcp_nopush on;
tcp_nodelay on;
# 文件缓存配置
open_file_cache max=10000 inactive=30s;
open_file_cache_valid 60s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
# Gzip压缩(提升传输效率)
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/json;
server {
listen 80;
server_name www.example.com;
root /var/www/example.com;
# 1. 图片资源配置
location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {
expires 365d; # 缓存1年
access_log off;
add_header Cache-Control "public, immutable";
# 防盗链(仅允许指定域名引用)
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
}
# 2. 样式/JS文件配置
location ~* \.(css|js)$ {
expires 30d;
access_log off;
add_header Cache-Control "public";
gzip_static on; # 启用预压缩文件
}
# 3. 字体文件配置(支持跨域)
location ~* \.(woff|woff2|ttf|eot|otf)$ {
expires 365d;
access_log off;
add_header Cache-Control "public, immutable";
add_header Access-Control-Allow-Origin "*";
}
# 4. 动态API请求
location /api/ {
proxy_pass http://api_backend:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 5s;
proxy_read_timeout 30s;
# 禁用缓存
proxy_no_cache 1;
proxy_cache_bypass 1;
}
# 5. WebSocket支持(如实时通讯)
location /ws/ {
proxy_pass http://websocket_backend:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s; # 长连接超时
}
# 6. 禁止访问敏感文件
location ~ /\. {
deny all; # 禁止访问隐藏文件(如.git)
}
location ~* \.(log|sql|bak|conf)$ {
deny all; # 禁止访问日志、配置等文件
}
# 7. 错误页面配置
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
internal;
}
}
}
五、核心总结与关键注意事项
1. 核心配置口诀
- 反向代理:proxy_pass 指向后端,真实 IP 头要传递;
- 负载均衡:upstream 定义服务器组,算法按需选(轮询 / 权重 / IP 哈希);
- 动静分离:静态资源直接处理,动态请求转发后端;
- 优化配置:gzip 压缩省带宽,缓存策略减请求。
2. 生产环境关键注意事项
- 端口占用:默认 80 端口若被占用,需修改 nginx.conf 中
listen端口; - 配置检查:修改配置后,可通过
nginx -t检查语法正确性; - 日志管理:定期清理 logs 目录日志,避免磁盘占满;
- 安全加固:禁用不必要的模块,限制访问敏感目录,配置 HTTPS 替代 HTTP;
- 性能调优:根据服务器配置调整
worker_processes(工作进程数)、worker_connections(最大连接数)。
3. 常见问题排查
- 启动失败:检查端口是否被占用、安装目录是否含中文、配置文件语法错误;
- 代理失效:确认 proxy_pass 地址正确,后端服务器可访问,防火墙未拦截;
- 静态资源 404:检查 root 目录配置正确,文件路径与 URL 对应。