diff --git a/docs/en/install/README.md b/docs/en/install/README.md index 7c3c91bd8a..e8e5734b39 100644 --- a/docs/en/install/README.md +++ b/docs/en/install/README.md @@ -298,6 +298,8 @@ Use environment variables is recommended to avoid conflicts during upgrade. `PROXY_URL_REGEX`: regex for url of enabling proxy, default to `.*` +`NODE_NAME`: node name, used for load balancing, identify current node + ### User Authentication Routes in `protected_route.js` will be protected using HTTP Basic Authentication. diff --git a/docs/install/README.md b/docs/install/README.md index 18cb7ecedc..05582459d2 100644 --- a/docs/install/README.md +++ b/docs/install/README.md @@ -370,6 +370,8 @@ RSSHub 支持 `memory` 和 `redis` 两种缓存方式 `LOGGER_LEVEL`: 指明输出到 console 和日志文件的日志的最大[等级](https://github.com/winstonjs/winston#logging-levels),默认 `info` +`NODE_NAME`: 节点名,用于负载均衡,识别当前节点 + ### 部分 RSS 模块配置 - pixiv 全部路由: [注册地址](https://accounts.pixiv.net/signup) diff --git a/lib/config.js b/lib/config.js index efcade19c6..ac38ca56f1 100644 --- a/lib/config.js +++ b/lib/config.js @@ -34,6 +34,7 @@ module.exports = { password: process.env.REDIS_PASSWORD || null, }, }, + nodeName: process.env.NODE_NAME, pixiv: { client_id: 'MOBrBDS8blbauoSck0ZfDbtuzpyT', client_secret: 'lsACyCD94FhDUtGTXi3QzcFE2uU1hqtDaKeqrdwj', diff --git a/lib/middleware/header.js b/lib/middleware/header.js index 6e1a81d8bd..d50c871e57 100644 --- a/lib/middleware/header.js +++ b/lib/middleware/header.js @@ -6,6 +6,9 @@ const headers = { 'Content-Type': 'application/xml; charset=utf-8', 'Cache-Control': `public, max-age=${config.cache.routeExpire}`, }; +if (config.nodeName) { + headers['RSSHub-Node'] = config.nodeName; +} module.exports = async (ctx, next) => { logger.info(`${ctx.url}, user IP: ${ctx.ips[0] || ctx.ip}`); diff --git a/lib/routes/index.js b/lib/routes/index.js index 0272f97be9..ac75aa6905 100644 --- a/lib/routes/index.js +++ b/lib/routes/index.js @@ -51,6 +51,12 @@ module.exports = async (ctx) => { ctx.body = art(path.resolve(__dirname, '../views/welcome.art'), { showDebug, debug: [ + config.nodeName + ? { + name: '节点名', + value: config.nodeName, + } + : null, { name: 'git hash', value: gitHash, diff --git a/lib/views/welcome.art b/lib/views/welcome.art index 308aeebf8c..c7835df201 100644 --- a/lib/views/welcome.art +++ b/lib/views/welcome.art @@ -26,7 +26,7 @@ details { text-align: left; max-height: 400px; - overflow: scroll; + overflow: auto; } details::-webkit-scrollbar { @@ -91,10 +91,12 @@
debug {{ each debug }} + {{ if $value }}
{{ $value.name }}: {{@ $value.value }}
+ {{ /if }} {{ /each }}
{{ /if }} diff --git a/test/middleware/debug.js b/test/middleware/debug.js index 05e5f273ed..dbdec5733a 100644 --- a/test/middleware/debug.js +++ b/test/middleware/debug.js @@ -1,3 +1,5 @@ +process.env.NODE_NAME = 'mock'; + const supertest = require('supertest'); const { server } = require('../../lib/index'); const request = supertest(server); @@ -34,6 +36,9 @@ describe('debug', () => { .html() .trim(); switch (key) { + case '节点名:': + expect(value).toBe('mock'); + break; case 'git hash:': expect(value).toBe(gitHash); break; diff --git a/test/middleware/header.js b/test/middleware/header.js index b1219a0048..8ffa6272fb 100644 --- a/test/middleware/header.js +++ b/test/middleware/header.js @@ -1,3 +1,5 @@ +process.env.NODE_NAME = 'mock'; + const supertest = require('supertest'); const { server } = require('../../lib/index'); const request = supertest(server); @@ -15,6 +17,6 @@ describe('header', () => { expect(response.headers['content-type']).toBe('application/xml; charset=utf-8'); expect(response.headers['cache-control']).toBe(`public, max-age=${config.cache.routeExpire}`); expect(response.headers['last-modified']).toBe(response.text.match(/(.*)<\/lastBuildDate>/)[1]); - // expect(response.headers.etag).toBe('"b37-MORyrF0tJ8BFw0xLLZL/zBYAFPY"'); + expect(response.headers['rsshub-node']).toBe('mock'); }); });