前言

Nginx 是运维接触最多的软件之一。这篇从零开始,把一个静态网站(比如本博客)部署到 Nginx 上的完整流程走一遍。

一、安装

# RHEL 系
dnf install -y nginx

# 确认版本并启动
nginx -v
systemctl enable --now nginx
curl -I http://127.0.0.1/        # 出现 Welcome to nginx 即成功

二、配置文件结构

/etc/nginx/
├── nginx.conf                 # 主配置: 全局 + events + http 块
├── conf.d/                    # 独立站点配置(推荐放这里)
│   └── *.conf
└── mime.types                 # 扩展名 -> Content-Type 映射

nginx.conf 的 http 块末尾有一行关键配置:

include /etc/nginx/conf.d/*.conf;   # 我们加站点就是往这里丢 .conf

三、部署第一个静态站点

1. 准备站点文件:

mkdir -p /var/www/demo
echo '<h1>Hello, Nginx!</h1>' > /var/www/demo/index.html

2. 写站点配置 /etc/nginx/conf.d/demo.conf:

server {
    listen 80;                          # 监听端口
    server_name demo.example.com;       # 匹配请求 Host 头(域名)

    root /var/www/demo;                 # 站点根目录
    index index.html index.htm;

    location / {
        try_files $uri $uri/ =404;      # 依次尝试: 文件 -> 目录 -> 404
    }
}

3. 检查并生效:

nginx -t                  # 语法检查, 永远先跑这一步
systemctl reload nginx    # 平滑重载, 不断连接

curl -H "Host: demo.example.com" http://127.0.0.1/
# <h1>Hello, Nginx!</h1>

四、location 匹配规则

这是 Nginx 配置的灵魂,优先级从高到低:

写法 类型 示例
= 精确匹配 location = /health
^~ 前缀匹配(命中后不再查正则) location ^~ /static/
~ / ~* 正则(区分/不区分大小写) location ~ \.php$
无符号 普通前缀 location /
# 静态资源走长缓存(文件名带 hash 时可激进些)
location ~* \.(css|js|png|jpg|svg|woff2)$ {
    expires 7d;
    add_header Cache-Control "public";
}

# 精确的健康检查, 给负载均衡器探测用
location = /health {
    access_log off;
    return 200 "ok\n";
}

五、必备优化项

gzip 压缩

gzip on;
gzip_min_length 1k;                 # 小于 1k 不压(不划算)
gzip_comp_level 5;
gzip_types text/css application/javascript application/json image/svg+xml text/plain;

文本类资源通常能压到原来的 1/3,立竿见影。

隐藏版本号

server_tokens off;      # 不暴露 nginx 版本, 减少被针对性攻击的信息

日志

默认在 /var/log/nginx/access.log。自定义日志格式(加响应耗时,方便排查慢请求):

logformat main '$remote_addr - [$time_local] "$request" '
               '$status $body_bytes_sent "$http_referer" '
               '"$http_user_agent" rt=$request_time';

server {
    ...
    access_log /var/log/nginx/demo.access.log main;
}

六、一台 Nginx 托管多个站点

靠 server_name 区分(虚拟主机)。再建一个 blog.conf:

server {
    listen 80;
    server_name blog.example.com;      # 不同域名 -> 不同 root
    root /var/www/blog;
    ...
}

Nginx 匹配逻辑:请求的 Host 头与哪个 server_name 一致就进哪个 server 块;都不匹配则进默认 server。这也是一台服务器绑定多个域名的原理——本博客的 antidebug.cn 和 www.antidebug.cn 就是写在一个 server 块里共用一份站点文件。

七、常用运维命令

命令 作用
nginx -t 测试配置语法(reload 前必跑)
systemctl reload nginx 平滑重载配置
nginx -s stop / nginx -s quit 立即停止 / 优雅退出
tail -f /var/log/nginx/error.log 看错误日志排障

403 排查思路:root 目录无权限(chmod +x 各级目录)→ 无 index 文件 → SELinux 上下文(restorecon -R)。

502 排查思路:反代后端挂了/端口不对;curl 后端端口验证进程存活。

小结

静态站点部署三件套:文件放好 → server 块写好 → nginx -t 后 reload。再记住 location 优先级、gzip、缓存三招,一个能上生产的基础配置就成型了。反向代理与负载均衡,下下篇见。


本文是「Linux 运维」系列第 2 篇。