我正在使用一台服务器来托管多个Node.js网络应用程序,这些应用程序分布在多个域中.我目前的做法是为不同端口上的每个应用程序运行Express服务器,并运行只是将请求路由(重定向)到正确的端口/ Express服务器的基本服务器.这有效,但这意味着我的基本服务器正在路由每个HTTP请求(并通过手动重定向),并且我的用户将我的应用视为托管在[hostname.com]:8000.
经过一些研究,我发现我可以使用http-proxy来满足我的路由需求,但我仍然想知道在同一系统上运行多个Express服务器是否有最佳实践.这是我计划如何做的:
每个Web应用程序都有自己的文件夹,具有完整的Express文件夹结构(app.js,路由,视图等).应用程序将按域分组,因此示例文件夹结构将是:
hostname.com/
app.js
routes/
views/
...
app1/
app1.js
routes/
views/
...
app2
...
hostname2.com/
app.js
routes/
views/
...
Run Code Online (Sandbox Code Playgroud)
我将不得不分别用节点(或永远,我目前正在使用)运行每个app.js ,并且每个都必须在内部使用不同的端口,并且跨应用重定向指向端口目标应用.
那么,这是我目前的计划.有什么问题,我应该避免哪些陷阱?最重要的是,是否有针对此问题的既定解决方案 - 使用Node.js/Express在同一系统上托管多个Web应用程序的问题?
编辑:我计划最终使用WebSockets和HTTPS,我的设置可以支持的带宽量对我来说并不重要 - 这是一个开发服务器(至少现在).感谢David Ellis提出的WebSockets问题.
第二次编辑:感谢EhevuTov和David Ellis的回答,两者都有很大帮助.我仍在为我的应用程序确定一个整体结构,看起来这个问题通过StackOverflow问题得到了详细解决
第三次编辑:自从发布这个问题以来我已经找到了一些方法(尽管我还有很长的路要走).在我的GitHub存储库中查看这个文件,它利用了我从这个问题的答案中学到的东西!
我正在使用节点版本为.0.6.5 的npm package express版本2.5.2.我似乎在Debian 4.4.5上运行bash版本4.1.5.
我正在尝试在生产模式下运行我的服务器,但它仍然在开发模式下运行.
我在我的bash shell中运行这些命令:
$ export NODE_ENV=production
$ echo $NODE_ENV
production
$ sudo echo $NODE_ENV
production
$ sudo node bootstrap.js
Run Code Online (Sandbox Code Playgroud)
我在bootstrap.js中有这个代码:
var bootstrap_app = module.exports = express.createServer();
//...
console.log(bootstrap_app.settings.env);
Run Code Online (Sandbox Code Playgroud)
这是我看到的标准印刷出来的:
development
Run Code Online (Sandbox Code Playgroud)
这是我的用法或系统的问题吗?
编辑: 感谢ThiefMaster正确识别此问题源于我作为root运行节点.ThiefMaster建议使用iptables从端口80转发到非特权端口,但是我的系统给了我一个错误.将此讨论发送到superuser.com或serverfault.com(链接到后面)
development-environment environment-variables production-environment node.js express
我在我的PHP脚本(PHP 5.6,Apache 2.2)中间歇性地遇到了这个问题:
警告:无法修改标头信息 - 已在第55行的/path/to/index.php中发送的标头
这个警告没有我在其他问题中看过的"发送者"部分,所以我在犯罪header()
和setcookie()
调用之前添加了这段代码:
if (headers_sent($filename, $linenum)){
echo("Output buffer: #" . ob_get_contents() . "#");
echo "Headers already sent in $filename on line $linenum: ";
print_r(headers_list());
}
Run Code Online (Sandbox Code Playgroud)
这是问题发生时我得到的输出:
Output buffer: ##
Headers already sent in on line 0:
Array (
[0] => X-Powered-By: PHP/5.6.23
[1] => Content-type: text/html; charset=UTF-8
)
Run Code Online (Sandbox Code Playgroud)
(旁注:我在php.ini中将output_buffering设置为4096字节,所以这两个标题中的63个字符是否应该被缓存并等待更多,而不是过早发送?)
第一次启动包含Web服务器的Docker容器时出现此问题.之后,当我第一次访问我的网站(可能是一两个小时),当我打电话并登录用户或重定向到登录页面时,它只会(但不总是)发生.header()
setcookie()
我已阅读并重读了一般"已发送标题"错误的答案,并且尽我所能,我已排除了这些可能的原因:
print
,echo
等等.在我调用setcookie()
或header()
auto_prepend_file
php.ini设置gzip
流编码 - …我正在寻找使用HTML5 Canvas和JavaScript创建一个纸牌游戏,我想知道什么Canvas工具可以让我的生活更轻松.
我找到了CreateJS并在其上做了一些笔记:
还有哪些其他工具/引擎可用于为浏览器制作纸牌游戏?
工具/框架的奖励点可以帮助我在HTML5 Canvas之外.我在后端使用Node.js,并计划使用Socket.IO/Express/MongoDB,因为这就是我所知道的.
注意:我在此Google Doc中收集了有关游戏引擎/工具(包括上面的CreateJS注释)的一些注释.随意添加您的观点到这个文档.
所以我试着按照这个教程视频:
http://nodetuts.com/tutorials/13-authentication-in-express-sessions-and-route-middleware.html#video
因此我在我的routes/index.js
文件顶部有这个代码:
var todo = require('../todo'); //line 1
//line 2
//new session //line 3
exports.newSession = function (req, res) { //line 4
res.render('sessions/new', { //**line 5**
locals: {
redir: req.query.redir
}
});
};
Run Code Online (Sandbox Code Playgroud)
但是,当我运行我的应用程序并触发routes.newSession
处理程序时,我收到此错误:
500 SyntaxError: Unexpected identifier
at Object.Function (unknown source)
at Object.compile (/home/admin73464/todo/node_modules/jade/lib/jade.js:161:8)
at Function.compile (/home/admin73464/todo/node_modules/express/lib/view.js:65:33)
at ServerResponse._render (/home/admin73464/todo/node_modules/express/lib/view.js:414:18)
at ServerResponse.render (/home/admin73464/todo/node_modules/express/lib/view.js:315:17)
at /home/admin73464/todo/routes/index.js:5:6
at callbacks (/home/admin73464/todo/node_modules/express/lib/router/index.js:272:11)
at param (/home/admin73464/todo/node_modules/express/lib/router/index.js:246:11)
at pass (/home/admin73464/todo/node_modules/express/lib/router/index.js:253:5)
at Router._dispatch (/home/admin73464/todo/node_modules/express/lib/router/index.js:280:4)
Run Code Online (Sandbox Code Playgroud)
我的index.js
文件中没有看到任何语法错误; 你呢?我应该在别的地方寻找吗?
提前致谢!
编辑:这是我的views/sessions/new.jade文件的内容:
h1 …
Run Code Online (Sandbox Code Playgroud) node.js ×4
express ×3
game-engine ×1
html5-canvas ×1
http-headers ×1
http-proxy ×1
javascript ×1
php ×1
php-5.6 ×1
syntax-error ×1
vhosts ×1