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');
});
是否每次重试请求时都会丢失相同的文件?是否有一个网络服务器,例如nginx可能会拦截请求?你确定这些请求是指向正确的域和端口吗? – takinola 2014-11-21 18:38:24
@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
文件有多大?那里有多少?是否有可能发生超时,因为浏览器需要花费太多时间来处理之前发出的所有请求? – takinola 2014-11-21 19:13:52