2014-11-21 59 views
0

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

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

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

这运行在数字海洋液滴与512MB内存和他们的库存在Ubuntu上的平均水平。没有显示例外。

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'); 
}); 
+0

是否每次重试请求时都会丢失相同的文件?是否有一个网络服务器,例如nginx可能会拦截请求?你确定这些请求是指向正确的域和端口吗? – takinola 2014-11-21 18:38:24

+0

@takinola:它总是不同的文件。并非每次。平均而言,5页加载中的4个就好了。如果不好,任何静态文件都可能丢失。没有nginx。节点通过iptables连接到443:'iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT - 到端口9877' – 2014-11-21 18:48:23

+0

文件有多大?那里有多少?是否有可能发生超时,因为浏览器需要花费太多时间来处理之前发出的所有请求? – takinola 2014-11-21 19:13:52

回答

0

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

我通过在两个相同的新数据中心上运行攻击来诊断这个问题。两者都在默认配置下运行示例MEAN应用程序。在阿姆斯特丹的那个地方(我的原始水滴)有同样的问题,伦敦的一个工作得很好。

当我准备提交一张票时,那些鬼鬼祟祟的混蛋固定了一些东西,现在问题没有了。

花费我3天。谢谢,请!