网站静态文件加速-Django项目静态文件存储到腾讯云COS存储提升网络请求速度

news2025/6/9 19:40:35

解决办法是通过在 Nginx 中把对 /static/ 路径的请求直接指向你的 COS 域名来实现让浏览器直接去拉取 COS 上的静态资源,而不再经过本地服务器。下面给出两种常见的做法,你可以任选其一:


方法一:使用 301/302 Redirect (让客户端直接跳转到 COS)

这样做的好处是浏览器会直接到 COS 域名去请求资源,减少了你这边服务器的流量和延迟。配置思路就是把所有 /static/... 的请求都重写(rewrite)到 COS 的真实 URL 上去。

server {
    listen 80;
    server_name 62.234.180.150;

    # 其他配置…

    # 这一段把 /static/ 下的所有请求都重定向到你 COS 上的静态目录
    location ^~ /static/ {
        # 正则捕获 /static/ 后面的部分(比如 chat/images/gongan.png)
        rewrite ^/static/(.*)$ https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/$1 redirect;
        # 如果想要永久 301,可以改成:
        # rewrite ^/static/(.*)$ https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/$1 permanent;
    }

    # 媒体文件(media)也可以同理
    location ^~ /media/ {
        rewrite ^/media/(.*)$ https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/media/$1 redirect;
    }

    # 主代理配置:其余请求转发到 Django
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket 支持(可选,看你是否用到 channels/ws)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
        proxy_connect_timeout 30s;
        proxy_buffering off;
    }

    # …其他配置
}
  • 解释

    1. location ^~ /static/ { … }:匹配所有以 /static/ 打头的请求。

    2. rewrite ^/static/(.*)$ https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/$1 redirect;

      • ^/static/(.*)$ 捕获 /static/ 后面的所有路径(比如 chat/images/gongan.png)。
      • 将其一一映射到 https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/$1 ,也就是 COS 上对应的路径。
      • redirect 表示返回 302 临时重定向;如果你希望客户端缓存(301 永久重定向),就把 redirect 改成 permanent 即可。
    3. 浏览器拿到 302/301 后就直接去请求 COS 上的 URL,从而节省了你本地服务器转发这一步骤,也能显著提升静态文件加载速度。

注意:采用此方案后,你需要保持 Django 端的 STATIC_URL = '/static/' 不变,让模板输出的 URL 依旧是 /static/...。Nginx 收到客户端对 /static/... 的请求,就会自动下发 301/302 给浏览器,让它去 COS 拉资源。


方法二:使用 proxy_pass (由 Nginx 反向代理到 COS,浏览器只请求你这台服务器)

如果你希望浏览器在地址栏里仍然是 https://你的域名/static/…,但实际内容由 Nginx 从 COS “取回”后再转给客户端,也可以用 proxy_pass。这种方式浏览器 “看” 不到真正的 COS 域名,所有流量还是走到你这台 Nginx,然后再到 COS。

server {
    listen 80;
    server_name 62.234.180.150;

    # 其他配置…

    # 代理 /static/ 到 COS
    location /static/ {
        # 下面这个 proxy_pass 的写法,能够把 /static/foo/bar.js
        # 对应到 https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/foo/bar.js
        proxy_pass https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/;

        # 一般还要设置 Host,指向你 COS 的域名
        proxy_set_header Host pygrow-1307692287.cos.ap-chongqing.myqcloud.com;

        # 缓存头、CORS 等可酌情加
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, OPTIONS';

        # 如果需要 WebSocket 支持,通常不用在 static 里设置
        proxy_http_version 1.1;
    }

    # 媒体文件 同理
    location /media/ {
        proxy_pass https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/media/;
        proxy_set_header Host pygrow-1307692287.cos.ap-chongqing.myqcloud.com;
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, OPTIONS';
        proxy_http_version 1.1;
    }

    # 主代理,把其他请求转给 Django
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
        proxy_connect_timeout 30s;
        proxy_buffering off;
    }

    # …其他配置
}
  • 解释

    1. location /static/:匹配到的请求仍然是以 /static/ 打头。

    2. proxy_pass https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/;

      • 注意最后要保留一个斜杠,这样 Nginx 会把 /static/ 后面的部分拼接到 /staticfiles/ 后面,举例:

        • 客户端请求 /static/chat/images/gongan.png
        • Nginx 会把它转发给 https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/chat/images/gongan.png
    3. proxy_set_header Host pygrow-1307692287.cos.ap-chongqing.myqcloud.com;

      • 让 Nginx 在向 COS 发起请求时,Host 头是你 COS 的桶域名,否则 COS 可能会拒绝访问或者返回 404。
    4. 其余的 expiresCache-ControlAccess-Control-Allow-Origin 都是为了强制客户端缓存、并允许跨域请求。


小结与建议

  1. 如果你希望“浏览器直接去 COS 拉”,减轻自己服务器负担,就用方法一(Redirect)

    • 优点:浏览器绕过你这台机器,直接和 COS 通信,节省带宽和 CPU。
    • 缺点:URL 从 /static/... 变成了 https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/...,地址栏里会发生跳转。
  2. 如果你希望“URL 看起来还是 /static/...,但是背后 Nginx 去取 COS 的内容”,用方法二(proxy_pass)

    • 优点:URL 对用户而言是一致的,也方便做统一日志/安全策略;对客户端透明。
    • 缺点:所有静态请求都要经过你这台服务器一次,带宽依然会消耗在你服务器和 COS 之间。
  3. 不要忘了同步修改 Django 侧

    • 保持 settings.py 里的

      STATIC_URL = '/static/'
      

      如果你改成 STATIC_URL = 'https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/',那么 Django 直接在模板里就会生成完整的 COS 链接,此时 Nginx 不再需要额外的 /static/ 转发配置——静态文件就完全由 COS 托管,但这样做的前提是你希望模板层直接暴露外网 Bucket 地址。

  4. 部署完成后,记得清理(或者暂时关闭)本地的静态文件服务,否则可能会跟 Nginx 的代理/重写冲突。也可以在 Nginx 里把原来指向本地 aliasroot 的部分删掉,只保留重写/代理到 COS 的配置。


配置示例(最终版)

假设你想要使用“让浏览器直接跳到 COS”方案,最终的 Nginx 段落可以像下面这样:

server {
    listen 80;
    server_name 62.234.180.150;

    # 1. 静态文件直接重定向到 COS
    location ^~ /static/ {
        rewrite ^/static/(.*)$ https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/$1 permanent;
    }

    # 2. 媒体文件(Media)同理
    location ^~ /media/ {
        rewrite ^/media/(.*)$ https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/media/$1 permanent;
    }

    # 3. 其余请求都转给 Django
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # WebSocket(如果用到 channels)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        proxy_read_timeout 86400s;
        proxy_send_timeout 86400s;
        proxy_connect_timeout 30s;
        proxy_buffering off;
    }

    # 日志等配置…
    access_log /www/wwwlogs/www_pygrow_cn.log;
    error_log  /www/wwwlogs/www_pygrow_cn.error.log;
}

这样一来:

  • 用户在浏览器里访问 https://62.234.180.150/static/chat/images/gongan.png
  • Nginx 立刻返回一个 301 到 https://pygrow-1307692287.cos.ap-chongqing.myqcloud.com/staticfiles/chat/images/gongan.png
  • 浏览器直接去 COS 上拉取图片,速度最快,也不占你本机带宽。

如果你更倾向于“URL 保持没变,但代理走 COS”,则把第 1、2 步改成前面示例的 proxy_pass 写法即可。


常见坑

  1. 不要同时存在两个 /static/ 匹配,否则 Nginx 会优先走第一个匹配到的。
  2. 如果你用的是 HTTPS(在前端做了反代 SSL),请把 proxy_pass 换成 https://... 并确认 SSL 证书链正确。
  3. 重定向到 COS 时,记得检查 COS 桶的权限(要保证对外是公开可读,否则会 403/404)。
  4. 如果你以后要让 COS 上的静态文件“版本化”或“带签名 URL”,可以在 rewrite 里拼带签名的参数。

总结

  • 最推荐的做法是 方法一(Redirect)。这样静态资源完全脱离你当前服务器,浏览器去 COS 拉最快;
  • 如果业务上有特殊需求一定要“URL 不改变”,再考虑 方法二 (proxy_pass)

按照上面示例修改好 Nginx,然后重载配置:

nginx -t && nginx -s reload

就能让 Django 端的 /static/... 直接对接到你在 COS 上的资源了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405760.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开疆智能Ethernet/IP转Modbus网关连接西门子BW500积算仪配置案例

本案例是通过Ethernet转Modbus网关将皮带秤数据接入到罗克韦尔1769L32E型PLC中。 首先进行ABB PLC的设置 1, 运行 RSLogix 5000 程序加载Ethernet转Modbus网关的EDS 文件: 2,新建工程并添加PLC 3,New Module添加网关&#xff…

【五子棋在线对战】三.数据管理模块实现

数据管理模块实现 1.数据库表的设计2.数据管理模块的封装和实现2.1 user_table() && ~user_table()2.2 insert() 注册时新增用户2.3 login() 登录验证,并返回详细的用户信息2.4 通过用户名获取用户信息 && 通过用户id获取用户信息2.5 win() &&a…

【JMeter】后置处理器 - 提取器

文章目录 概览边界提取器正则提取器JSON提取器 概览 CSS/JQuery提取器;给网页使用JSON提取器:给JSON数据使用★边界提取器:给字符串使用★正则表达式提取器:更加高级的字符使用★Xpath提取器:给网页使用 边界提取器…

OpenAI技术路线急转:从TypeScript到Rust的Codex CLI重构内幕

目录 前言:OpenAI的技术抉择引发业界思考 Codex CLI:OpenAI的终端AI编程利器 语言抉择的戏剧性反转:从TypeScript到Rust Rust重写的四大技术动因 1. 零依赖部署:消除环境配置痛点 2. 内存安全与沙箱隔离 3. 性能的全面碾压 …

window下配置ssh免密登录服务器

window下配置ssh免密登录服务器 本地windows远程登录我的ssh服务器10.10.101.xx服务器,想要每次都免密登录这个服务器. 记录下教程,防止后期忘记,指导我实现这个过程。 教程 二、实践步骤:Windows 上配置 SSH 免密登录 2.1 确…

nginx部署

配置阿里云yum源 安装如下编译工具 yum install -y gcc gcc-c autoconf automake make #安装使用nginx还得安装nginx所需的一些第三方系统库的支持,比如nginx的静态资源压缩功能所需的gzip lib库,nginx需要支持URL重写,所需的pcre库&…

线性规划饮食问题求解:FastAPI作为服务端+libhv作为客户端实现

之前在 Pyomo介绍-CSDN博客 中介绍过通过Pyomo求解线性规划问题,这里使用FastAPI作为服务端,开源网络库libhv作为客户端,求解饮食成本最小化问题。 服务端测试代码test_fastapi_pyomo_server.py如下: from fastapi import FastAP…

前端验证下跨域问题(npm验证)

文章目录 一、背景二、效果展示三、代码展示3.1)index.html3.2)package.json3.3) service.js3.4)service2.js 四、使用说明4.1)安装依赖4.2)启动服务器4.3)访问前端页面 五、跨域解决方案说明六…

Linux Docker的简介

参考资料 30分钟Docker入门教程 ◀ 本篇博客所有图片皆来自于该视频截图阮一峰 - Docker 入门教程 目录 一. 环境配置时可能会遇到的问题二. 什么是Docker三. 虚拟机 与 Docker 的区别3.1 虚拟机3.2 Docker 四. Docker的基本架构五. Dockerfile 一. 环境配置时可能会遇到的问题…

极昆仑智慧与数元灵科技达成战略合作

近日,北京极昆仑智慧科技有限公司与北京数元灵科技有限公司正式签署产品级融合战略合作协议,双方将围绕 "AIBI商业智能分析" " Hybrid RAG 大模型问答" 等核心大模型应用,实现技术架构与业务场景的深度集成,…

第四讲:类和对象(下)

1. 再探构造函数 • 之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅ 式,就是初始化列表,初始化列表的使⽤⽅式是以⼀个冒号开始,接着是⼀个以逗号分隔的数据成 员列表&#xff…

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Dad Jokes(冷笑话卡片)

📅 我们继续 50 个小项目挑战!—— DadJokes 组件 仓库地址:https://github.com/SunACong/50-vue-projects 项目预览地址:https://50-vue-projects.vercel.app/ 豆包翻译确实可以,冷笑话应该属于各类语言比较难理解的…

Spring AOP执行原理源码解析

对【com.example.demo.TestAspect#aopTest】连接点增加了五个通知 在调用【com.example.demo.A#testAop()】(用户自定义)方法时,Cglib拦截器对其进行了拦截 可以看到执行顺序分别是环绕前置,前置,环绕后置,…

基于FPGA的超声波显示水位距离,通过蓝牙传输水位数据到手机,同时支持RAM存储水位数据,读取数据。

基于FPGA的超声波显示水位距离 前言一、整体框架二、代码架构1.超声波测距模块2.蓝牙数据发送模块3.数码管数据切换模块4.数码管驱动模块6.串口驱动7.顶层模块8.RAM ip核 仿真相关截图 前言 随着工业化进程的加速和环境保护意识的提升,对水资源管理和水位监测的需求…

在Windows下利用LoongArch-toolchain交叉编译Qt

文章目录 0.交叉编译的必要性1.下载交叉编译工具链1.1.直接在Windows下使用mingw(不使用虚拟机)编译(还没成功,无法编译)1.2.在虚拟机中的Ubuntu中进行交叉编译 2.下载qt源码3.编译Qt3.1.创建loongarch64的mkspec3.2.创…

AIRIOT无人机安防解决方案

随着无人机技术的飞速发展和广泛应用,其在安防领域的价值日益凸显,从关键设施巡检、大型活动安保到边境巡防、应急救援,无人机正成为立体化安防体系不可或缺的“空中哨兵”。然而,无人机安防应用蓬勃发展的同时,其自身…

华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)

import java.util.*; public static Integer get(int count,int c){if(count<3||count>7){return -1;}//存储每位数的最高位……最低位int[] arr new int[count];List<Integer> res new ArrayList<>();for(int i(int) Math.pow(10,count-1);i<(int) Math…

php apache构建 Web 服务器

虚拟机配置流程winsever2016配置Apache、Mysql、php_windows server 2016配置web服务器-CSDN博客 PHP 和 Apache 通过 ​​模块化协作​​ 共同构建 Web 服务器&#xff0c;以下是它们的交互机制和工作流程&#xff1a; ​​一、核心组件分工​​ 组件角色​​Apache​​Web …

打通印染车间“神经末梢”:DeviceNet转Ethernet/IP连接机器人的高效方案

在印染行业自动化升级中&#xff0c;设备联网需求迫切。老旧印染设备多采用Devicenet协议&#xff0c;而新型工业机器人普遍支持Ethernet/IP协议&#xff0c;协议不兼容导致数据交互困难&#xff0c;设备协同效率低、生产监控滞后&#xff0c;成了行业数字化转型的阻碍。本文将…

2025-06-02-IP 地址规划及案例分析

IP 地址规划及案例分析 参考资料 Plan for IP addressing - Cloud Adoption Frameworkwww.cnblogs.comimage-hosting/articles at master jonsam-ng/image-hosting 概述 在网络通信中&#xff0c;MAC 地址与 IP 地址分别位于 OSI 模型的数据链路层和网络层&#xff0c;二者协…