基本用法
const http = require('node:http')
const url = require('node:url')
// req前端发送的请求信息 res给前端响应的信息
http.createServer((req, res) => {
const { pathname, query } = url.parse(req.url, true)
if (req.method === 'GET') {
if (pathname === '/get') {
console.log(query)
res.end('GET')
} else {
res.statusCode = 404
res.end('404')
}
} else if (req.method === 'POST') {
// console.log(res)
if (pathname === '/login') {
let data = ''
req.on('data', (chunk) => {
console.log(chunk)
data+=chunk
})
req.on('end', () => {
res.statusCode = 200
res.setHeader('Content-Type', 'application/json')
res.end(data)
})
} else {
res.statusCode = 404
res.end('POST')
}
// res.end('POST')
}
}).listen(3000, ()=> {
console.log('server is running')
})
正向代理
正向代理就是代理服务器替代访问方【用户A】去访问目标服务器【服务器B】
1.访问本无法访问的服务器B
假设最初用户A要访问服务器B需要经过R1和R2路由器这样一个路由节点,
如果路由器R1或者路由器R2发生故障,那么就无法访问服务器B了。
但是如果用户A让代理服务器Z去代替自己访问服务器B,由于代理服务器Z没有在
路由器R1或R2节点中,而是通过其它的路由节点访问服务器B,
那么用户A就可以得到服务器B的数据了
2.加速访问服务器B
假设用户A到服务器B,经过R1路由器和R2路由器,而R1到R2路由器的链路
是一个低带宽链路。而用户A到代理服务器Z,从代理服务器Z到服务器B都是高带宽链路。
那么很显然就可以加速访问服务器B了
3.Cache作用
如果在用户A访问服务器B某数据J之前,已经有人通过代理服务器Z访问过服务器B
上得数据J,那么代理服务器Z会把数据J保存一段时间,如果有人正好取该数据J,
那么代理服务器Z不再访问服务器B,而把缓存的数据J直接发给用户A
4.防火墙作用
5.隐藏访问者的行踪
代理服务器Z代替用户A去直接与服务器B进行交互,服务器b看不出真实的访问用户
反向代理
反向代理:它充当服务器和客户端之间的中介,将客户端的请求转发到一个或多个后端服务器,
并且将后端服务器的响应返回给客户端
1.负载均衡:反向代理根据预先定义的算法将请求分发到多个后端服务,以实现负载均衡。避免某个后端服务器过载,
提高整体性能和可用性
2.高可用性:通过反向代理,将请求转发到多个后端服务器,以提高冗余和故障转移,如果一个后端服务器出现故障,
代理服务器可将请求转发到其他服务器,实现高可用性
3.缓存和性能优化:反向代理可以缓存静态资源或经常访问的动态内容,还可以通过压缩,合并和性能优化等技术来
优化网络性能
4.安全性:反向代理可以作为防火墙,保护后端服务免受恶意攻击,可以过滤恶意请求,检测和阻止攻击,提供安全认证和访问控制
5.域名和路径重写:反向代理可以根据特定规则重写请求路径和域名,实现url和路由重定向。
npm install http-proxy-middleware
// index.js
const http = require('node:http');
const url = require('node:url');
const fs = require('node:fs');
const { createProxyMiddleware } = require('http-proxy-middleware');
const html = fs.readFileSync('./index.html');
const config = require('./xm.config.js');
http.createServer((req, res) => {
const { pathname } = url.parse(req.url);
const proxyList = Object.keys(config.server.proxy)
if(proxyList.includes(pathname)){
const proxy = createProxyMiddleware(config.server.proxy[pathname])
proxy(req, res)
return
}
res.writeHead(200, {
'Content-Type': 'text/html'
});
res.end(html);
}).listen(80, () => {
})
// test.js
const http = require('node:http');
const url = require('node:url');
http.createServer((req, res) => {
const { pathname } = url.parse(req.url);
if (pathname === '/api') {
res.end('proxy success')
}
}).listen(3000, () => {
console.log('server is running on port 3000');
})
// xm.config.js
module.exports = {
server: {
proxy: {
'/api': {
target: 'http://localhost:3000',
changeOrigin: true,
}
}
}
}
//index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div>123</div>
<script>
fetch('/api').then(res=> res.text()) // 这里发请求进行代理
</script>
</body>
</html>
动静分离
动静分离是一种在Web服务器架构中常用的优化技术,旨在提高网站的性能和可伸缩性
将动态生成的内容(如动态网页、API请求)与静态资源(如HTML、CSS、JavaScript、图像文件)分开处理和分发
import http from 'node:http'
import fs from 'node:fs'
import path from 'node:path'
import mime from 'mime'
const server = http.createServer((req, res) => {
const { method, url } = req
console.log(method, url)
if(method === 'GET' && url.startsWith('/asset')){
const staticPath = path.join(process.cwd(), url)
console.log(staticPath)
fs.readFile(staticPath, (err, data) => {
if (err){
res.writeHead(404, {
'Content-Type': 'text/plain'
})
res.end('404 Not Found')
return
} else {
const type = mime.getType(staticPath)
console.log('来了老弟')
res.writeHead(200, {
'Content-Type': type,
'Cache-Control': 'public, max-age=3600' // 缓存
})
res.end(data)
}
})
}
// 动态资源
if(method === 'GET' && url.startsWith('/api')){
res.writeHead(200, {
'Content-Type': 'application/json'
})
res.end(JSON.stringify({
code: 200,
msg: 'success',
data: {
name: 'xm',
age: 18
}
}))
}
})
server.listen(80, () => {
console.log('server is running')
})
邮件服务
// npm install js-yaml
// npm install nodemailer
import http from 'node:http'
import fs from 'node:fs'
import url from 'node:url'
import yaml from 'js-yaml'
import nodemailer from 'nodemailer'
const mailInfo = yaml.load(fs.readFileSync('./mail.yaml', 'utf8'))
console.log(mailInfo)
const transporter = nodemailer.createTransport({
service: 'qq',
host: 'smtp.qq.com',
port: 587,
secure: true,
auth: {
user: mailInfo.user,
pass: mailInfo.pass
}
})
http.createServer((req, res) => {
const { pathname } = url.parse(req.url)
const { method } = req
if (method === 'POST' && pathname === '/send/mail') {
let data = ''
req.on('data', (chunk) => {
data += chunk
})
req.on('end', () => {
const { to, subject, text } = JSON.parse(data)
transporter.sendMail({
to,
from: mailInfo.user,
subject,
text
})
res.end('success send mail')
})
// transporter.sendMail({
// to: "发件人",
// from: "收件人",
// subject: "标题",
// text: "内容",
// })
}
}).listen(3000, () => {
console.log('server is running')
})