🚀 高性能反向代理服务器 —— Nginx 完整使用手册
适配场景:静态资源托管、动态服务代理、负载均衡、动静分离、高并发架构
支持平台:Linux(CentOS / Ubuntu)、Docker、云服务器
推荐组合:Nginx + uWSGI + Python/Django/Flask/Nginx + Docker
一、什么是 Nginx?
Nginx(发音:engine-x)是一个高性能的 HTTP 服务器 和 反向代理服务器,以其 低内存占用 和 超高并发处理能力 著称。
🔍 核心特点
| 特性 | 说明 |
|---|---|
| 高并发 | 支持 >50,000 个并发连接(实测可达 10万+) |
| 低资源消耗 | 内存占用极小,远低于 Apache |
| 高性能 | 事件驱动模型(异步非阻塞),适合高负载场景 |
| 可扩展性强 | 支持模块化设计,可灵活集成缓存、认证、限流等功能 |
✅ 当前全球约 40% 的网站使用 Nginx 作为前端入口,包括 Netflix、GitHub、京东等大型平台。
二、Nginx 的主要用途
| 功能 | 说明 |
|---|---|
| ✅ Web 服务器 | 提供静态文件服务(如 HTML、CSS、JS、图片) |
| ✅ 反向代理 | 将请求转发给后端应用服务器(如 Django、Spring Boot、uWSGI) |
| ✅ 负载均衡 | 分发请求到多个后端节点,提升系统可用性与吞吐量 |
| ✅ 动静分离 | 将静态资源由 Nginx 直接响应,减轻后端压力 |
| ✅ 安全防护 | 配合防火墙、限流、HTTPS 实现基础安全策略 |
三、安装 Nginx
✅ CentOS/RHEL 系统
sudo yum update -y
sudo yum install -y nginx
✅ Ubuntu/Debian 系统
sudo apt update -y
sudo apt install -y nginx
💡 安装完成后,终端输出
Complete!表示成功。
🔍 查看版本号
nginx -v
# 显示:nginx version: nginx/1.24.0
四、Nginx 常用命令(核心操作)
| 命令 | 作用 |
|---|---|
nginx |
启动服务(默认读取 /etc/nginx/nginx.conf) |
nginx -s stop |
快速关闭(不保存状态,立即终止) |
nginx -s quit |
优雅关闭(完成当前请求后再退出) |
nginx -s reload |
重载配置文件(推荐用于热更新) |
nginx -s reopen |
重新打开日志文件(便于轮转日志) |
nginx -c /path/to/config.conf |
指定配置文件路径启动 |
nginx -t |
测试配置文件语法是否正确 |
nginx -v |
显示版本信息 |
nginx -V |
显示版本 + 编译参数 + 编译器版本 |
✅ 最佳实践:修改配置后务必先测试再重载!
sudo nginx -t && sudo nginx -s reload
五、启动、停止、重启服务
⚙️ 系统服务管理(推荐方式)
✅ 启动
# CentOS 7+
sudo systemctl start nginx
# Ubuntu
sudo systemctl start nginx
✅ 停止
sudo systemctl stop nginx
✅ 重启
sudo systemctl restart nginx
✅ 查看状态
sudo systemctl status nginx
✅ 若提示“Active: active (running)”,表示运行正常。
六、解决 403 Forbidden 错误(常见问题)
当你访问页面返回 403 Forbidden,请按以下步骤排查:
❌ 问题 1:用户权限不一致
- 查看 Nginx 工作进程所属用户:
ps aux | grep "nginx: worker process" | awk '{print $1}'
- 修改
nginx.conf中的user指令:
user www-data; # 例如:Ubuntu 默认为 www-data
# 或
user nginx;
✅ 重启服务使生效:
sudo systemctl restart nginx
❌ 问题 2:缺少默认首页文件
在 location 配置中指定了 index index.html,但目录下无该文件:
server {
listen 80;
server_name localhost;
root /data/www;
index index.html index.htm; # 必须存在这些文件
}
✅ 解决方案:
echo "<h1>Welcome to Nginx!</h1>" > /data/www/index.html
sudo systemctl restart nginx
❌ 问题 3:目录权限不足
如果 Nginx 用户(如 www-data)无法读取 /data/www 目录:
# 授予所有者读写权限(仅测试阶段)
sudo chmod -R 755 /data/www
# 更安全做法:设置属主为 nginx
sudo chown -R www-data:www-data /data/www
sudo chmod -R 755 /data/www
✅ 推荐使用
755权限,避免777导致安全隐患。
❌ 问题 4:SELinux 限制(CentOS/RHEL)
查看状态:
/usr/sbin/sestatus
若显示 SELinux status: enabled,则可能阻止访问。
✅ 临时解决方案(测试阶段):
sudo setenforce 0
✅ 永久关闭(需编辑配置):
sudo vim /etc/selinux/config
修改为:
SELINUX=disabled
⚠️ 重启生效:
sudo reboot
💡 警告:生产环境不应关闭 SELinux,应使用
setsebool或chcon设置特定目录的上下文。
sudo setsebool -P httpd_can_network_connect on
sudo chcon -R -t httpd_exec_t /data/www
七、Nginx 配置详解:location 指令
🔧 指令语法
location [modifier] /pattern/ {
...
}
| 修饰符 | 说明 |
|---|---|
= |
精确匹配(优先级最高) |
^~ |
前缀匹配,不进行正则匹配(效率高) |
~ |
区分大小写的正则匹配 |
~* |
不区分大小写的正则匹配 |
| 无修饰符 | 普通前缀匹配(模糊匹配) |
📌 示例:静态资源与动态代理分离
server {
listen 80;
server_name localhost;
# 静态资源(优先级高于正则)
location ~* \.(gif|jpg|png|css|js|html)$ {
root /usr/share/nginx/statics;
expires 1y;
add_header Cache-Control "public, immutable";
}
# 动态请求代理
location /api/ {
proxy_pass http://127.0.0.1:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 10s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
# 默认路由到后端应用
location / {
proxy_pass http://127.0.0.1:8080/;
}
}
✅ 推荐:对静态资源添加
expires头和缓存控制。
八、反向代理配置(核心功能)
✅ 应用场景
将 http://yourdomain.com/api/ 请求转发至后端应用服务(如 Flask、Django、uWSGI)。
📂 配置方式一:使用 proxy_pass
location /api/ {
proxy_pass http://127.0.0.1:8081/;
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;
}
📂 配置方式二:使用 uwsgi_pass(uWSGI 协议)
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8081;
}
✅ 适用于 Python Web 框架(Django/Flask)通过 uWSGI 运行。
九、负载均衡配置(多实例部署)
✅ 定义上游服务器组
upstream myapp {
# 轮询(默认)
server 192.168.1.10:8080;
server 192.168.1.11:8080;
# 权重分配(能力越大,处理越多)
# server 192.168.1.12:8080 weight=2;
# IP哈希(保证同一客户端始终访问同一后端)
# ip_hash;
# 会话保持 + 权重
ip_hash;
server 192.168.1.13:8080 weight=1;
server 192.168.1.14:8080 weight=2;
}
✅ 应用到 Server 块
server {
listen 80;
server_name app.yourdomain.com;
location / {
proxy_pass http://myapp;
proxy_connect_timeout 10s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
}
}
✅ Nginx 支持三种负载均衡策略:
| 策略 | 特点 | 使用场景 |
|---|---|---|
| 轮询 | 默认方式,按顺序分配 | 通用场景 |
| 权重 | 高性能机器承担更多请求 | 异构集群 |
| IP哈希 | 同一用户固定访问同一节点 | 解决 session 共享问题 |
十、动静分离(性能优化关键)
目标:让静态资源由 Nginx 直接响应,减少后端应用压力。
🎯 架构图说明
浏览器 → [请求] →
↓
[Nginx 代理] ←─┐
↓ │
[静态资源] ←───────┘ [动态资源 → uWSGI → Python App]
✅ 配置示例(基于 Docker)
📁 目录结构
/opt/docker_nginx/
├── conf.d/
│ └── default.conf
├── statics/
│ ├── style.css
│ ├── script.js
│ └── avatar.jpg
📄 default.conf
server {
listen 80;
server_name localhost;
# 静态资源路径
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ {
root /usr/share/nginx/statics;
expires 1y;
add_header Cache-Control "public, immutable";
}
# 动态请求代理
location / {
proxy_pass http://192.168.174.128:8080/;
}
}
📄 docker-compose.yml
version: '3.1'
services:
nginx:
image: nginx:alpine
container_name: nginx-proxy
ports:
- "80:80"
volumes:
- ./conf.d:/etc/nginx/conf.d
- ./statics:/usr/share/nginx/statics
restart: always
⚠️ 权限问题修复:
# 给静态目录赋权
chmod -R 755 /opt/docker_nginx/statics/
chown -R 101:101 /opt/docker_nginx/statics/ # nginx 容器内用户 UID
✅ 访问测试:
http://localhost/style.css应能直接返回文件。
十一、高级功能建议(生产必备)
| 功能 | 说明 | 配置建议 |
|---|---|---|
| ✅ HTTPS + Let's Encrypt | 加密传输,防监听 | 使用 Certbot 自动申请证书 |
| ✅ 限流(Rate Limiting) | 防止恶意刷接口 |
limit_req_zone, limit_conn
|
| ✅ Gzip 压缩 | 减少传输体积 | gzip on; gzip_types text/css text/javascript; |
| ✅ 访问日志分析 | 监控流量与异常 | 使用 ELK/Sentry 进行日志采集 |
| ✅ 自动健康检查 | 检测后端节点可用性 |
health_check 模块(需编译) |
🔗 Let's Encrypt 配置教程参考:https://certbot.eff.org
十二、总结:最佳实践清单
✅ 必须遵守的 10 条黄金法则:
| 项目 | 推荐做法 |
|---|---|
| 1. 安装方式 | 使用官方包管理器或 Docker |
| 2. 配置文件 | 使用 .conf 文件拆分,避免主配置臃肿 |
| 3. 静态资源 | 交由 Nginx 托管,开启缓存 |
| 4. 动态请求 | 通过 proxy_pass 转发给后端 |
| 5. 日志管理 | 使用 logrotate 轮转日志 |
| 6. 安全防护 | 关闭不必要的模块,禁用 server_tokens
|
| 7. 服务管理 | 使用 systemctl 管理生命周期 |
| 8. 权限控制 | 避免 777,使用最小权限原则 |
| 9. 依赖隔离 | 生产环境建议使用容器部署 |
| 10. 监控告警 | 结合 Prometheus + Grafana 实时监控 |
📌 附录:一键部署脚本模板
💻 setup-nginx.sh
#!/bin/bash
echo "🚀 正在部署 Nginx 动静分离服务..."
# 创建目录
mkdir -p /opt/docker_nginx/{conf.d,statics}
# 写入配置
cat > /opt/docker_nginx/conf.d/default.conf <<'EOF'
server {
listen 80;
server_name localhost;
location ~* \.(css|js|png|jpg|jpeg|gif|ico|svg)$ {
root /usr/share/nginx/statics;
expires 1y;
add_header Cache-Control "public, immutable";
}
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
}
}
EOF
# 创建静态文件夹并赋权
touch /opt/docker_nginx/statics/test.png
chmod -R 755 /opt/docker_nginx/statics
chown -R 101:101 /opt/docker_nginx/statics
# 启动 Docker
docker-compose up -d
echo "✅ Nginx 静动分离部署完成!"
echo "🌐 访问地址:http://localhost/test.png"
✅ 使用方法:
chmod +x setup-nginx.sh
sudo ./setup-nginx.sh
🔗 官方文档:https://nginx.org/en/docs/