diff --git a/package.json b/package.json index cc8f4c9..b3e32ea 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,13 @@ "main": "server.js", "author": "", "scripts": { - "check": "cross-env NODE_ENV=development node --inspect-brk server.js", - "check.sup": "cross-env NODE_ENV=development supervisor -i node_modules,webroot --inspect-brk -- server.js", - "demo": "cross-env NODE_ENV=development nodemon server.js", - "demo.sup": "cross-env NODE_ENV=development supervisor -i node_modules,webroot -- server.js", - "serve": "cross-env NODE_ENV=production nodemon server.js", - "serve.sup": "cross-env NODE_ENV=production supervisor -i node_modules,webroot -- server.js", - "serve.pm2": "cross-env NODE_ENV=production pm2 start server.js" + "check": "npx cross-env NODE_ENV=development node --inspect-brk server.js", + "check.sup": "npx cross-env NODE_ENV=development npx supervisor -i node_modules,_webroot --inspect-brk -- server.js", + "demo": "npx cross-env NODE_ENV=development npx nodemon server.js", + "demo.sup": "npx cross-env NODE_ENV=development npx supervisor -i node_modules,_webroot -- server.js", + "serve": "npx cross-env NODE_ENV=production npx nodemon server.js", + "serve.sup": "npx cross-env NODE_ENV=production npx supervisor -i node_modules,_webroot -- server.js", + "serve.pm2": "npx cross-env NODE_ENV=production npx pm2 start server.js" }, "dependencies": { "body-parser": "^1.18.2", diff --git a/server.js b/server.js index f56d662..4f32f53 100644 --- a/server.js +++ b/server.js @@ -4,29 +4,29 @@ const express = require('express') const wo = (global.wo = { envi : require('base.enviconfig').mergeConfig({ - commanderOptions: [ + Commander_Option_List: [ // 命令行里可以接受的参数。将传给 config.js 里的 commander。每个参数的定义格式是 [参数名,参数键,描述],后两者用于传给commander,取值后覆盖掉Config里的同名变量。 - ['protocol', '-P, --protocol ', 'Web Server protocol: http|https|httpall.'], - ['host', '-H, --host ', 'Host IP or domain name.'], - ['port', '-p, --port ', 'HTTP port number.'], - ['webroot', '-w, --webroot ', 'Path to serve as website.'], - ['ssl', '--ssl ', 'SSL options in JSON string.'], + ['Web_Protocol', '-P, --Web_Protocol ', 'Web protocol: http|https|httpall.'], + ['Web_Host', '-H, --Web_Host ', 'Host IP or domain name.'], + ['Web_Port', '-p, --Web_Port ', 'HTTP port number.'], + ['Web_Root', '-w, --Web_Root ', 'Path to serve as website.'], + ['Web_Ssl', '--Web_Ssl ', 'SSL options in JSON string.'], ], // 最基础的必须的默认配置,如果用户什么也没有提供 - protocol: 'http', - host: 'localhost', - webroot: 'webroot', // local path to serve as webroot - webindex: 'index.html', + Web_Protocol: 'http', + Web_Host: 'localhost', + Web_Root: '_webroot', // local path to serve as webroot + Web_Index: 'index.html', // 如果使用虚拟主机 /* vhosts: [ - { webroot: 'dist', webindex: 'index.html', domainList: ['']} + { Web_Root: 'dist', Web_Index: 'index.html', domainList: ['']} ], */ }) }) -if (typeof wo.envi.ssl === 'string') { - wo.envi.ssl = eval(`(${wo.envi.ssl})`) +if (typeof wo.envi.Web_Ssl === 'string') { + wo.envi.Web_Ssl = eval(`(${wo.envi.Web_Ssl})`) } ;(function serve() { @@ -59,9 +59,9 @@ if (typeof wo.envi.ssl === 'string') { // 所以,如果 vhost匹配了域名,且static找到了文件,就结束了。如果 vhost 匹配了域名,但static找不到文件,就继续往下。 if (!wo.envi.vhosts) { server.use( - express.static(path.join(process.cwd(), wo.envi.webroot).replace('\\', '/'), { index: wo.envi.webindex }) // 可以指定到 node应用之外的目录上。windows里要把 \ 换成 /。 + express.static(path.join(process.cwd(), wo.envi.Web_Root).replace('\\', '/'), { index: wo.envi.Web_Index }) // 可以指定到 node应用之外的目录上。windows里要把 \ 换成 /。 ) - //server.use(require('serve-favicon')(path.join(process.cwd(), wo.envi.webroot, 'favicon.ico'))) + //server.use(require('serve-favicon')(path.join(process.cwd(), wo.envi.Web_Root, 'favicon.ico'))) } else { let vhost = require('vhost') for (let h of wo.envi.vhosts) { @@ -69,7 +69,7 @@ if (typeof wo.envi.ssl === 'string') { server.use( vhost( domain, - express.static(path.join(process.cwd(), h.webroot).replace('\\', '/'), { index: h.webindex }) // 可以指定到 node应用之外的目录上。windows里要把 \ 换成 /。 + express.static(path.join(process.cwd(), h.Web_Root).replace('\\', '/'), { index: h.Web_Index }) // 可以指定到 node应用之外的目录上。windows里要把 \ 换成 /。 ) ) } @@ -83,8 +83,8 @@ if (typeof wo.envi.ssl === 'string') { /*** 启动 Web 服务 ***/ let webServer - if ('http' === wo.envi.protocol) { - let portHttp = wo.envi.port || 80 + if ('http' === wo.envi.Web_Protocol) { + let portHttp = wo.envi.Web_Port || 80 webServer = require('http') .createServer(server) .listen(portHttp, function (err) { @@ -92,19 +92,19 @@ if (typeof wo.envi.ssl === 'string') { console.error(err) } else { console.log({time: new Date().toJSON()}, - `Server listening on ${wo.envi.protocol}://${wo.envi.host}:${portHttp} for ${wo.envi.prodev} environment` + `Server listening on ${wo.envi.Web_Protocol}://${wo.envi.Web_Host}:${portHttp} for ${wo.envi.prodev} environment` ) } }) - } else if ('https' === wo.envi.protocol) { - let portHttps = wo.envi.port || 443 + } else if ('https' === wo.envi.Web_Protocol) { + let portHttps = wo.envi.Web_Port || 443 webServer = require('https') .createServer( -// wo.wo.envi.ssl.type==='greenlock' ? greenlock.httpsOptions : +// wo.wo.envi.Web_Ssl.type==='greenlock' ? greenlock.httpsOptions : { - key: fs.readFileSync(wo.envi.ssl.file.key), - cert: fs.readFileSync(wo.envi.ssl.file.cert), - // ca: [ fs.readFileSync(wo.envi.ssl.file.ca) ] // only for self-signed certificate: https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener + key: fs.readFileSync(wo.envi.Web_Ssl.file.key), + cert: fs.readFileSync(wo.envi.Web_Ssl.file.cert), + // ca: [ fs.readFileSync(wo.envi.Web_Ssl.file.ca) ] // only for self-signed certificate: https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener }, server ) @@ -113,17 +113,17 @@ if (typeof wo.envi.ssl === 'string') { console.error(err) } else { console.log({time: new Date().toJSON()}, - `Server listening on ${wo.envi.protocol}://${wo.envi.host}:${portHttps} for ${wo.envi.prodev} environment` + `Server listening on ${wo.envi.Web_Protocol}://${wo.envi.Web_Host}:${portHttps} for ${wo.envi.prodev} environment` ) } }) - } else if ('httpall' === wo.envi.protocol) { - let portHttp = wo.envi.port?.portHttp || 80 - let portHttps = wo.envi.port?.portHttps || 443 -// if (wo.wo.envi.ssl.type==='greenlock') { + } else if ('httpall' === wo.envi.Web_Protocol) { + let portHttp = wo.envi.Web_Port?.portHttp || 80 + let portHttps = wo.envi.Web_Port?.portHttps || 443 +// if (wo.wo.envi.Web_Ssl.type==='greenlock') { // greenlock.listen(portHttp, portHttps, function (err) { // if (err) console.error(err) -// else console.log(`Server listening on [${wo.wo.envi.protocol}] http=>https://${wo.wo.envi.host}:${portHttp}=>${portHttps} for ${server.settings.env} environment`) +// else console.log(`Server listening on [${wo.wo.envi.Web_Protocol}] http=>https://${wo.wo.envi.Web_Host}:${portHttp}=>${portHttps} for ${server.settings.env} environment`) // }) // }else { require('http') @@ -137,7 +137,7 @@ if (typeof wo.envi.ssl === 'string') { console.error(err) } else { console.log({time: new Date().toJSON()}, - `Server redirecting from http://${wo.envi.host}:${portHttp} for ${ + `Server redirecting from http://${wo.envi.Web_Host}:${portHttp} for ${ wo.envi.prodev } environment` ) @@ -146,9 +146,9 @@ if (typeof wo.envi.ssl === 'string') { webServer = require('https') .createServer( { - key: fs.readFileSync(wo.envi.ssl.file.key), - cert: fs.readFileSync(wo.envi.ssl.file.cert), - // ca: [ fs.readFileSync(wo.envi.ssl.file.ca) ] // only for self-signed certificate: https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener + key: fs.readFileSync(wo.envi.Web_Ssl.file.key), + cert: fs.readFileSync(wo.envi.Web_Ssl.file.cert), + // ca: [ fs.readFileSync(wo.envi.Web_Ssl.file.ca) ] // only for self-signed certificate: https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener }, server ) @@ -157,16 +157,16 @@ if (typeof wo.envi.ssl === 'string') { console.error(err) } else { console.log({time: new Date().toJSON()}, - `Server listening on https://${wo.envi.host}:${portHttps} for ${ + `Server listening on https://${wo.envi.Web_Host}:${portHttps} for ${ wo.envi.prodev } environment` ) } }) // } - } else if ('redirectHttp2Https' === wo.envi.protocol) { - let portHttp = wo.envi.port?.portHttp || 80 - let portHttps = wo.envi.port?.portHttps || 443 + } else if ('redirectHttp2Https' === wo.envi.Web_Protocol) { + let portHttp = wo.envi.Web_Port?.portHttp || 80 + let portHttps = wo.envi.Web_Port?.portHttps || 443 webServer = server.all('*', function (ask, reply) { reply.redirect(301, `https://${ask.headers.host.replace(`:${portHttp}`, `:${portHttps}`)}${ask.url}`) }) @@ -175,17 +175,17 @@ if (typeof wo.envi.ssl === 'string') { console.error(err) } else { console.log({time: new Date().toJSON()}, - `Server listening on ${wo.envi.protocol}://${wo.envi.host}:${portHttp} for ${wo.envi.prodev} environment` + `Server listening on ${wo.envi.Web_Protocol}://${wo.envi.Web_Host}:${portHttp} for ${wo.envi.prodev} environment` ) } }) - }else if ('proxyHttps2Http' === wo.envi.protocol) { - let portHttp = wo.envi.port?.portHttp || 80 - let portHttps = wo.envi.port?.portHttps || 443 + }else if ('proxyHttps2Http' === wo.envi.Web_Protocol) { + let portHttp = wo.envi.Web_Port?.portHttp || 80 + let portHttps = wo.envi.Web_Port?.portHttps || 443 var proxy=require('http-proxy').createProxyServer({ ssl: { - key: fs.readFileSync(wo.envi.ssl.file.key), - cert: fs.readFileSync(wo.envi.ssl.file.cert), + key: fs.readFileSync(wo.envi.Web_Ssl.file.key), + cert: fs.readFileSync(wo.envi.Web_Ssl.file.cert), // ca: [ fs.readFileSync(wo.envi.sslCA) ] // https://nodejs.org/api/tls.html#tls_tls_createserver_options_secureconnectionlistener }, target: `http://127.0.0.1:${portHttp}`, // iOS 的 AppStore 要求支持IPv6,只能用国外的vultr.com服务器,因此再代理回国内的solet主机。 @@ -201,7 +201,7 @@ if (typeof wo.envi.ssl === 'string') { console.error(err) } else { console.log({time: new Date().toJSON()}, - `Server listening on ${wo.envi.protocol}://${wo.envi.host}:${portHttps} for ${wo.envi.prodev} environment` + `Server listening on ${wo.envi.Web_Protocol}://${wo.envi.Web_Host}:${portHttps} for ${wo.envi.prodev} environment` ) } })