登录
注册
开源
企业版
高校版
搜索
帮助中心
使用条款
关于我们
开源
企业版
高校版
私有云
模力方舟
登录
注册
就在本周六,成都站 Gitee Talk | 模力方舟 AI 应用开发沙龙抢占最后席位!聚焦 AI 开发全链路,结识技术同频人~
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
取消
前往登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
Watch
不关注
关注所有动态
仅关注版本发行动态
关注但不提醒动态
23
Star
189
Fork
46
yanleweb
/
interview-question
代码
Issues
1091
Pull Requests
0
Wiki
统计
流水线
服务
质量分析
Jenkins for Gitee
腾讯云托管
腾讯云 Serverless
悬镜安全
阿里云 SAE
Codeblitz
SBOM
我知道了,不再自动展开
更新失败,请稍后重试!
移除标识
内容风险标识
本任务被
标识为内容中包含有代码安全 Bug 、隐私泄露等敏感信息,仓库外成员不可访问
Nginx 如何按资源类型(如.js/.png)分发到不同服务器?配置策略是什么?【热度: 159】
待办的
#ICWQQX
yanleweb
拥有者
创建于
2025-09-07 13:58
**关键词**:nginx 转发 Nginx 可以通过 `location` 指令匹配不同资源类型(如 `.js`、`.png`),并将请求分发到不同服务器,实现资源的分类部署和负载均衡。这种配置策略适合将静态资源(JS、图片)与动态资源(API)分离部署,提升整体服务性能。 ### 一、核心配置策略:按文件后缀匹配并转发 通过 `location` 块的正则表达式匹配符(区分大小写)或 ~\* 匹配符(不区分大小写),根据文件后缀名匹配不同资源类型,再通过 `proxy_pass` 转发到对应服务器。 #### 1. 基础配置示例(分离 JS/CSS 与图片资源) ```nginx http { # 定义后端服务器组(可配置负载均衡) # JS/CSS 资源服务器组 upstream js_css_servers { server 192.168.1.101:8080; # JS/CSS 服务器1 server 192.168.1.102:8080; # JS/CSS 服务器2(负载均衡) } # 图片资源服务器组 upstream image_servers { server 192.168.1.201:8080; # 图片服务器1 server 192.168.1.202:8080; # 图片服务器2(负载均衡) } # 其他资源(如HTML、API)服务器 upstream default_server { server 192.168.1.301:8080; } server { listen 80; server_name example.com; # 1. 匹配 .js 和 .css 文件,转发到 JS/CSS 服务器组 location ~* \.(js|css)$ { proxy_pass http://js_css_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 静态资源缓存优化(可选) expires 1d; # 缓存 1 天 add_header Cache-Control "public, max-age=86400"; } # 2. 匹配图片文件(.png/.jpg/.jpeg/.gif/.webp),转发到图片服务器组 location ~* \.(png|jpg|jpeg|gif|webp)$ { proxy_pass http://image_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 图片缓存时间更长(可选) expires 7d; # 缓存 7 天 add_header Cache-Control "public, max-age=604800"; } # 3. 其他所有请求(如 HTML、API)转发到默认服务器 location / { proxy_pass http://default_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ``` ### 二、配置策略解析 #### 1. 匹配规则说明 - **`~* \.(js|css)$`**: - `~*` 表示不区分大小写匹配(如 `.JS`、`.Css` 也会被匹配)。 - `\.(js|css)$` 是正则表达式,匹配以 `.js` 或 `.css` 结尾的请求。 - **优先级注意**: Nginx 的 `location` 匹配有优先级,**精确匹配(`=`)> 前缀匹配(不含正则)> 正则匹配(`~`/`~*`)**。 因此,按资源类型的正则匹配会优先于普通前缀匹配(如 `/static`),需确保规则无冲突。 #### 2. 服务器组(upstream)配置 - 通过 `upstream` 定义同类资源的服务器集群,支持负载均衡策略(默认轮询): - 可添加 `weight=2` 调整权重(如 `server 192.168.1.101:8080 weight=2;`)。 - 可添加 `backup` 配置备用服务器(如 `server 192.168.1.103:8080 backup;`)。 #### 3. 资源优化补充配置 - **缓存策略**:静态资源(JS、图片)通常不频繁变动,通过 `expires` 和 `Cache-Control` 头设置浏览器缓存,减少重复请求。 - **防盗链**:图片等资源可添加防盗链配置,防止被其他网站盗用: ```nginx location ~* \.(png|jpg|jpeg|gif|webp)$ { # 仅允许 example.com 域名引用图片 valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; # 非法引用返回 403 } # ... 其他配置 } ``` ### 三、扩展场景:按目录 + 资源类型组合匹配 若资源按目录分类(如 `/static/js`、`/static/img`),可结合目录和后缀匹配,进一步细化转发规则: ```nginx # 仅匹配 /static/js 目录下的 .js 文件 location ~* /static/js/.*\.js$ { proxy_pass http://js_servers; } # 仅匹配 /static/img 目录下的图片文件 location ~* /static/img/.*\.(png|jpg)$ { proxy_pass http://image_servers; } ``` ### 四、注意事项 1. **正则表达式效率**: 过多复杂的正则匹配会影响 Nginx 性能,建议资源类型规则尽量简洁(如合并同类后缀)。 2. **后端资源路径一致性**: 确保转发目标服务器的资源路径与请求路径一致。例如,请求 `example.com/static/a.js` 被转发到 `js_css_servers` 后,服务器需能在 `/static/a.js` 路径找到资源。 3. **HTTPS 场景适配**: 若使用 HTTPS,配置逻辑不变,只需在 `server` 块中添加 SSL 证书配置,转发目标可保持 HTTP(内部通信)或 HTTPS(跨公网)。 ### 总结 按资源类型分发的核心策略是: 1. 用 `location ~* \.(后缀1|后缀2)$` 匹配不同资源类型。 2. 通过 `upstream` 定义对应资源的服务器集群,支持负载均衡。 3. 结合缓存、防盗链等配置优化静态资源访问。 这种方案能实现资源的分类部署,减轻单服务器压力,同时针对不同资源类型(如图片、JS)进行专项优化,提升整体服务性能。
**关键词**:nginx 转发 Nginx 可以通过 `location` 指令匹配不同资源类型(如 `.js`、`.png`),并将请求分发到不同服务器,实现资源的分类部署和负载均衡。这种配置策略适合将静态资源(JS、图片)与动态资源(API)分离部署,提升整体服务性能。 ### 一、核心配置策略:按文件后缀匹配并转发 通过 `location` 块的正则表达式匹配符(区分大小写)或 ~\* 匹配符(不区分大小写),根据文件后缀名匹配不同资源类型,再通过 `proxy_pass` 转发到对应服务器。 #### 1. 基础配置示例(分离 JS/CSS 与图片资源) ```nginx http { # 定义后端服务器组(可配置负载均衡) # JS/CSS 资源服务器组 upstream js_css_servers { server 192.168.1.101:8080; # JS/CSS 服务器1 server 192.168.1.102:8080; # JS/CSS 服务器2(负载均衡) } # 图片资源服务器组 upstream image_servers { server 192.168.1.201:8080; # 图片服务器1 server 192.168.1.202:8080; # 图片服务器2(负载均衡) } # 其他资源(如HTML、API)服务器 upstream default_server { server 192.168.1.301:8080; } server { listen 80; server_name example.com; # 1. 匹配 .js 和 .css 文件,转发到 JS/CSS 服务器组 location ~* \.(js|css)$ { proxy_pass http://js_css_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 静态资源缓存优化(可选) expires 1d; # 缓存 1 天 add_header Cache-Control "public, max-age=86400"; } # 2. 匹配图片文件(.png/.jpg/.jpeg/.gif/.webp),转发到图片服务器组 location ~* \.(png|jpg|jpeg|gif|webp)$ { proxy_pass http://image_servers; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; # 图片缓存时间更长(可选) expires 7d; # 缓存 7 天 add_header Cache-Control "public, max-age=604800"; } # 3. 其他所有请求(如 HTML、API)转发到默认服务器 location / { proxy_pass http://default_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } } ``` ### 二、配置策略解析 #### 1. 匹配规则说明 - **`~* \.(js|css)$`**: - `~*` 表示不区分大小写匹配(如 `.JS`、`.Css` 也会被匹配)。 - `\.(js|css)$` 是正则表达式,匹配以 `.js` 或 `.css` 结尾的请求。 - **优先级注意**: Nginx 的 `location` 匹配有优先级,**精确匹配(`=`)> 前缀匹配(不含正则)> 正则匹配(`~`/`~*`)**。 因此,按资源类型的正则匹配会优先于普通前缀匹配(如 `/static`),需确保规则无冲突。 #### 2. 服务器组(upstream)配置 - 通过 `upstream` 定义同类资源的服务器集群,支持负载均衡策略(默认轮询): - 可添加 `weight=2` 调整权重(如 `server 192.168.1.101:8080 weight=2;`)。 - 可添加 `backup` 配置备用服务器(如 `server 192.168.1.103:8080 backup;`)。 #### 3. 资源优化补充配置 - **缓存策略**:静态资源(JS、图片)通常不频繁变动,通过 `expires` 和 `Cache-Control` 头设置浏览器缓存,减少重复请求。 - **防盗链**:图片等资源可添加防盗链配置,防止被其他网站盗用: ```nginx location ~* \.(png|jpg|jpeg|gif|webp)$ { # 仅允许 example.com 域名引用图片 valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; # 非法引用返回 403 } # ... 其他配置 } ``` ### 三、扩展场景:按目录 + 资源类型组合匹配 若资源按目录分类(如 `/static/js`、`/static/img`),可结合目录和后缀匹配,进一步细化转发规则: ```nginx # 仅匹配 /static/js 目录下的 .js 文件 location ~* /static/js/.*\.js$ { proxy_pass http://js_servers; } # 仅匹配 /static/img 目录下的图片文件 location ~* /static/img/.*\.(png|jpg)$ { proxy_pass http://image_servers; } ``` ### 四、注意事项 1. **正则表达式效率**: 过多复杂的正则匹配会影响 Nginx 性能,建议资源类型规则尽量简洁(如合并同类后缀)。 2. **后端资源路径一致性**: 确保转发目标服务器的资源路径与请求路径一致。例如,请求 `example.com/static/a.js` 被转发到 `js_css_servers` 后,服务器需能在 `/static/a.js` 路径找到资源。 3. **HTTPS 场景适配**: 若使用 HTTPS,配置逻辑不变,只需在 `server` 块中添加 SSL 证书配置,转发目标可保持 HTTP(内部通信)或 HTTPS(跨公网)。 ### 总结 按资源类型分发的核心策略是: 1. 用 `location ~* \.(后缀1|后缀2)$` 匹配不同资源类型。 2. 通过 `upstream` 定义对应资源的服务器集群,支持负载均衡。 3. 结合缓存、防盗链等配置优化静态资源访问。 这种方案能实现资源的分类部署,减轻单服务器压力,同时针对不同资源类型(如图片、JS)进行专项优化,提升整体服务性能。
评论 (
0
)
登录
后才可以发表评论
状态
待办的
待办的
进行中
已完成
已关闭
负责人
未设置
标签
web应用场景
阿里巴巴
未设置
标签管理
里程碑
高
未关联里程碑
Pull Requests
未关联
未关联
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
未关联
分支 (1)
标签 (64)
master
0.0.76
0.0.75
0.0.74
0.0.73
0.0.72
0.0.71
0.0.70
0.0.69
0.0.68
0.0.67
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.57
0.0.56
0.0.55
0.0.54
0.0.53
0.0.52
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
开始日期   -   截止日期
-
置顶选项
不置顶
置顶等级:高
置顶等级:中
置顶等级:低
优先级
不指定
严重
主要
次要
不重要
参与者(1)
TypeScript
1
https://gitee.com/yanleweb/interview-question.git
git@gitee.com:yanleweb/interview-question.git
yanleweb
interview-question
interview-question
点此查找更多帮助
搜索帮助
Git 命令在线学习
如何在 Gitee 导入 GitHub 仓库
Git 仓库基础操作
企业版和社区版功能对比
SSH 公钥设置
如何处理代码冲突
仓库体积过大,如何减小?
如何找回被删除的仓库数据
Gitee 产品配额说明
GitHub仓库快速导入Gitee及同步更新
什么是 Release(发行版)
将 PHP 项目自动发布到 packagist.org
评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册