网站速度优化(一)——Express中间件摆放顺序之坑

为什么我写的Express服务静态资源访问速度这么慢???
直接把这个问题放进百度当然是没有答案的
准确的说是没有准确的答案
谷歌之 依然无果
翻译成英文再搜
最上面一条是StackoverFlow的
上面的人提了和我一样的问题

1
"Node.js + Express.js very slow serving static files"

回答是

1
2
3
4
5
I had exactly the same issue. I just moved to a place with a pretty bad internet connection. Loading time of static files in my node.js app increased to more then 40s per file.
I just moved the static middleware
app.use(express.static(__dirname + '/public'));
to the top of app.configure function, before all the other app.* calls.
It's now working significantly faster.

没错,就是把app.use(express.static(__dirname + ‘/public’));这句代码放到app.configure的最上面!!!

But Why?

仔细思考下就知道了,客户端请求进入Express后,是按中间件的摆放顺序从上往下执行的,一开始我是放在最底下的,真的!最底下!我也不知道为什么我要放在最底下,反正我就是放在最底下了,也没人告诉我放最底下不好….TAT
放在最底下也就意味着静态资源请求进入Express后,先要经过bodyParser,session,cookie,passport等一系列中间件才会返回…饶了一大圈,静态资源完全没有必要经过这些中间件,移到最上面后果然
速度也没变多少……
看来问题不在这里
还是上面的StackOverFlow, 答题者和问题者在下面互回了好几条,挺搞笑的
下面又说了一种方案
在中间件开始处添加

1
2
3
4
app.use(function(req, res, next) {
req.connection.setNoDelay(true);
next();
});

这是什么呢?我谷歌了下,大概了解了下,服务器为了提高性能,会合并小的请求,等数据包达到一定大小或者超过40ms才会返回给客户端,如果设置了上面的代码就不会合并小的请求但是也不会等40ms才返回了
很显然这也不是我想要的答案。
说实话,很奇怪平时也是这样写的,放在服务器上反应都很快,这次却很慢,写到这里我感觉问题不是出在服务器上,而是前端的代码上。
再从服务器端追查也是没有结果了,还是早点睡吧,明天还有早课。改天再看看。