使用Prerender.io进行网站预渲染

栏目: 服务器 · Nginx · 发布时间: 4年前

内容简介:使用Angular,Vue,React进行单页网站开发,用户浏览时浏览器动态解析JS,呈现出最终的页面,用户体验比较好,网站性能也提高不少。但网络爬虫并不会动态解析Js,访问所有URL得到的只会是项目入口文件中的代码,不能得到具体的内容,也就无法做网站SEO。使用Prerender.io做网站预渲染,可以将网站页面渲染之后再返回给网络爬虫,间接完成网页的解析。 Prerender相较于其他的解决方案,配置相对要简单一些,不用修改项目源码,代码零侵入,是一个不错的解决方案。

使用Angular,Vue,React进行单页网站开发,用户浏览时浏览器动态解析JS,呈现出最终的页面,用户体验比较好,网站性能也提高不少。

但网络爬虫并不会动态解析Js,访问所有URL得到的只会是项目入口文件中的代码,不能得到具体的内容,也就无法做网站SEO。

使用Prerender.io做网站预渲染,可以将网站页面渲染之后再返回给网络爬虫,间接完成网页的解析。 Prerender相较于其他的解决方案,配置相对要简单一些,不用修改项目源码,代码零侵入,是一个不错的解决方案。

目标

搭建基于Centos 7 和 Nginx 环境的Prerender渲染服务,完成Angular项目中网页的预渲染

预渲染流程图

使用Prerender.io进行网站预渲染
运行流程

安装中间件

  1. 首先注册登录 Prerender.io,并且获得个人token
    使用Prerender.io进行网站预渲染
    token
  2. 根据开发文档,配置对应的中间件,如Nginx,Apache等。
  3. 配置Nginx中间件,参考配置如下:
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…

  1. 检测nginx配置,并重启nginx
nginx -t
service nginx restart
复制代码
  1. 中间件安装完成

安装Prerender服务

  1. 在服务器上安装Node环境

  2. 下载Prerender服务

git clone https://github.com/prerender/prerender.git
复制代码

若没有安装git服务,可手动从Github下载再上传到/usr文件夹下,再解压到当前目录下 3. 安装npm依赖

cd /usr/prerender
# Phantomjs 官方的下载地址会超时,此处重新指定其下载地址为淘宝镜像
export PHANTOMJS_CDNURL=https://npm.taobao.org/mirrors/phantomjs
npm install
复制代码

文件结构如下:

使用Prerender.io进行网站预渲染
文件结构
  1. 运行server.js
# 启动Server.js, 默认监听3000端口
node server.js
复制代码

此时,如果预先没有安装过Chrome,则会启动失败 提示启动Chrome失败,未检测到Chrome,此时安装Chrome就好了 为什么要安装Chrome呢,因为Prerender并不负责真正的网页解析,Prerender只负责解析前后的处理,实际是由Chrome负责网页的解析。

安装Chrome

  1. 配置yum源 因为国内无法访问Google,所以需要自己配置yum源,在目录 /etc/yum.repos.d/ 下新建google-chrome.repo文件
cd /ect/yum.repos.d/
touch google-chrome.repo
复制代码
  1. 写入内容 vi 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
复制代码
  1. 安装运行
# 国内推荐
yum -y install google-chrome-stable --nogpgcheck
复制代码
  1. 安装路径 安装成功后,Chrome的安装路径应该是 /opt/google/chrome 默认情况下,root用户不能直接运行chrome,所以可以新建另一个用户如other来运行
cd /opt/google/chrome
su other
./chrome
复制代码
  1. Chrome安装完成

启动Prerender.io服务

  1. 已other用户再次运行server.js
su other
cd /usr/prerender
node ./server.js
复制代码

此时应该是可以成功启动的,并且可以看到该服务监听3000端口 启动结果:

使用Prerender.io进行网站预渲染
启动结果

2. 修改nginx配置

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;
        }
复制代码
  1. 保存重启Nginx
  2. 再次启动Prerender服务
nohup node ./server.js &
复制代码

其中nohup命令是将该服务加入守护进程,避免ssh对话窗口关闭导致服务关闭,参考 Linux 设置Jar后台运行

  1. 如果开启了防火墙,需要将3000端口加入防火墙
firewall-cmd —zone=public —add-port=3000/tcp —permanent
# 重启防火墙
firewall-cmd —reload
复制代码
  1. 至此,Prerender服务已经安装并启动成功
  2. 查看端口
    使用Prerender.io进行网站预渲染
    查看端口
    Node,Google-Chrome,Nginx服务都应在后台运行

测试

If you use html5 push state (recommended):

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 you use the hashbang (#!):

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命令测试

curl http://www.example.com/user/1?_escaped_fragment_=
复制代码

在配置prerender服务前,以上返回的只是index.html的内容, 如果配置成功则会返回解析后的内容。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Redis设计与实现

Redis设计与实现

黄健宏 / 机械工业出版社 / 2014-6 / 79.00

【官方网站】 本书的官方网站 www.RedisBook.com 提供了书本试读、相关源码下载和勘误回报等服务,欢迎读者浏览和使用。 【编辑推荐】 系统而全面地描述了 Redis 内部运行机制 图示丰富,描述清晰,并给出大量参考信息,是NoSQL数据库开发人员案头必备 包括大部分Redis单机特征,以及所有多机特性 【读者评价】 这本书描述的知识点很丰富,......一起来看看 《Redis设计与实现》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具