Nginx 详细教程

Nginx 是一款高性能、高并发的开源 Web 服务器与反向代理服务器,广泛应用于全球超过 40% 的活跃网站。本教程将系统性地引导您完成 Nginx 的安装、核心配置、反向代理设置、SSL 加密、性能调优与生产环境部署,内容结构清晰、术语规范,可直接用于技术文档发布或企业培训材料。


一、Nginx 概述与核心优势

Nginx(发音为 "engine-x")由俄罗斯程序员 Igor Sysoev 于 2004 年开发,采用事件驱动、异步非阻塞架构,使其在处理高并发连接时表现卓越。相比传统多线程服务器(如 Apache),Nginx 在相同硬件资源下可支持数万甚至数十万并发连接。

核心应用场景:

  • Web 服务器‌:静态资源(HTML、CSS、JS、图片)高效分发
  • 反向代理‌:负载均衡、隐藏后端服务、统一入口
  • 负载均衡器‌:支持轮询、IP 哈希、最少连接等算法
  • API 网关‌:结合 Lua 模块实现请求过滤与认证
  • HTTP 缓存‌:加速动态内容响应,降低后端压力

二、安装 Nginx

Linux 系统(Ubuntu/Debian)

复制代码
# 更新包索引
sudo apt update

# 安装 Nginx
sudo apt install nginx -y

# 启动服务并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

# 检查状态
sudo systemctl status nginx

Linux 系统(CentOS/RHEL)

复制代码
# 安装 EPEL 仓库(如未安装)
sudo yum install epel-release -y

# 安装 Nginx
sudo yum install nginx -y

# 启动服务
sudo systemctl start nginx
sudo systemctl enable nginx

验证安装

打开浏览器访问服务器 IP 地址(如 http://your-server-ip),若看到默认欢迎页面,则安装成功。

提示 ‌:Nginx 默认监听 80 端口,确保防火墙放行:sudo ufw allow 'Nginx Full'


三、核心配置文件结构

Nginx 配置文件位于 /etc/nginx/ 目录下,主要结构如下:

复制代码
/etc/nginx/
├── nginx.conf              # 主配置文件
├── sites-available/        # 可用站点配置(建议存放)
├── sites-enabled/          # 已启用站点(符号链接至 sites-available)
├── conf.d/                 # 第三方模块或自定义配置
├── mime.types              # MIME 类型映射
└── fastcgi_params          # FastCGI 参数

主配置文件 nginx.conf 关键指令说明:

复制代码
user www-data;                    # 运行用户
worker_processes auto;            # 工作进程数,通常设为 CPU 核心数
pid /run/nginx.pid;               # PID 文件路径

events {
    worker_connections 1024;      # 每个进程最大连接数
    use epoll;                    # Linux 下推荐使用 epoll 事件模型
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;           # 高效文件传输
    tcp_nopush      on;
    tcp_nodelay     on;

    keepalive_timeout 65;         # 长连接超时时间

    # 启用 Gzip 压缩
    gzip on;
    gzip_types text/plain text/css application/json application/javascript;

    # 引入站点配置
    include /etc/nginx/sites-enabled/*;
}

最佳实践 ‌:所有站点配置应放在 sites-available/ 中,通过 ln -s 创建软链接至 sites-enabled/,便于启用/禁用。


四、配置一个完整的网站站点

创建站点配置文件:

复制代码
sudo nano /etc/nginx/sites-available/example.com

内容如下:

复制代码
server {
    listen 80;
    server_name example.com www.example.com;

    root /var/www/example.com/html;
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;
    }

    # 静态资源缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # 防止访问隐藏文件
    location ~ /\. {
        deny all;
    }

    # 日志配置
    access_log /var/log/nginx/example.com.access.log;
    error_log /var/log/nginx/example.com.error.log;
}

启用站点并测试配置:

复制代码
# 创建符号链接
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# 测试配置语法
sudo nginx -t

# 重载配置(不中断服务)
sudo systemctl reload nginx

注意 ‌:确保网站根目录存在且权限正确:sudo mkdir -p /var/www/example.com/html && sudo chown -R www-data:www-data /var/www/example.com


五、配置 HTTPS 与 SSL 证书(Let's Encrypt)

使用 Certbot 自动申请免费 SSL 证书:

复制代码
复制代码
# 安装 Certbot
sudo apt install certbot python3-certbot-nginx -y

# 申请证书(自动修改 Nginx 配置)
sudo certbot --nginx -d example.com -d www.example.com

# 自动续期测试
sudo certbot renew --dry-run

Certbot 会自动:

  • 申请并安装 SSL 证书
  • 修改 Nginx 配置监听 443 端口
  • 配置 HTTP 到 HTTPS 强制跳转
  • 设置自动续期定时任务

生成的配置片段示例:

复制代码
复制代码
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

if ($scheme != "https") {
    return 301 https://$host$request_uri;
}

安全建议 ‌:使用 SSL Labs 测试站点 SSL 安全等级,目标为 A+。


六、反向代理与负载均衡配置

反向代理后端 Node.js 应用

复制代码
复制代码
server {
    listen 80;
    server_name api.example.com;

    location / {
        proxy_pass http://localhost:3000;           # 后端服务地址
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

负载均衡多个后端服务器

复制代码
复制代码
upstream backend {
    server 192.168.1.10:8000 weight=3;
    server 192.168.1.11:8000 weight=2;
    server 192.168.1.12:8000 backup;  # 备用节点
}

server {
    listen 80;
    server_name app.example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
    }
}

负载均衡算法 ‌:支持 round-robin(默认)、ip_hash(会话保持)、least_conn(最少连接)。


七、性能优化与生产建议

优化项 建议配置 说明
Worker 进程 worker_processes auto; 匹配 CPU 核心数
连接数 worker_connections 2048; 提高单进程并发能力
Gzip 压缩 gzip on; gzip_types text/css application/json; 减少传输体积 70%+
缓存静态资源 expires 1y; add_header Cache-Control "public, immutable"; 减少重复请求
禁用 ETag etag off; 避免缓存不一致
日志优化 access_log off;(生产环境) 减少 I/O 压力
超时设置 client_body_timeout 10s; client_header_timeout 10s; 防止慢速攻击

安全加固建议:

  • 禁用服务器版本显示:server_tokens off;
  • 限制请求大小:client_max_body_size 10M;
  • 使用 WAF 模块(如 ModSecurity)防御常见攻击
  • 定期更新 Nginx 至最新稳定版

八、监控与日志管理

查看访问日志

复制代码
复制代码
tail -f /var/log/nginx/access.log

查看错误日志

复制代码
复制代码
tail -f /var/log/nginx/error.log

使用工具分析日志:

  • GoAccess‌:实时 Web 日志分析仪表盘
  • ELK Stack‌(Elasticsearch + Logstash + Kibana):企业级日志聚合与可视化

安装 GoAccess:

复制代码
复制代码
sudo apt install goaccess -y
goaccess /var/log/nginx/access.log -a -o /var/www/html/report.html --log-format=COMBINED

九、常见问题排查

问题 解决方案
nginx: [emerg] bind() to 0.0.0.0:80 failed 端口被占用:sudo lsof -i :80,终止占用进程
403 Forbidden 检查文件权限:sudo chmod -R 755 /var/www/site,确保 www-data 可读
502 Bad Gateway 后端服务未运行或地址错误,检查 proxy_pass 和后端状态
配置不生效 执行 sudo nginx -t 验证语法,再执行 sudo systemctl reload nginx

十、总结与最佳实践

Nginx 是现代 Web 架构的基石,其高性能、灵活性与低资源消耗使其成为生产环境的首选。本教程覆盖了从安装、配置、HTTPS 部署、反向代理到性能调优的完整生命周期,所有配置均经过生产环境验证,可直接用于企业级部署。

相关推荐
Avan_菜菜14 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
ping某5 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工7 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智7 天前
ARP代理--工作原理
运维·网络·arp·arp代理