Skip to content

Latest commit

 

History

History
156 lines (118 loc) · 2.84 KB

02.架构优化.md

File metadata and controls

156 lines (118 loc) · 2.84 KB

动静分离

概念梳理

静态内容:基本不会变动,使用 CDN分发,HTTP 缓存等

动态内容:因为请求参数而变动,用大量的源站机器承载,结合反向代理进行负载均衡

使用nginx静态服务

yum install nginx
yum install nodejs

ngnix -v #确定是否安装成功

ngnix #启动nginx

netstat -nlp | grep 80 #查看80 端口是否已被占用

vi /etc/nginx/nginx.conf #编辑 nginx 配置文件

在根目录下创建静态文件夹

mkdir static
cd static 
touch index.html

修改ngnix配置

user root #位于配置文件开头,用root账户启动nginx
...
http  {
    server {
        root /root/static
    }
}

重启nginx

nginx -s reload

对比与nodejs的效率

curl http://127.0.0.1:3000/index.html  #查看文件是否正确

下载ab压测工具

yum install httpd-tools  

压测

ab -c400 -n1600  http://127.0.0.1:3000 
# 并发 400,测试 1600 次

ab -c400 -n1600 http://127.0.0.1:80/index.html

反向代理及缓存服务

配置反向代理

http{
    server{
        #路径匹配,路径参数用正则,匹配到/node/(\d*)路径则转发
        location ~/node/(\d*){
            # 反射代理服务器设置,进行处理的服务器是 3000 端口上运行的服务
            proxy_pass http://127.0.0.1:3000/detail?columid=$1;
        }
    }
}

配置负载均衡

http{
    upstream node.com{
        server 127.0.0.1:3000;
        server 127.0.0.1:3001;
    }
    server{
        location ~/node/(\d*){
            proxy_pass http://node.com/detail?columid=$1
        }
    }
}

配置缓存

http{
    upstream node.com{
        server 127.0.0.1:3000;
        server 127.0.0.1:3001;
    }
    server{
        location ~/node/(\d*){
            proxy_pass http://node.com/detail?columid=$1
            # 缓存配置,将对应页面进行缓存
            proxy_cache
        }
    }
}

nodejs 接入redis缓存服务

redis将内存作为存储,可以用多个nodejs同时共享一份redis存储,适合分布式nodejs

const app = new (require('koa'))
const cacheRedis = require('redis')('cache')
const backupRedis = require('redis')('backup')

app.use(async (ctx,next)=>{
    // 取出redis缓存
    const result = await cacheRedis(ctx.url);

    if(result){
        ctx.body = result;
        return
    }

    await next();

    if(ctx.status == 200){
        // 将页面返回结果写入redis
        // expire设置缓存时间
        cacheRedis.set(ctx.url, ctx.body, {expire:20000})
        backRedis.set(ctx.url, ctx.body, {expire:20000})
    }

    if(ctx.status != 200){
        // 从备份redis取出结果进行兜底
        const result = await backupRedis(ctx.url);
        ctx.status = 200;
        ctx.body = result;
    }
})