Nginx

🚀 高性能反向代理服务器 —— 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,应使用 setseboolchcon 设置特定目录的上下文。

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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容