Nginx 简介

Nginx(发音为 “engine-x”)是一款高性能的开源 Web 服务器,同时也可以用作反向代理服务器负载均衡器HTTP 缓存。它由俄罗斯工程师 Igor Sysoev 于 2004 年首次发布,如今已成为全球使用最广泛的 Web 服务器之一。

核心特点

  • 高并发、低内存:Nginx 采用异步非阻塞的事件驱动架构,能够轻松处理数万个并发连接,内存占用极低。
  • 高性能:静态文件处理速度极快,性能远超传统的 Apache。
  • 反向代理:可以将客户端请求转发到后端服务(如 Node.js、Python、PHP 等),隐藏真实服务地址。
  • 负载均衡:支持多种负载均衡策略(轮询、加权、IP Hash 等),将流量分发到多台服务器。
  • SSL/TLS 终止:支持 HTTPS,可统一在 Nginx 层处理 SSL 证书,简化后端服务配置。
  • 热更新:支持不停机重新加载配置文件,做到零宕机更新。

常见使用场景

场景 说明
静态资源服务 直接托管 HTML、CSS、JS、图片等静态文件
反向代理 将请求转发到 Node.js / Python / Java 等后端
动静分离 静态文件由 Nginx 直接响应,动态请求转发后端
负载均衡 将流量分发到多个后端实例
HTTPS 证书管理 统一处理 SSL,后端只需 HTTP

Nginx 配置文件的位置

标准系统安装(Linux)

通过系统包管理器(如 aptyum)安装的 Nginx,配置文件遵循标准路径:

主配置文件(全局唯一):/etc/nginx/nginx.conf

各站点配置文件:

1
2
3
4
/etc/nginx/sites-available/你的站点名.conf   # 存放所有站点配置
/etc/nginx/sites-enabled/你的站点名.conf # 软链接,指向已启用的配置
# 或者使用另一种常见方式:
/etc/nginx/conf.d/你的站点名.conf

主配置文件通过以下指令引入站点配置:

1
2
3
include /etc/nginx/sites-enabled/*;
# 或
include /etc/nginx/conf.d/*.conf;

宝塔面板安装

通过宝塔面板安装的 Nginx 所有文件集中在 /www/ 目录下:

主配置文件(全局):/www/server/nginx/conf/nginx.conf

各站点配置文件:/www/server/panel/vhost/nginx/*.conf

宝塔会根据站点类型自动为配置文件添加前缀,例如,HTML 静态站点 的配置文件名为:html_example.com.conf

主配置文件通过 include /www/server/panel/vhost/nginx/*.conf; 指令引入所有站点配置


配置字段详解

Nginx 的配置文件分为两层:主配置文件(全局生效)和站点配置文件(单个站点生效)。一般情况下,几乎只需要改站点的配置文件,主配置文件很少动。

主配置文件(nginx.conf 主要调整全局性能参数:

  • worker_processes:工作进程数(一般设为 CPU 核心数)
  • worker_connections:每个进程的最大连接数
  • gzip 压缩开关
  • 日志格式定义
  • client_max_body_size:上传文件大小限制(这个偶尔需要改,比如你的图床如果上传大图就要在这里调)

站点配置文件(vhost/nginx/站点名.conf)

每个站点对应一个独立的配置文件,核心结构是一个或多个 server {} 块。下面以一个完整的主站配置为例,逐一讲解每个字段的含义。

server 块基础字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
# 监听端口,80 为 HTTP 标准端口
listen 80;

# 该 server 块响应的域名,可以写多个,空格分隔。Nginx 通过请求头中的 Host 字段匹配对应的 server 块
server_name tianlejin.top www.tianlejin.top;

# 网站根目录,适用于直接托管静态文件的场景
# 若使用反向代理则不需要此字段
root /www/wwwroot/tianlejin.top;

# 默认首页文件,按顺序查找
index index.html index.htm;

# 访问日志路径
access_log /www/wwwlogs/tianlejin.top.log;

# 错误日志路径
error_log /www/wwwlogs/tianlejin.top.error.log;
}

location 块:路径路由

location 是站点配置中最重要的部分,用于匹配请求路径并决定如何处理。

匹配规则优先级(从高到低):

写法 含义
location = /path 精确匹配,优先级最高
location ^~ /path 前缀匹配,匹配后不再检查正则
location ~ /path 正则匹配,区分大小写
location ~* /path 正则匹配,不区分大小写
location /path 普通前缀匹配,优先级最低

常用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 匹配所有请求(兜底规则,优先级最低)
location / {
proxy_pass http://127.0.0.1:4000/;
}

# 精确匹配 /favicon.ico,直接返回静态文件
location = /favicon.ico {
root /www/wwwroot/tianlejin.top;
}

# 匹配 /api/ 路径下的所有请求,转发到 FastAPI
location /api/ {
proxy_pass http://127.0.0.1:8000/api/;
}

# 匹配所有图片文件,设置缓存过期时间
location ~* \.(jpg|jpeg|png|gif|webp)$ {
expires 30d;
access_log off;
}

反向代理字段(proxy_pass)

反向代理是 Nginx 最常用的功能,将客户端请求转发到后端服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
location /api/ {
# 将请求转发到本机 8000 端口
proxy_pass http://127.0.0.1:8000/api/;

# 指定与后端服务通信使用 HTTP/1.1 协议,支持长连接和 WebSocket
proxy_http_version 1.1;

# 将真实客户端 IP 传递给后端,否则后端只能看到 127.0.0.1
proxy_set_header X-Real-IP $remote_addr;

# 记录请求经过的所有代理服务器 IP 链,用于追踪请求来源
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# 将客户端请求的 Host 头传递给后端,后端能知道原始请求的域名
proxy_set_header Host $host;

# 连接后端服务的超时时间(单位:秒)
proxy_connect_timeout 30;

# 等待后端响应的超时时间
proxy_read_timeout 60;
}

注意 proxy_pass 末尾斜杠的区别:

  • proxy_pass http://127.0.0.1:8000/api/ — 请求 /api/user 转发为 /api/user
  • proxy_pass http://127.0.0.1:8000/ — 请求 /api/user 转发为 /user(自动去掉 location 前缀)

HTTPS 与 SSL 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
# 监听 443 端口并启用 SSL
listen 443 ssl;
server_name tianlejin.top www.tianlejin.top;

# SSL 证书文件路径(宝塔申请后自动填写)
ssl_certificate /www/server/panel/vhost/cert/tianlejin.top/fullchain.pem;

# SSL 私钥文件路径
ssl_certificate_key /www/server/panel/vhost/cert/tianlejin.top/privkey.pem;

# 支持的 TLS 协议版本,TLSv1.3 更安全
ssl_protocols TLSv1.2 TLSv1.3;

# 加密套件
ssl_ciphers HIGH:!aNULL:!MD5;

location / {
proxy_pass http://127.0.0.1:4000/;
}
}

# HTTP 自动跳转 HTTPS
server {
listen 80;
server_name tianlejin.top www.tianlejin.top;

# 301 永久重定向到 HTTPS
return 301 https://$host$request_uri;
}

其他常用字段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
server {
listen 80;
server_name img.tianlejin.top;

# 覆盖主配置的上传限制,仅对当前站点生效
client_max_body_size 50m;

# 开启目录浏览(适合文件下载站,一般不开)
autoindex on;

# 自定义错误页面
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

location / {
proxy_pass http://127.0.0.1:50000/;

# 允许跨域(适合图床、API 等场景)
add_header Access-Control-Allow-Origin *;

# 防盗链:只允许来自自身域名的请求访问图片
valid_referers none blocked tianlejin.top *.tianlejin.top;
if ($invalid_referer) {
return 403;
}
}
}

完整站点配置示例

以下是主站 tianlejin.top 的完整配置,综合了以上所有常用字段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# HTTP 跳转 HTTPS
server {
listen 80;
server_name tianlejin.top www.tianlejin.top;
return 301 https://$host$request_uri;
}

# 主站 HTTPS 配置
server {
listen 443 ssl;
server_name tianlejin.top www.tianlejin.top;

ssl_certificate /www/server/panel/vhost/cert/tianlejin.top/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/tianlejin.top/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;

access_log /www/wwwlogs/tianlejin.top.log;
error_log /www/wwwlogs/tianlejin.top.error.log;

client_max_body_size 20m;

# Hexo 博客主入口
location / {
proxy_pass http://127.0.0.1:4000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

# FastAPI 后端接口
location /api/ {
proxy_pass http://127.0.0.1:8000/api/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 30;
proxy_read_timeout 60;
}

# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|webp|woff2)$ {
proxy_pass http://127.0.0.1:4000;
expires 7d;
access_log off;
}

# 自定义错误页
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}