前言
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 篇。