使用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的內容, 若是配置成功則會返回解析後的內容。