快速衝高 Alexa 排名的方法

很久前 (突然找到我在 2006 的文章) 就說 Alexa 只是個參考用的工具... (參考「Search Results for: alexa」)

如果要看結論的人請直接跳到文章尾部,中間是說明發現的過程。

昨天 (星期五) 的時候跑去找肥睡睡餵食「摩斯吃到飽」,然後 xdite 也一起亂入,剛好聊到兩件事情。

第一件事情是要幫友站 Logdown 測試流量,講了一堆嘴砲方式... (惡搞的方式先拿掉了)

第二件事情是前天 (星期四) 的時候我發現前公司 pixnet.net 的 Alexa 從六月開始排名突然爆增,大約從全球 600 名跳到 120 名,台灣排名的部份居然超越了 YouTube (目前 PIXNET 在第五名,YouTube 在第六名),但到達率、PV、停留時間都沒有大的變化,就問問 xdite 與肥睡睡有沒有什麼想法,是不是最近有上什麼功能是我沒注意到的 XD

不過餵食席間沒有討論出結果來,吃飽後閃人了... (我不確定肥睡睡有沒有吃飽啦,不過我是不怎麼餓...)

回到家後想說來研究 Logdown 使用的服務,asset 什麼的就先不管好了,到是有一段 code 我之前沒遇過:

Update:結果回到家後研究 Logdown 的服務,就看到 xdite 把 Alexa 的 js 丟上去在玩了:(剛好 xdite 也想到就同時在測了...)

<!-- Start Alexa Certify Javascript -->
<script type="text/javascript">
_atrk_opts = { atrk_acct:"KOI0g1aYS500G0", domain:"logdown.com",dynamic: true};
(function() { var as = document.createElement('script'); as.type = 'text/javascript'; as.async = true; as.src = "https://d31qbv1cthcecs.cloudfront.net/atrk.js"; var s = document.getElementsByTagName('script')[0];s.parentNode.insertBefore(as, s); })();
</script>
<noscript><img src="https://d5nxst8fruw4z.cloudfront.net/atrk.gif?account=KOI0g1aYS500G0" style="display:none" height="1" width="1" alt="" /></noscript>
<!-- End Alexa Certify Javascript -->

一開始眼殘沒看到 Alexa Certify Javascript 這段文字,第一個想法是「xdite 你沒事自己寫個 analytics service 幹嘛啊,嫌時間太多嗎」,後來轉念一想「啊啊這會不會是什麼服務?」。

拿 atrk.js 當關鍵字一查就發現是 Alexa 的服務,再回頭來看就發現自己眼殘了... XD

嘲笑自己三秒後就突然想到「咦,餵食時提到的 Alexa 排名會不會跟這個有關?」

接下來就是查證的時間了,這時候 Internet Archive Wayback Machine 拿來考察變得超好用:「http://web.archive.org/web/*/http://www.pixnet.net/」,6/9 的 snapshot 時首頁還沒有 atrk.js,6/20 就有了:

gslin@GSLIN-DESKTOP [~] [12:02/W3] curl -s http://web.archive.org/web/20130609121320/http://www.pixnet.net/ | g atrk.js
gslin@GSLIN-DESKTOP [~] [12:02/W3] curl -s http://web.archive.org/web/20130620181016/http://www.pixnet.net/ | g atrk.js
(function() { var as = document.createElement('script'); as.type = 'text/javascript'; as.async = true; as.src = "https://d31qbv1cthcecs.cloudfront.net/atrk.js"; var s = document.getElementsByTagName('script')[0];s.parentNode.insertBefore(as, s); })();

另外兩個也有類似現象的網站,分別是 mobile01.com

以「http://web.archive.org/web/*/http://www.mobile01.com/」的資料來看,2012/12/27 的 snapshot 還沒加入 atrk.js,2013/1/15 的則加入了:

gslin@GSLIN-DESKTOP [~] [12:06/W3] curl -s http://web.archive.org/web/20121227040802/http://www.mobile01.com/ | g atrk.js
gslin@GSLIN-DESKTOP [~] [12:06/W3] curl -s http://web.archive.org/web/20130115110655/http://www.mobile01.com/ | g atrk.js
<script type="text/javascript" src="/web/20130115110655js_/https://d31qbv1cthcecs.cloudfront.net/atrk.js"></script>

以及 ck101.com

以「http://web.archive.org/web/*/http://ck101.com/」的資料來看,4/24 還沒有 atrk.js,4/30 的加入了:

gslin@GSLIN-DESKTOP [~] [12:07/W3] curl -s http://web.archive.org/web/20130423092213/http://ck101.com/forum.php | g atrk.js
gslin@GSLIN-DESKTOP [~] [12:08/W3] curl -s http://web.archive.org/web/20130504162245/http://www.ck101.com/forum.php | g atrk.js
(function() { var as = document.createElement('script'); as.type = 'text/javascript'; as.async = true; as.src = "/web/20130504162245/https://d31qbv1cthcecs.cloudfront.net/atrk.js"; var s = document.getElementsByTagName('script')[0];s.parentNode.insertBefore(as, s); })();

所以結論就很簡單啦,如果 Alexa 排名對你是很重要的 KPI,Alexa Internet - Get Certified Site Metrics 趕快付錢加入試看看吧!XDDD

可以看到有三個不同的版本,如果要測試的話 USD$9.99/month 的第一個月還免費,可以先測試看看?(不知道是不是要 USD$149/month 的才有效...)

PS:以後看 Alexa 排名還得參考他有沒有掛這東西,好累...

htpasswd 的 SHA 不會帶 salt (seed)...

剛剛發現 htpasswd (Apache.htpasswd 檔案產生程式) 提供的 SHA-1 不會使用 salt,不過 MD5 格式會...

以密碼「test」測試:

gslin@colo-p [~] [17:44/W7] touch test.txt
gslin@colo-p [~] [17:44/W7] htpasswd -b -m test.txt test1 test
Adding password for user test1
gslin@colo-p [~] [17:44/W7] htpasswd -b -m test.txt test2 test
Adding password for user test2
gslin@colo-p [~] [17:44/W7] htpasswd -b -s test.txt test3 test
Adding password for user test3
gslin@colo-p [~] [17:44/W7] htpasswd -b -s test.txt test4 test
Adding password for user test4

結果是:

test1:$apr1$GU6SyO0y$I.Ng9o4H8Tcje.M2A6ECb0
test2:$apr1$uqoX9b/x$7zGMAKqRjvoi6HHSKtaRO.
test3:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=
test4:{SHA}qUqP5cyxm6YcTAhz05Hph5gvu9M=

依照說明,htpasswd 使用的 SHA 是移植自 Netscape server 的 LDAP Directory Interchange Format (ldif):

Use SHA encryption for passwords. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif).

在安全疑慮 (Security Considerations) 上也有註明 htpasswd 使用的 SHA 是不帶 salt:

The SHA encryption format does not use salting: for a given password, there is only one encrypted representation.

現在密碼儲存應該是朝 bcryptPBKDF2 發展,參考依林姊姊的「請愛用 bcrypt 和 PBKDF2」,後者 PBKDF2 被用在 WPA2 上。

Google 發表與 zlib/deflate 相容的壓縮程式,再小 5%...

GoogleApache License, Version 2.0 發表了與 zlib/deflate 相容的壓縮程式:「Compress Data More Densely with Zopfli」。

與 zlib/deflate 相容代表現有的 browser 都不需要變動,而在 project 頁面上是這樣寫:

Zopfli Compression Algorithm is a new zlib (gzip, deflate) compatible compressor. This compressor takes more time (~100x slower), but compresses around 5% better than zlib and better than any other zlib-compatible compressor we have found.

比起現有的 zlib-compatible compressor 大約慢 100 倍 (XDDD),但對於靜態內容的幫助會很大,因為壓一次後就可以用很多次。

Apache 2.4...

如果要知道 Apache 2.4 有哪些與 2.2 不同的地方,看官方提供的「Overview of new features in Apache HTTP Server 2.4」會比起看新聞網站清楚。

對每個 SA 來說,重視的地方都會不太一樣。我認為有幾個比較重要的:

  • Event MPM:如果有 Event MPM,有機會比 Thread-based 的 Worker MPM 更省資源。
  • Asynchronous support:在 Event MPM 下一定要有的改善。
  • Reduced memory usage:要看看比起 2.2 可以省多少。
  • mod_proxy_fcgi:這樣就不需要 mod_fastcgi 了。
  • mod_remoteip:這樣就不用 mod_rpaf2 了。
  • mod_ratelimit:有點虛的功能,不過還是可以加減用用。

會選擇 Apache 其實最重要的原因是 .htaccess,他的效率只要好到使用的資源可以被 PHP 忽略就行了...

同時用 mod_deflate 與 mod_fastcgi 所產生的問題...

今天花了不少時間找到的問題...

問題是使用 mod_fastcgi 以及 mod_deflate 時,Content-Encoding 會是 gzip,但 Content-Length 會是未壓縮的長度。

也就是說,伺服器端在 header 提供的 Content-Length 可能寫 8KB,但實際上只丟出 2KB (壓縮後的大小),於是瀏覽器讀完這 2KB 後會停下來一直等,等到 Keep-Alive timeout 斷線 (在我機器上預設是 5 秒)。

在 timeout 斷線後 browser 會就抓到的資料直接解開執行 (因為這 2KB 都有抓到,於是都正確執行)。如果用瀏覽器這邊的 debugger 觀察,就會發現從 first byte 後 5.00 秒才 document ready。

解法有人在 2008 年給過:「Content-Length header should be set usingap_set_content_length」,不過因為 mod_fastcgi 一直沒出新的正式版,所以大家都還是拿到舊的版本。

所以,與之前修正 multi-threading 的問題一樣,往 ports 本身丟 patch:「Update www/mod_fastcgi to fix mod_deflate issue.」,修正後再測試就正常了。

mod_fcgid 與 PHP

先不論效能之類的問題,mod_fcgidPHP 的設定比 mod_fastcgi 簡單許多。(參考之前寫的「apache22 (worker) + mod_fastcgi + php5-fcgi」這篇文章)

首先是把 module load 進來:

LoadModule fcgid_module libexec/apache22/mod_fcgid.so

再來是把副檔名加上去,以及告知什麼副檔名要用什麼程式包:

AddHandler fcgid-script .php
FcgidWrapper /usr/local/bin/php-cgi .php

就這樣而已... 預設會跑一隻 php-cgi,需要的時候會再多拉幾隻。以他的方式看起來 code segment 不會共用,這種設定方式給小站台用還可以...

接下來看看有沒有辦法在 .htaccess 內直接吃本地的 FastCGI process...

FreeBSD 使用 FastCGI + PHP 5.3 提供的 php-fpm

這篇還是講 mod_fastcgi,而非目前歸到 Apache 下管的 mod_fcgid

PHP 5.3 已經內建 php-fpm,不過 ports 預設是不會裝上去的,所以首先先把 lang/php5 加上 php-fpm 支援。方法是 make config 後選擇 FPM。如果有裝 portconf 的人可以直接在 /usr/local/etc/ports.conf 裡加上:

lang/php5*: WITH_FPM=yes

這樣就會強制蓋過系統設定,強制把 php-fpm 裝進去。

接下來是設定的部份,首先是 php-fpm 的設定,這篇的文章只教預設值,會跑在 127.0.0.1:9000。所以只要在 /etc/rc.conf.local 內設定 php_fpm_enable="YES",然後跑 /usr/local/etc/rc.d/php-fpm start 就把 php-fpm 跑起來了。

然後是 apache 的設定,有好幾條要設:

LoadModule fastcgi_module libexec/apache22/mod_fastcgi.so
FastCgiConfig -maxClassProcesses 1
AddHandler php-fastcgi .php
Action php-fastcgi /php-fpm-handler.fcgi
FastCGIExternalServer /php-fpm-handler -host 127.0.0.1:9000
ScriptAlias /php-fpm-handler.fcgi /php-fpm-handler

我是跑 apache22-worker,上面的設定就可以了...