Nginx 配置详解

更新于 2026年7月28日

适用人群:需要为静态站、Node/Go 反向代理或 PHP 站点编写、看懂或排查 Nginx 配置的开发者与运维。

核心概念

server 块与 location

Nginx 用 server 块描述一个虚拟主机:listen 指定端口(80/443),server_name 声明域名,root 指定网站根目录。location 按 URI 前缀 / 正则匹配请求并决定如何处理。

三种典型站点

  • 静态站点:root + index + try_files $uri $uri/ =404
  • 反向代理(Node/Go 等):proxy_pass http://127.0.0.1:端口 + 一组 proxy_set_header 透传 Host / IP / 协议;
  • PHP(如 WordPress):try_files ... /index.php?$query_string + location ~ \.php$ 用 fastcgi_pass 交给 php-fpm。

HTTPS 与安全

启用 HTTPS 需 listen 443 ssl + ssl_certificate / ssl_certificate_key,并常配 80→443 跳转、HTTP/2、HSTS。安全响应头(X-Frame-Options、X-Content-Type-Options、Referrer-Policy)与 gzip 压缩可按需加在 server 块内。

www 规范化

通过一个只做 return 301 的 server 块,把 apex 与 www 统一到你选定的主域名,避免重复内容。

操作步骤

  1. 步骤 1选定站点类型

    先确定是静态站、反向代理(Node/Go)还是 PHP 站点,不同类型的 location 写法不同。可用本站的 Nginx 配置生成器按类型直接生成。

  2. 步骤 2写 server_name 与 listen

    在 server 块中设置 server_name(可空格列多个域名)与 listen(HTTP 用 80,HTTPS 用 443 ssl)。

  3. 步骤 3配置内容来源

    静态站配 root + index + try_files;反代配 proxy_pass 与 proxy_set_header;PHP 配 fastcgi_pass 到 php-fpm 套接字。

  4. 步骤 4启用 HTTPS

    加 listen 443 ssl、证书路径、ssl_protocols TLSv1.2/1.3,并加一个 80→443 的 return 301 跳转块。

  5. 步骤 5加压缩与安全头

    按需开启 gzip,并添加 HSTS 与常用安全响应头,用 add_header ... always 确保错误响应也带上。

  6. 步骤 6校验并生效

    执行 nginx -t 确认语法无误,再 systemctl reload nginx 平滑加载,避免语法错误导致服务中断。

实际示例

# 静态站点 + HTTPS
server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$host$request_uri;
}
server {
    listen 443 ssl;
    http2 on;
    server_name example.com www.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

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

    location / { try_files $uri $uri/ =404; }
}
# 反向代理到本地 3000(Node/Go)
location / {
    proxy_pass http://127.0.0.1:3000;
    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_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

常见错误

  • ⚠️add_header 未加 always,导致 4xx/5xx 响应缺少安全头 / HSTS
  • ⚠️反向代理漏掉 proxy_set_header Host / X-Forwarded-*,后端拿不到真实域名与客户端 IP
  • ⚠️PHP 站点缺少 location ~ \.php$ 或 fastcgi_pass 套接字路径写错,PHP 不被解析而是被下载
  • ⚠️改完配置忘记 nginx -t 与 reload,或语法错误直接 reload 导致 Nginx 无法启动
  • ⚠️证书里的域名与 server_name 不一致,浏览器报证书错误

对应工具

常见问题

静态、反向代理、PHP 三种配置怎么快速生成?
用本站的 Nginx 配置生成器,选择站点类型并填域名、根目录 / 后端地址 / PHP 版本,即可实时生成含 HTTPS、gzip、安全头的完整 server 块并一键复制。
proxy_pass 后面要不要加斜杠?
加与不加语义不同:proxy_pass http://127.0.0.1:3000; 会保留原始 URI;若写成带末尾斜杠并配合带路径的 location,会做路径替换。反代整站到根路径时通常不加末尾斜杠。
配置改了不生效怎么办?
确认改的是被 include 的正确文件、执行了 nginx -t 且通过、再 systemctl reload nginx;多个 server 块 server_name 冲突时也只有一个生效。
HTTP 和 HTTPS 一定要分两个 server 块吗?
推荐分开:一个 80 端口只做 return 301 跳转到 HTTPS,另一个 443 ssl 承载实际站点,结构清晰也避免混合内容问题。

相关教程

相关文章

官方资料来源