使用Angular,Vue,React进行单页网站开发,用户浏览时浏览器动态解析JS,呈现出最终的页面,用户体验比较好,网站性能也提升很多。css
但网络爬虫并不会动态解析Js,访问全部URL获得的只会是项目入口文件中的代码,不能获得具体的内容,也就没法作网站SEO。html
使用Prerender.io作网站预渲染,能够将网站页面渲染以后再返回给网络爬虫,间接完成网页的解析。 Prerender相较于其余的解决方案,配置相对要简单一些,不用修改项目源码,代码零侵入,是一个不错的解决方案。html5
搭建基于Centos 7 和 Nginx 环境的Prerender渲染服务,完成Angular项目中网页的预渲染node
server {
listen 80;
server_name example.com;
root /path/to/your/root;
index index.html;
location / {
try_files $uri @prerender;
}
location @prerender {
# 将 YOUR_TOKEN替换为你的我的token
proxy_set_header X-Prerender-Token YOUR_TOKEN;
set $prerender 0;
if ($http_user_agent ~* "googlebot|bingbot|yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest|slackbot|vkShare|W3C_Validator") {
set $prerender 1;
}
if ($args ~ "_escaped_fragment_") {
set $prerender 1;
}
if ($http_user_agent ~ "Prerender") {
set $prerender 0;
}
if ($uri ~* "\.(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {
set $prerender 0;
}
#resolve using Google's DNS server to force DNS resolution and prevent caching of IPs
resolver 8.8.8.8;
if ($prerender = 1) {
# 后续将service.prerender.io替换为本身的prerender服务,如127.0.0.1:3000
set $prerender "service.prerender.io";
rewrite .* /$scheme://$host$request_uri? break;
proxy_pass http://$prerender;
}
if ($prerender = 0) {
rewrite .* /index.html break;
}
}
}
复制代码
参考配置:gist.github.com/thoop/81658…linux
nginx -t
service nginx restart
复制代码
在服务器上安装Node环境nginx
下载Prerender服务git
git clone https://github.com/prerender/prerender.git
复制代码
若没有安装git服务,可手动从Github下载再上传到/usr文件夹下,再解压到当前目录下 3. 安装npm依赖github
cd /usr/prerender
# Phantomjs 官方的下载地址会超时,此处从新指定其下载地址为淘宝镜像
export PHANTOMJS_CDNURL=https://npm.taobao.org/mirrors/phantomjs
npm install
复制代码
文件结构以下: chrome
# 启动Server.js, 默认监听3000端口
node server.js
复制代码
此时,若是预先没有安装过Chrome,则会启动失败 提示启动Chrome失败,未检测到Chrome,此时安装Chrome就行了 为何要安装Chrome呢,由于Prerender并不负责真正的网页解析,Prerender只负责解析先后的处理,实际是由Chrome负责网页的解析。npm
cd /ect/yum.repos.d/
touch google-chrome.repo
复制代码
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
复制代码
# 国内推荐
yum -y install google-chrome-stable --nogpgcheck
复制代码
/opt/google/chrome
默认状况下,root用户不能直接运行chrome,因此能够新建另外一个用户如other来运行cd /opt/google/chrome
su other
./chrome
复制代码
su other
cd /usr/prerender
node ./server.js
复制代码
此时应该是能够成功启动的,而且能够看到该服务监听3000端口 启动结果:
if ($prerender = 1) {
# 修改以下:
# set $prerender "service.prerender.io";
set $prerender "127.0.0.1:3000";
rewrite .* /$scheme://$host$request_uri? break;
proxy_pass http://$prerender;
}
复制代码
nohup node ./server.js &
复制代码
其中nohup命令是将该服务加入守护进程,避免ssh对话窗口关闭致使服务关闭,参考Linux设置Jar后台运行
firewall-cmd —zone=public —add-port=3000/tcp —permanent
# 重启防火墙
firewall-cmd —reload
复制代码
Just add this meta tag to the <head> of your pages
<meta name="fragment" content="!">
复制代码
If your URLs look like this:
http://www.example.com/user/1
Then access your URLs like this:
http://www.example.com/user/1?_escaped_fragment_=
复制代码
If your URLs look like this:
http://www.example.com/#!/user/1
Then access your URLs like this:
http://www.example.com/?_escaped_fragment_=/user/1
复制代码
curl http://www.example.com/user/1?_escaped_fragment_=
复制代码
在配置prerender服务前,以上返回的只是index.html的内容, 若是配置成功则会返回解析后的内容。