Nginx 是一个 高性能的 HTTP 和反向代理 Web 服务器
这是博主目前正在使用的功能,也是 Nginx 最伟大的发明之一。
它解决了什么?
这是前端最应该关心的功能。
它解决了什么?
当你的 博客 从每天 100 个人看变成 100 万人看时,单台 进程一定会崩溃。
它解决了什么?
高可用性:你可以启动 5 个 Express 进程,Nginx 会像发牌员一样,把流量均匀分配给它们。如果其中一个挂了,Nginx 会自动把请求分给剩下的。
水平扩展:当你需要扩容时,只需在 Nginx 配置文件里加一行 IP 地址
比如通过 PM2 启动了多个项目,其实已经在单机层面接触到了“并行”的概念。而 Nginx 的 upstream 模块,则是将这种并行从“单机”推向“集群”的关键。
假设你现在有一台服务器 A(IP: 1.1.1.1),上面跑着你的 blog。随着流量增加,CPU 经常 100%,你又买了两台服务器 B(2.2.2.2)和 C(3.3.3.3),上面也部署了一模一样的代码。
在 Nginx 配置中定义一个 upstream 块,把这三台服务器的地址写进去。
# 1. 定义服务器池
upstream blog_cluster {
# 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器
server 1.1.1.1:4000;
server 2.2.2.2:4000;
server 3.3.3.3:4000;
# 备用机:只有当上面三台都挂了,才会把请求发给这台
server 4.4.4.4:4000 backup;
}
server {
listen 80;
server_name blackztt.cn;
location / {
# 2. 将流量转发给上面定义的服务器池,而不是具体的 IP
proxy_pass http://blog_cluster;
proxy_set_header Host $host;
# ... 其他 header
}
}决定了当一个请求进来时,到底该发给后端“服务器池”里的哪一个实例
这是 Nginx 默认的算法。请求像报数一样,按顺序分配:第一个请求给 A,第二个给 B,第三个给 C,循环往复。
如果你有两台服务器,一台是 8 核 16G,另一台是 2 核 4G,显然 8 核的应该多干活。
这是一种更“智能”的动态算法。Nginx 会记录每一台后端服务器当前正在处理多少个连接,新请求会发给那个连接数最少的服务器。
location = /path:精确匹配。优先级最高,匹配到就直接停止。
location ^~ /static/:前缀匹配。如果匹配到,就不再查后面的正则表达式。
location ~ \.php$:正则匹配。区分大小写(~* 不区分)。按配置文件的先后顺序,谁在前面谁赢。
location /:通用匹配。优先级最低,作为兜底。
当配置反向代理时,这几行是必须的
proxy_set_header Host $host; # 告诉后端,用户访问的是哪个域名
proxy_set_header X-Real-IP $remote_addr; # 告诉后端,用户的真实 IP 是什么
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 代理链路追踪
proxy_set_header X-Forwarded-Proto $scheme; # 告诉后端是 http 还是 https开启gzip压缩(经验证开启压缩后比之前Performance提高了近20分)
# 1. 开启 Gzip
gzip on;
# 2. 只有超过这个大小的文件才压缩(太小的文件压了反而可能变大)
gzip_min_length 1k;
# 3. 压缩级别:1-9。
# 建议设为 5 或 6。级别越高压缩越小,但越费服务器 CPU。5 是性价比最高点。
gzip_comp_level 5;
# 4. 针对哪些类型的文件进行压缩(必须要包含 JS 和 CSS)
gzip_types text/plain application/javascript text/css application/json application/xml text/javascript;前端静态资源配置
location / {
# Vite 项目在服务器上的实际存放路径
root /var/blog-admin;
index index.html index.htm;
# 核心配置:解决 Vue3/Vite 项目刷新页面出现 404 的问题
# 尝试寻找文件,找不到则重定向到 index.html 让前端路由接管
try_files $uri $uri/ /index.html;
}try_files $uri $uri/ /index.html; —— 关键这是为了解决 Vue-Router / React-Router 在 History 模式下刷新 404 的神级配置。
try_files 的执行逻辑(三步走):