Node / Express服务器随机跳过对静态文件的请求

时间:2014-11-21 17:37:21

标签: node.js express

我遇到了节点/快速服务器的一种非常奇怪的行为。有时,大约有五分之一的页面加载,它会随机拒绝提供页面请求的一个或另一个静态文件。

浏览器失败并显示消息" [错误]无法加载资源:请求超时。"同时,快递认为根本没有要求(见下面代码中的评论)。

我已经简化了代码,以至于我不知道还有什么要评论,而且它仍然在做。生成的页面需要来自/ js的4个js文件和来自/ img的大约30个图片。所有静态文件的总大小约为2MB。这些文件中的任何一个(或几个)都可能丢失。这可能与加载和/或内存泄漏无关,因为它发生在没有用户重启后的服务器上。

这是在数字海洋液滴上运行,512MB内存和Ubuntu上的MEAN库存。没有例外。

process.on('uncaughtException', function (e) {
  console.log(new Date().toString(), e.stack || e);
  process.exit(1);
});



var http = require('http'),
    https = require('https'),
    fs = require('fs'),
    express = require('express'),
    path = require('path'),
    pagemaker=require('./app/pagemaker').pagemaker; 

    var privateKey  = fs.readFileSync(path.join(__dirname, 'ssl/server.key'), 'utf8');
    var certificate = fs.readFileSync(path.join(__dirname, 'ssl/server.crt'), 'utf8');

    var intcert1 = fs.readFileSync(path.join(__dirname, 'ssl/comdom.crt'), 'utf8');
    var intcert2 = fs.readFileSync(path.join(__dirname, 'ssl/comtrust.crt'), 'utf8');
    var credentials = {key: privateKey, cert: certificate, ca:[intcert1, intcert2]};

var app = express();

app.set('views', path.join(__dirname, 'app/views'));
app.set('view engine', 'jade');

////////////////////////////////////////////////////////////////////////////////////
// if the browser reports some file as missing, it is also missing in the output of this function!
app.use(function(req, res, next) {
  console.log(req.protocol+'://' + req.headers.host + req.originalUrl);
  next();
});
////////////////////////////////////////////////////////////////////////////////////

app.use('/img',express.static(path.join(__dirname, 'public/img'), {maxAge: 86400000}));
app.use('/js',express.static(path.join(__dirname, 'public/js'), {maxAge: 86400000})); 

app.get('/', function(req, res) { 

   var page=pagemaker('index', 'pt');
   res.set('Content-Type','text/html; charset=UTF-8'); 
   res.send(200, page); 

});

app.use(function (req,res) { 
    res.render('404', {url:req.url}); 
});

https.globalAgent.maxSockets = 999; 

https.createServer(credentials, app).listen(9877, function(){
  console.log('SSL Express server listening on port 9877');
});

1 个答案:

答案 0 :(得分:1)

这显然是由数字海洋数据中心的问题引起的,与我的行为无关。

我通过对不同数据中心的两个相同的新水滴进行围攻来诊断这一点。两者都处于运行示例MEAN应用程序的默认配置中。阿姆斯特丹的那个(我的原始水滴在那里)有同样的问题,在伦敦的那个工作得非常好。

当我准备提交一张票时,鬼鬼祟祟的混蛋修了一些东西,现在问题就消失了。

花了我3天的时间。谢谢,DO!