📌 什么是 Nginx?
Nginx(发音为 “engine-x”)是一款由俄罗斯工程师 Igor Sysoev 开发的高性能 HTTP 服务器、反向代理服务器及邮件/通用 TCP/UDP 代理服务器。它采用异步非阻塞的**事件驱动架构(Event-driven)**与多进程 Master-Worker 模型。
相比于传统的 Apache Prefork 模型,Nginx 在面对**高并发连接(C10K/C100K 问题)**时展现出极低的内存占用与卓越的吞吐性能,是现代 Web 架构中处理动静分离、API 网关、SSL 卸载以及微服务负载均衡的绝对标配。
🛠️ 一、Linux 系统中安装指定版本 Nginx
Nginx 官方维护两个分支:
- Mainline(主线版):包含最新功能与性能改进,更新频率高。
- Stable(稳定版):经过充分验证,仅修复重大 Bug 与安全漏洞,生产环境首选。
下面分别演示官方源锁定小版本安装与源码编译定制模块安装。
方法 1:使用 Nginx 官方仓库安装指定版本(推荐)
Linux 系统自带的 apt/yum 源中的 Nginx 版本通常滞后较多,建议引入官方源。
1. Ubuntu / Debian 系统
步骤 1:导入官方 GPG 密钥并配置源
# 安装前置依赖sudo apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
# 导入官方签名公钥curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \ | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
# 写入官方稳定版 (Stable) 仓库源echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list步骤 2:更新索引并检索可用版本
sudo apt update
# 查看官方源中所有可安装的指定小版本apt-cache madison nginx步骤 3:安装指定版本并锁定
# 安装指定版本(例如 1.24.0)sudo apt install -y nginx=1.24.0-1~jammy
# 锁定版本防止后续 apt upgrade 自动覆盖sudo apt-mark hold nginx2. CentOS / RHEL / Rocky Linux 系统
步骤 1:创建官方源配置文件 /etc/yum.repos.d/nginx.repo
[nginx-stable]name=nginx stable repobaseurl=http://nginx.org/packages/centos/$releasever/$basearch/gpgcheck=1enabled=1gpgkey=https://nginx.org/keys/nginx_signing.keymodule_hotfixes=true步骤 2:查询并安装指定版本
# 列出仓库中的所有历史版本yum list nginx --showduplicates | sort -r
# 安装指定版本(如 1.24.0)sudo yum install -y nginx-1.24.0步骤 3:启动并设置开机自启
sudo systemctl start nginxsudo systemctl enable nginxsudo systemctl status nginx方法 2:源码编译安装(支持自定义模块)
若生产环境需要启用特定模块(如 http_ssl_module、http_v2_module、http_stub_status_module 或第三方 echo、headers-more 模块),源码编译是最强力的方式。
1. 安装编译依赖
# Ubuntu/Debiansudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev
# CentOS/RHELsudo yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel make2. 下载指定版本源码并解压
# 创建工作目录mkdir -p /usr/local/src/nginx && cd /usr/local/src/nginx
# 下载指定版本(如 1.24.0)wget https://nginx.org/download/nginx-1.24.0.tar.gztar -zxvf nginx-1.24.0.tar.gzcd nginx-1.24.03. 配置编译参数与安装
# 配置编译选项./configure \ --prefix=/usr/local/nginx \ --sbin-path=/usr/local/nginx/sbin/nginx \ --conf-path=/usr/local/nginx/conf/nginx.conf \ --pid-path=/usr/local/nginx/logs/nginx.pid \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_realip_module \ --with-http_gzip_static_module \ --with-http_stub_status_module \ --with-stream
# 编译并安装make -j$(nproc)sudo make install4. 创建全局软链与 Systemd 服务
[Unit]Description=The NGINX HTTP and reverse proxy serverAfter=network.target remote-fs.target nss-lookup.target
[Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -tExecStart=/usr/local/nginx/sbin/nginxExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true
[Install]WantedBy=multi-user.targetsudo systemctl daemon-reloadsudo systemctl start nginxsudo systemctl enable nginx🐳 二、Linux 下使用 Docker 快速部署 Nginx
在多微服务与前端单页面(SPA)应用中,Docker Nginx 能极大简化配置迁移与环境统一。
1. docker run 单行命令启动
docker run -d \ --name nginx-web \ -p 80:80 \ -p 443:443 \ -v /opt/nginx/html:/usr/share/nginx/html:ro \ -v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf:ro \ -v /opt/nginx/conf.d:/etc/nginx/conf.d:ro \ -v /opt/nginx/ssl:/etc/nginx/ssl:ro \ -v /opt/nginx/logs:/var/log/nginx \ --restart unless-stopped \ nginx:1.24-alpine2. docker-compose.yml 规范化编排
在项目目录下创建 docker-compose.yml:
version: '3.8'
services: nginx: image: nginx:1.24-alpine container_name: nginx-gateway restart: always ports: - "80:80" - "443:443" volumes: - ./html:/usr/share/nginx/html:ro - ./conf.d:/etc/nginx/conf.d:ro - ./ssl:/etc/nginx/ssl:ro - ./logs:/var/log/nginx environment: - TZ=Asia/Shanghai常用热重载与运维指令:
# 启动docker compose up -d
# 修改配置后免停机热重载docker exec nginx-gateway nginx -tdocker exec nginx-gateway nginx -s reload⚖️ 三、Docker 部署 vs 传统宿主机部署优劣对比
| 评估维度 | Docker 容器化部署 | 传统宿主机/裸机部署 (APT/源码编译) |
|---|---|---|
| 部署与交付速度 | ⚡ 秒级部署,结合 Alpine 基础镜像仅几十 MB 体积 | ⏳ 中等,包管理器较快,但自定义编译耗费时间 |
| 第三方模块扩展 | ⚠️ 镜像内动态添加 C 扩展较繁琐,需自行构建基础 Dockerfile | 🌟 完全自由,在源码阶段可按需集成任意第三方模块 |
| 网络性能与吞吐 | 存在 Docker 内部桥接 NAT 转发开销(可通过 --net=host 消除) | 🚀 原生网络极限吞吐,极适合作为边缘总网关直接监听物理网卡 |
| 配置热重载效率 | 优秀,支持 docker exec ... nginx -s reload | 优秀,直接支持 nginx -s reload 或 systemctl reload nginx |
| SSL 证书自动化 | 配合 acme.sh 或 Certbot 容器编排非常清晰 | 需在宿主机部署定时 cron 任务并 reload 守护进程 |
NOTE选型决策参考:
- 项目内部反向代理、前端静态资源托管、微服务集群:优先选用 Docker Nginx。
- 云服务器最外层核心入口、公网总网关(需要极限并发与防 DDoS/WAF 模块):推荐 宿主机原生编译部署(或使用 Host 网络模式)。
⚠️ 四、新手最容易犯错的关键坑点与解决方案
💣 坑点 1:proxy_pass 结尾斜杠 / 的绝对与相对路径陷阱
现象
配置反向代理后,后端收到的请求路径不符合预期(如多了一截路径或者丢了前缀)。
核心规则与对比
-
情况 A:
proxy_pass尾部带有/(绝对替换)nginx.conf location /api/ {proxy_pass http://127.0.0.1:8080/;}请求
http://domain/api/user/info后端收到:http://127.0.0.1:8080/user/info(/api/被截除)。 -
情况 B:
proxy_pass尾部没有/(保留完整匹配路径)nginx.conf location /api/ {proxy_pass http://127.0.0.1:8080;}请求
http://domain/api/user/info后端收到:http://127.0.0.1:8080/api/user/info(/api/完整保留并透传)。
💣 坑点 2:访问静态文件报 403 Forbidden(权限与 SELinux)
现象
浏览器访问页面直接提示 403 Forbidden,Nginx 错误日志显示 *1 open() "/data/www/index.html" failed (13: Permission denied)。
核心原因与排查步骤
- Nginx 运行用户权限不足:Nginx worker 进程默认使用
nginx或www-data用户,没有目标静态文件或父级目录的读取(r)与穿透(x)权限。 - CentOS / RHEL 的 SELinux 拦截。
解决方案
# 1. 赋予目录及各级父目录执行与可读权限sudo chmod -R 755 /data/wwwsudo chown -R nginx:nginx /data/www
# 2. 若为 CentOS/RHEL 检查 SELinux 状态getenforce# 若为 Enforcing,为静态资源目录恢复正确的安全上下文标签sudo chcon -R -t httpd_sys_content_t /data/www/💣 坑点 3:前端大文件上传失败报 413 Request Entity Too Large
现象
用户通过表单上传视频或大型图片(> 1MB)时,接口直接返回 413 Request Entity Too Large。
核心原因
Nginx 默认限制客户端请求体的最大容量 client_max_body_size 仅为 1MB。
解决方案
在 http、server 或对应 location 块中调高上限(例如 50MB 或 100MB):
http { # 调整允许的最大请求体体积 client_max_body_size 50M;}💣 坑点 4:后端反向代理返回 502 Bad Gateway 或 504 Gateway Timeout
现象
- 502 Bad Gateway:Nginx 作为代理无法连接到上游后端(Upstream)。
- 504 Gateway Timeout:后端执行超时,在规定时间内未给 Nginx 响应。
解决方案
- 排查 502:
- 检查后端服务(如 Node.js、Tomcat、Go)是否正常启动并在监听对应端口:
ss -tlnp | grep 8080。 - 若在 Docker 中运行,确认 Nginx 容器是否能通过容器网络与后端通信(容器内
localhost指向 Nginx 容器自身,不能指代宿主机服务)。
- 检查后端服务(如 Node.js、Tomcat、Go)是否正常启动并在监听对应端口:
- 排查 504:调大 Nginx 代理超时时间:
nginx.conf proxy_connect_timeout 60s;proxy_send_timeout 120s;proxy_read_timeout 120s;
💣 坑点 5:WebSocket 连接建立失败(返回 200 或无法升级 101)
现象
前端建立 ws:// 或 wss:// 连接时提示连接失败,Nginx 无法正确透传握手。
核心原因
HTTP/1.1 协议升级为 WebSocket 需要在请求头中明确传递 Upgrade 和 Connection。
解决方案
在 Nginx 配置中增加协议升级头部支持:
location /ws/ { proxy_pass http://backend_ws_server; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host;}📋 五、生产环境通用优化配置模板(nginx.conf)
一份兼顾高并发连接性能、Gzip 压缩优化、跨域安全与反向代理透传的标准生产级配置:
user nginx;# 自动匹配 CPU 核心数worker_processes auto;# 每个 Worker 进程最大打开文件数worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;
events { # Linux 高性能 epoll 事件模型 use epoll; worker_connections 65535; # 尽可能接收更多连接 multi_accept on;}
http { include /etc/nginx/mime.types; default_type application/octet-stream;
# 日志格式定义(包含真实客户端 IP 与响应时间) log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' 'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log main;
# 高效文件传输与内核优化 sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 2048;
# 隐藏 Nginx 版本号防止特征暴露 server_tokens off;
# 调整允许上传的请求体大小 client_max_body_size 50M;
# === Gzip 智能压缩 === gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_min_length 1k; gzip_types text/plain text/css text/xml application/json application/javascript application/xml+rss application/atom+xml image/svg+xml;
# 包含子配置文件 include /etc/nginx/conf.d/*.conf;}标准虚拟主机与反向代理站点示例 /etc/nginx/conf.d/app.conf:
server { listen 80; server_name example.com www.example.com;
# 强制跳转 HTTPS(按需开启) # return 301 https://$server_name$request_uri;
# 前端静态单页面应用 (SPA) location / { root /usr/share/nginx/html; index index.html; try_files $uri $uri/ /index.html; }
# API 接口反向代理 location /api/ { proxy_pass http://127.0.0.1:8080/; proxy_http_version 1.1;
# 真实客户端信息透传 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_read_timeout 60s; proxy_send_timeout 60s; }}🎯 总结速查
- 安装决策:
- 生产首选 官方 APT / YUM 源 锁定小版本;若需特殊 C 模块则选择 源码编译安装。
- 生产上线避坑清单:
- 严格确认
proxy_pass尾部是否包含/斜杠路径意图; - 静态目录权限设置为
755,检查 SELinux 上下文; - 全局按需放开
client_max_body_size大小; - WebSocket 接口配置
Upgrade与Connection请求头; - 开启
server_tokens off隐藏服务器敏感版本信息; - 每次变更配置前必执行
nginx -t测试语法有效性。
- 严格确认
发现错误或想要改进这篇文章?
在 GitHub 上编辑此页
陕公网安备61040202000874号