举杯邀月

egg框架通过 nginx 拆分多应用,并且只针对某个应用使用中间件进行验证

摘要:我是一个PHP开发,有过两年的前端开发经验,这次在做站的时候想尝试点新鲜的东西,经过身边前端朋友的推荐,使用egg框架,尽管第一次使用node做开发遇到了很多问题,但是也真实的感受到了现在前段的无穷魅力。

我是一个PHP开发,有过两年的前端开发经验,这次在做站的时候想尝试点新鲜的东西,经过身边前端朋友的推荐,使用egg框架,尽管第一次使用node做开发遇到了很多问题,但是也真实的感受到了现在前段的无穷魅力。

我做的这个站点分为两个块,一个是前台页面的展示,一个是后台的接口。php框架无论是TP、Yii对于多应用,都是很好拆分的,但是在使用egg框架的时候,却并没有找到文档上有关拆分多应用的案例,难道我一个项目要弄两个服务?这绝对是不行的,一个项目里很多的方法都是公用的,拆分两个服务也就意味着这些方法全都是复写一遍,于是乎尝试自己拆分一个多应用出来。

首先是地址的区分,前台页面是一个二级域名,后台接口是一个二级域名,但是egg服务启动后只有一个端口,那么就在路径上做了拆分:

// egg 路由
// 在 app 目录下新建 router 目录,并创建 api.js web.js 两个路由文件做区分
// api.js
'use strict';

module.exports = app => {
    const { router, controller } = app;
    router.get('/api/index', controller.api.index.index);
}

//web.js
// api.js
'use strict';

module.exports = app => {
    const { router, controller } = app;
    router.get('/index', controller.web.index.index);
}

//然后修改 app 目录下的路有文件,引入这两个定义好的路由
'use strict';

module.exports = app => {
    require('./router/pc')(app);
    require('./router/api')(app);
};

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

这样,路由就把路径定义开了,接着是修改nginx的配置:

server
{
    listen       80;
    server_name  www.xxx.cn;

    location ^~ /api {
        return 404;
    }

    location / {
        proxy_pass http://127.0.0.1:7001;
    }
}

server
{
    listen       80;
    server_name  api.xxx.cn;

    location / {
        proxy_pass http://127.0.0.1:7001/api/;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

egg服务启动后默认的端口是 7001 ,这个根据自身去修改,另外这里只是把主要的配置展示出来,其他的配置也根据自身去修改。

另一个就是需求就是 api 模块后台的接口,是需要验证的,我们去修改 config下的config.default.js文件达到需求:

config.middleware = [ 'authToken' ];
config.authToken = {
    match: ['/api']  //只针对 api 进行验证
};
1
2
3
4

第一句是启用一个中间件,这个中间件配置在 app/middleware 下,名字就是文件的名。

第二句是只针对api路径才会走这个中间件。

这样,就通过nginx强制的拆分了两个应用出来,虽然办法有点low,但是总比启动两个服务要好得多,如果小伙伴有其他办法,我们一起去商讨研究哦。

作者:举杯邀月

出处: http://www.hug-code.cn/archives/5fca0782af559.html

2020-09-29 标签: eggnginx