使用Prerender.io進行網站預載入

  • 2019 年 10 月 3 日
  • 筆記

我在自己的項目中是採用的前後端分離的技術,前端用的VUE開發,後端是JAVA開發,tomcat部署,nginx轉發,但是VUE開發的項目缺點就是不利於SEO,所以針對SEO做了預載入的操作。

決定採用Prerender.io進行預載入,好處就是不用區分前端是VUE開發的還是Angular等其它前端技術開發的都能統一做預載入,因為他的原理就是針對Spider爬蟲程式(通過user-agent進行區分,然後用nginx進行轉發),會先用google-chrome載入網站資源,再把載入完成的程式碼返回給爬蟲程式;同時nginx轉發時察覺是非Spdier爬蟲來源時就不用google-chrome進行載入後再返回,而是直接訪問原網站,因為這樣勢必會加大處理時長,影響用戶訪問體驗。

使用Prerender.io主體上我是參考了下面這篇文章進行的,但是在過程中以及一些配置上有改動,且會做一些補充以及我額外遇到的坑的解決方案:
https://blog.csdn.net/zai_xia/article/details/86697300

1、首先註冊登錄 Prerender.io,並且獲得個人token(需*學上網註冊)
2、配置Nginx中間件,下面是我的配置。重點說下這裡遇到的坑,就是下面標紅的那塊程式碼,一定要去掉

# For more information on configuration, see:  #   * Official English Documentation: http://nginx.org/en/docs/  #   * Official Russian Documentation: http://nginx.org/ru/docs/    user nginx;  worker_processes auto;  error_log /var/log/nginx/error.log;  pid /run/nginx.pid;    # Load dynamic modules. See /usr/share/nginx/README.dynamic.  include /usr/share/nginx/modules/*.conf;    events {      worker_connections 1024;  }    http {      log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '                        '$status $body_bytes_sent "$http_referer" '                        '"$http_user_agent" "$http_x_forwarded_for"';        access_log  /var/log/nginx/access.log  main;        sendfile            on;      tcp_nopush          on;      tcp_nodelay         on;      keepalive_timeout   65;      types_hash_max_size 2048;        include             /etc/nginx/mime.types;      default_type        application/octet-stream;        # Load modular configuration files from the /etc/nginx/conf.d directory.      # See http://nginx.org/en/docs/ngx_core_module.html#include      # for more information.      include /etc/nginx/conf.d/*.conf;        server {          listen       80;#默認埠是80,如果埠沒被佔用可以不用修改          server_name  www.*****.com ****.com;          root        /opt/coinUnitWebH5/dist;#vue項目的打包後的dist          index index.html;          location / {              #try_files $uri $uri/ @prerender;#需要指向下面的@否則會出現vue的路由在nginx中刷新出現404              try_files $uri @prerender;  	    index  index.html index.htm;          }          #對應上面的@,主要原因是路由的路徑資源並不是一個真實的路徑,所以無法找到具體的文件          #因此需要rewrite到index.html中,然後交給路由在處理請求資源  	location @prerender {          	proxy_set_header X-Prerender-Token 官網上註冊得到的token;          	set $prerender 0;          	if ($http_user_agent ~* "googlebot|bingbot|yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest/0.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp") {             		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) {              		#setting prerender as a variable forces DNS resolution since nginx caches IPs and doesnt play well with load balancing              		#set $prerender "service.prerender.io";              		set $prerender "127.0.0.1:3000";  			rewrite .* /$scheme://$host$request_uri? break;              		proxy_pass http://$prerender;          	}          	if ($prerender = 0) {              		#rewrite .* /index.html break;  			rewrite ^.*$ /index.html last;          	}      	}      }  }

3、檢查nginx並重啟

nginx -t  service nginx restart

4、下載prerender服務安裝在本地

git clone https://github.com/prerender/prerender.git

若沒有安裝git服務,可手動從Github下載再上傳到/usr文件夾下,再解壓到當前目錄下

5、安裝npm依賴

cd /usr/prerender    # Phantomjs 官方的下載地址會超時,此處重新指定其下載地址為淘寶鏡像  export PHANTOMJS_CDNURL=https://npm.taobao.org/mirrors/phantomjs    npm install

文檔結構如下:

6、運行server.js

# 啟動Server.js, 默認監聽3000埠  node server.js

備註:

可用netstat -lntp命令查看是否有3000埠,想重啟服務需要先用ps -ef | grep node查看pid後kill掉再啟動

啟動時,如果預先沒有安裝過Chrome,則會啟動失敗,提示啟動Chrome失敗,未檢測到Chrome,此時安裝Chrome就好了,為什麼要安裝Chrome呢,因為Prerender並不負責真正的網頁解析,Prerender只負責解析前後的處理,實際是由Chrome負責網頁的解析。

7、安裝Chrome:

  7.1、配置yum源

  因為中國無法訪問Google,所以需要自己配置yum源,在目錄 /etc/yum.repos.d/ 下新建google-chrome.repo文件

cd /ect/yum.repos.d/    touch google-chrome.repo

  7.2、寫入內容

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

  7.3、安裝運行

# 中國推薦  yum -y install google-chrome-stable --nogpgcheck

  7.4、安裝路徑

  安裝成功後,Chrome的安裝路徑應該是
  /opt/google/chrome

  默認情況下,root用戶不能直接運行chrome,所以可以新建另一個用戶如other來運行

cd /opt/google/chrome    su other    ./chrome

  備註:

  這裡我執行./chrome的時候會提示“Gtk-WARNING **: cannot open display”,網上說需要新建的用戶來執行,可是我新建了用戶執行還是不行,於是又寫換到root用戶,執行“xhost +”命令,用處是讓圖形化介面能在所有用戶上都能展示。可是執行“xhost +”是又遇到新問題,提示“  unable to open display “”  ”,簡直了!,然後各種嘗試,用root執行“  執行export DISPLAY=:127.0.0.1.0 ”,不行!於是安裝 vncserver ,如何安裝就不累述了,網上一大堆,需要注意的是,執行vncserver命令的時候,如果遇到執行了,沒有異常問題,但是查看進程就是沒有這個進程的時候,一定要看執行命令是列印的log日誌,我的情況是在log日誌裡面最後面一行有一個Kill,每次啟動後自動kill掉了,於是根據日誌找到啟動腳本文件編輯把最後一行的Kill命令去掉了就行了。

  經過上面的操作後,再執行xhost +成功,然後用新用戶執行./chrome不成功,還是要用root用戶執行才行,就沒有繼續深究

  7.5、以守護進程運行chrome

vim /opt/google/chrome/google-chrome

 

  將最後一行修改為:

exec -a "$0" "$HERE/chrome" "$@" --user-data-dir --no-sandbox

 

8、啟動Prerender.oi服務

  運行

su other

cd /usr/prerender

node ./server.js

  看到以下則啟動成功

  以守護進程啟動:nohup node ./server.js &

9、檢查各種進程是否啟動成功

  用命令“netstat -lntp”查看得到如下:

  都已啟動!

10、用curl測試預載入是否生效

  先用curl http://www.******.com 查看是得到未渲染的源碼

  用本地prerender.io服務代理驗證curl http://localhost:3000/http://www.*******.com 正常得到的應該是渲染之後的程式碼,也就是Google瀏覽器載入後的。

  再驗證nginx攔截轉發是否正常,模擬爬蟲curl –user-agent “baiduspider” http://www.******.com 得到的也是代理後的結果,一切OK!

 

——————2019-08-14補充內容:開啟快取——————-

11、開啟快取

  因為Prerender.io進行預載入是先用chrome進行載入後再返回給用戶,所以時間會很長,爬蟲時間太長也會影響SEO,所以做了快取

  11.1、進入prerender安裝目錄,我的是/usr/prerender,執行以下程式碼:

npm install prerender-memory-cache --save

  11.2、修改server.js,在server.start()之前添加一行:

server.use(require('prerender-memory-cache'));

  11.3、重啟node服務

  kill後重啟

  11.4、檢查快取是否生效

  第一次請求curl –user-agent “baiduspider” http://www.******.com 大概耗時5s才有返回

  第一次請求curl –user-agent “baiduspider” http://www.******.com 耗時不到0.1s

  已生效!

  11.5、設置還款市場與快取項數量

  設置環境變數來控制:

  export CACHE_TTL=600(秒為單位,默認60)

  export CACHE_MAXSIZE=1000(默認100)

  改完之後推出xshell記得先exit,不要直接關閉,因為export是在當前xshell生效的。改完後還要記得重啟node服務