节点预呈现器处理第一页加载 - 后续加载时出现 500 错误
Node Prerender Working on First Page Load - 500 Error on Subsequent Loads
你可以验证是这样的。点击link,让它加载,然后刷新:http://www.justinmcmahon.com/?_escaped_fragment_=
可能很重要:我的应用 运行 在端口 3000 上的 docker 容器中,预渲染服务器(在端口 9000 上)也是如此,两者都 运行 落后官方 Nginx docker 镜像。
也可能很重要:顶级域有一个 .htaccess 重定向到 www 子域,它指向一个 AWS 弹性 IP。我在这方面还不是很聪明,所以这是迄今为止我想出的最好的方法来指出正确的方向。
.htaccess 重定向
RewriteEngine on
RewriteRule ^(.*)$ http://www.justinmcmahon.com/ [R=301,L]
Nginx docker-compose.yml:
nginx:
build: .
container_name: Nginx
hostname: nginx
restart: always
environment:
- DEFAULT_HOST=www.justinmcmahon.com
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
ports:
- 80:80
- 443:443
- 5984:5984
预呈现 Docker文件
FROM node:5.2.0
ENV NPM_CONFIG_PRODUCTION=true
ENV NODE_ENV=production
COPY dist /app
WORKDIR /app
RUN npm install
EXPOSE 9000
CMD ["node", "server"]
我的 Express 配置顶部有以下内容:
app.use(require('prerender-node').set('prerenderServiceUrl', config.PRERENDER_SERVICE_URL));
Docker 预呈现容器的日志显示 304 状态,但 Express 抛出 500
我找到了一个似乎可以解决问题的解决方案,但我不喜欢它,因为我不确定它可能会产生什么意想不到的后果。
在 /server.js
中,我将 PRERENDER_NUM_WORKERS
和 PRERENDER_NUM_ITERATIONS
默认为 1 并取消注释 inMemoryHtmlCache()
#!/usr/bin/env node
var prerender = require('./lib');
var server = prerender({
workers: process.env.PRERENDER_NUM_WORKERS || 1,
iterations: process.env.PRERENDER_NUM_ITERATIONS || 1
});
server.use(prerender.sendPrerenderHeader());
// server.use(prerender.basicAuth());
// server.use(prerender.whitelist());
server.use(prerender.blacklist());
// server.use(prerender.logger());
server.use(prerender.removeScriptTags());
server.use(prerender.httpHeaders());
server.use(prerender.inMemoryHtmlCache());
// server.use(prerender.s3HtmlCache());
server.start();
我愿意接受更好的答案,或者至少保证这是一个可以接受的解决方案,并且可能会解释原因。
你可以验证是这样的。点击link,让它加载,然后刷新:http://www.justinmcmahon.com/?_escaped_fragment_=
可能很重要:我的应用 运行 在端口 3000 上的 docker 容器中,预渲染服务器(在端口 9000 上)也是如此,两者都 运行 落后官方 Nginx docker 镜像。
也可能很重要:顶级域有一个 .htaccess 重定向到 www 子域,它指向一个 AWS 弹性 IP。我在这方面还不是很聪明,所以这是迄今为止我想出的最好的方法来指出正确的方向。
.htaccess 重定向
RewriteEngine on
RewriteRule ^(.*)$ http://www.justinmcmahon.com/ [R=301,L]
Nginx docker-compose.yml:
nginx:
build: .
container_name: Nginx
hostname: nginx
restart: always
environment:
- DEFAULT_HOST=www.justinmcmahon.com
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
ports:
- 80:80
- 443:443
- 5984:5984
预呈现 Docker文件
FROM node:5.2.0
ENV NPM_CONFIG_PRODUCTION=true
ENV NODE_ENV=production
COPY dist /app
WORKDIR /app
RUN npm install
EXPOSE 9000
CMD ["node", "server"]
我的 Express 配置顶部有以下内容:
app.use(require('prerender-node').set('prerenderServiceUrl', config.PRERENDER_SERVICE_URL));
Docker 预呈现容器的日志显示 304 状态,但 Express 抛出 500
我找到了一个似乎可以解决问题的解决方案,但我不喜欢它,因为我不确定它可能会产生什么意想不到的后果。
在 /server.js
中,我将 PRERENDER_NUM_WORKERS
和 PRERENDER_NUM_ITERATIONS
默认为 1 并取消注释 inMemoryHtmlCache()
#!/usr/bin/env node
var prerender = require('./lib');
var server = prerender({
workers: process.env.PRERENDER_NUM_WORKERS || 1,
iterations: process.env.PRERENDER_NUM_ITERATIONS || 1
});
server.use(prerender.sendPrerenderHeader());
// server.use(prerender.basicAuth());
// server.use(prerender.whitelist());
server.use(prerender.blacklist());
// server.use(prerender.logger());
server.use(prerender.removeScriptTags());
server.use(prerender.httpHeaders());
server.use(prerender.inMemoryHtmlCache());
// server.use(prerender.s3HtmlCache());
server.start();
我愿意接受更好的答案,或者至少保证这是一个可以接受的解决方案,并且可能会解释原因。