Nodejs 第二十七章(动静分离)

简介: Nodejs 第二十七章(动静分离)

什么是动静分离?

动静分离是一种在Web服务器架构中常用的优化技术,旨在提高网站的性能和可伸缩性。它基于一个简单的原则:将动态生成的内容(如动态网页、API请求)与静态资源(如HTML、CSS、JavaScript、图像文件)分开处理和分发。

通过将动态内容和静态资源存储在不同的服务器或服务上,并使用不同的处理机制,可以提高网站的处理效率和响应速度。这种分离的好处包括:

  1. 性能优化:将静态资源与动态内容分离可以提高网站的加载速度。由于静态资源往往是不变的,可以使用缓存机制将其存储在CDN(内容分发网络)或浏览器缓存中,从而减少网络请求和数据传输的开销。
  2. 负载均衡:通过将动态请求分发到不同的服务器或服务上,可以平衡服务器的负载,提高整个系统的可伸缩性和容错性。
  3. 安全性:将动态请求与静态资源分开处理可以提高系统的安全性。静态资源通常是公开可访问的,而动态请求可能涉及敏感数据或需要特定的身份验证和授权。通过将静态资源与动态内容分离,可以更好地管理访问控制和安全策略。

实现动静分离的方法

  • 使用反向代理服务器(如Nginx、Apache)将静态请求和动态请求转发到不同的后端服务器或服务。
  • 将静态资源部署到CDN上,通过CDN分发静态资源,减轻源服务器的负载。
  • 使用专门的静态文件服务器(如Amazon S3、Google Cloud Storage)存储和提供静态资源,而将动态请求交给应用服务器处理。

代码编写

下面是一个使用Node.js编写的示例代码,演示了如何处理动静分离的请求:

import http from 'node:http' // 导入http模块
import fs from 'node:fs' // 导入文件系统模块
import path from 'node:path' // 导入路径处理模块
import mime from 'mime' // 导入mime模块
const server = http.createServer((req, res) => {
    const { url, method } = req
    // 处理静态资源
    if (method === 'GET' && url.startsWith('/static')) {
        const filePath = path.join(process.cwd(), url) // 获取文件路径
        const mimeType = mime.getType(filePath) // 获取文件的MIME类型
        console.log(mimeType) // 打印MIME类型
        fs.readFile(filePath, (err, data) => { // 读取文件内容
            if (err) {
                res.writeHead(404, {
                    "Content-Type": "text/plain" // 设置响应头为纯文本类型
                })
                res.end('not found') // 返回404 Not Found
            } else {
                res.writeHead(200, {
                    "Content-Type": mimeType, // 设置响应头为对应的MIME类型
                    "Cache-Control": "public, max-age=3600" // 设置缓存控制头
                })
                res.end(data) // 返回文件内容
            }
        })
    }
    // 处理动态资源
    if ((method === 'GET' || method === 'POST') && url.startsWith('/api')) {
        // ...处理动态资源的逻辑
    }
})
server.listen(80) // 监听端口80

因为每个文件所对应的mime类型都不一样,如果手写的话有很多,不过强大的nodejs社区提供了mime库,可以帮我们通过后缀直接分析出 所对应的mime类型,然后我们通过强缓存让浏览器缓存静态资源

常见的mime类型展示

-   文本文件:
    -   text/plain:纯文本文件
    -   text/html:HTML 文件
    -   text/css:CSS 样式表文件
    -   text/javascript:JavaScript 文件
    -   application/json:JSON 数据
-   图像文件:
    -   image/jpeg:JPEG 图像
    -   image/png:PNG 图像
    -   image/gif:GIF 图像
    -   image/svg+xml:SVG 图像
-   音频文件:
    -   audio/mpeg:MPEG 音频
    -   audio/wav:WAV 音频
    -   audio/midi:MIDI 音频
-   视频文件:
    -   video/mp4:MP4 视频
    -   video/mpeg:MPEG 视频
    -   video/quicktime:QuickTime 视频
-   应用程序文件:
    -   application/pdf:PDF 文件
    -   application/zip:ZIP 压缩文件
    -   application/x-www-form-urlencoded:表单提交数据
    -   multipart/form-data:多部分表单数据
目录
相关文章
|
缓存 负载均衡 前端开发
Nginx极简入门(九)Nginx实现动静分离!
前面介绍了Nginx的负载均衡,一般来说,都需要将动态资源和静态资源分开,这样可以很大程度的提升静态资源的访问速度,同时在开过程中也可以让前后端开发并行可以有效的提高开发时间,也可以有些的减少联调时间 。接下来介绍什么是动静分离以及如何使用Nginx实现动静分离。
Nginx极简入门(九)Nginx实现动静分离!
|
6月前
|
存储 JavaScript 前端开发
前端实现动态路由vue
该代码实现了Vue动态路由功能,包含基础路由配置、路由守卫、动态添加路由及登录认证。用户登录成功后,将动态加载仪表盘路由组件,实现按需加载。
174 0
|
4月前
|
JSON 供应链 监控
1688商品详情API技术深度解析:从接口架构到数据融合实战
1688商品详情API(item_get接口)可通过商品ID获取标题、价格、库存、SKU等核心数据,适用于价格监控、供应链管理等场景。支持JSON格式返回,需企业认证。Python示例展示如何调用接口获取商品信息。
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
921 159
|
9月前
|
存储 安全 算法
《深度剖析:软总线设备认证机制如何筑牢互联安全防线》
在智能设备互联互通的时代,软总线作为数据交互的核心,其安全性尤为重要。设备认证机制通过生成唯一身份标识(如椭圆曲线公私钥对)确保合法设备接入。信任关系的建立包括PIN码认证和无交互认证等方式,结合加密与完整性保护技术,防止信息被窃取或篡改。此外,通过信任链拓展与管理,软总线实现跨设备安全互联。这一机制为智能家居、智能办公等场景提供了可靠保障,并将随技术发展持续优化,适应复杂网络环境。
218 7
|
11月前
|
数据挖掘 API UED
中国主要CRM产品对比:如何选择最适合的解决方案?
在中国CRM市场,多个优秀解决方案提供商各有特色。销售易适合大中型企业,提供完整的销售和客户管理功能;纷享销客主打社交化CRM,适合中小型企业;鹏为软件专注制造业,与ERP深度集成;金蝶云星空CRM适合已使用金蝶ERP的企业;红圈CRM专注零售行业;悟空CRM为开源系统,灵活定制。选择时需考虑公司规模、预算、行业特点及系统集成需求,确保选型符合自身需求并具备良好的售后支持。
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
存储 Prometheus 监控
【监控】grafana图表使用快速上手
【监控】grafana图表使用快速上手
530 0
|
存储 JavaScript 前端开发
深入浅出Node.js: 从零到一搭建后端服务
【10月更文挑战第5天】在数字化时代的浪潮中,掌握一门后端技术变得尤为重要。Node.js,作为一种轻量、高效的平台,让JavaScript开发者能够轻松跨越前后端的界限。本文将带领初学者一步步了解Node.js的核心概念,并通过实践指导如何搭建一个简单的后端服务。我们将探索异步编程的魅力,模块化的便利,以及中间件的强大功能。准备好了吗?让我们开始Node.js的奇妙之旅!
Vue3面包屑(Breadcrumb)
该Breadcrumb组件允许自定义设置多个属性,包括路由数组、面包屑类名和样式、文本最大显示宽度、分隔符及样式、以及目标URL的打开方式。通过这些配置项,可以轻松实现不同样式的面包屑导航。组件支持点击跳转,并且能够处理带查询参数的路径。在线预览展示了其丰富的定制功能。可通过引入并在页面中使用该组件来快速构建导航结构。
491 1
Vue3面包屑(Breadcrumb)