Roseapple Pi 蓮霧派 效能簡測 (benchmark)

有關之前玩的蓮霧派(Roseapple Pi):

https://www.peterdavehello.org/2016/02/roseapple-pi-rapi-a-clone-of-raspberry-pi/

原先是想做一些仔細的效能測試,無奈最近實在太忙,身不由己,懶得詳測了 … 直接上圖吧,分別是在 Debian 底下用 HardinfosysbenchPHP benchmark Script 以及在 Android 底下用 QuadrantAntutu (安兔兔) 的效能”簡”測結果,比較詳細的測試,以後有緣再說囉。

系統環境的部份都和上一篇的開箱環境基本上都相同,也就是 Debian 8.1 和 Android 5.1.1,相關的映像檔資訊有需要請直接參考上面的連結。

先看在 Debian 8.1 Jessie 底下的測試結果:

Debian, Hardinfo, 直接看圖:

Debian, PHP benchmark Script using php 5.6.17:

Debian, PHP benchmark Script using php 7.0.3 (Using Debian testing repository):

上面兩個結果可以看出 PHP 7.0 的效能進步真的很大!有在寫 PHP 或 Web 相關應用的人可以當作參考。

Debian, sysbench --test=cpu --cpu-max-prime=20000 run (single-thread, 單核心):

閱讀全文

用 apache, nginx, PHP架網站要注意的安全事項

在 Linux 底下,拿 apachenginx + php 是架網站非常常見的組合 (LAMP/LNMP),這篇要筆記一下怎麼藏伺服器相關的版本資訊

對於開發平台來說這些 http header 資訊可以幫忙除錯,但對於開放使用者存取的服務,若非使用上的需求,建議是把相關的http header藏起來,減少資訊洩漏

圖例,用 Chrome 瀏覽器看出 Server版本為 Ubuntu 14.04 + apache2.4 + PHP 5.5.9 :
ubuntu_apache_php_header_in_chrome

本篇拿 Ubuntu/Debian based GNU/Linux 示範,開始動手之前,大家可以先用 curl 這個工具把網站的 header 撈出來,改完之後就可以比較看看結果!

命令如下,127.0.0.1 請換成自己的網址~

結果大概會長這樣:

HTTP/1.1 200 OK
Date: Wed, 30 Dec 2015 08:36:26 GMT
Server: Apache/2.4.7 (Ubuntu)
X-Powered-By: PHP/5.5.9-1ubuntu4.14
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8

有看出端倪了吧?

接下來講動手做,先說 http 伺服器的部分:

– nginx:
在 nginx.conf 的 http 區段(用大括號括起來的部分)裡面找到 server_tokens 這個設定並設為 off,記得拿掉前面的註解,如果找不到這行也可以自己新增:
server_tokens off;

重啟 nginx 後大功告成:

– apache:
以apache 2.4.x為例子,相關設定預設會在 apache 設定檔路徑(/etc/apache2)的 conf-enabled/security.conf 裡面,看設定檔名稱就可以顧名思義知道和安全性有些關係

如果找不到conf-enabled/security.conf 但找的到 conf-available/security.conf,表示設定檔沒被啟用,可以透過這個命令啟用:

這邊我們要改兩個設定,分別是 ServerTokens 和 ServerSignature

ServerTokens 會在每一次伺服器回應請求的時候送出,設定值分別有 Full | OS | Minimal | Minor | Major | Prod 這六個選項
從左至右分別為洩漏最多的資訊量到最少的資訊量,預設通常是 OS、建議改成 Prod,這樣就只不會顯示伺服器名稱以外的任何資訊

ServerSignature 不是在 http header 裡面的資訊,但會出現在一些apache自動產生的頁面,顯示出伺服器版本以及virtual host等資訊
預設值為 On,這邊為 Off,當 Server 產生一些錯誤或是檔案列表頁面時,就不會洩漏太多的伺服器版本資訊

重啟 apache 後大功告成:

改完之後再用curl測試一次結果會發現Server header後面版本、系統等資訊都藏好了:

HTTP/1.1 200 OK
Date: Wed, 30 Dec 2015 08:37:20 GMT
Server: Apache
X-Powered-By: PHP/5.5.9-1ubuntu4.14
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8

但上面的 php 還在,而且還看得出來是ubuntu系統,如果你有啟用一些額外的module 可能都會順便被印出來,所以接下來講 php:

php這邊要改的這個設定叫做 expose_php,這個設定會放在 php.ini 裡面、預設是 On、這邊要調成 Off
expose_php = Off

如果該選項為On,則 http header 裡面會含有一個 X-Powered-By 的資訊,除了讓大家知道你用的是php以外,還有使用到的相關模組,還有可能會因此透漏PHP以及作業系統的版本,因各個unix系統幾乎都有自己維護的套件版本,在編譯時可能會因此把作業系統及其版本資訊包進去(如 5.4.4-14+deb7u9 就透漏了他可能正在使用 Debian Wheezy (7.x)),這個資訊不關的話,Apache2的 ServerTokens 很有可能就白設了XD

改完後這邊要重啟的服務因人而異,如果是 php 搭配 nginx 可能是要重啟 php-fpm 或 php-cgi,如果是把php編成apache的module的話就是重啟apache

重啟後大功告成(自己看要重新啟動哪個服務~因人而異):

HTTP/1.1 200 OK
Date: Wed, 30 Dec 2015 08:39:05 GMT
Server: Apache
Cache-Control: no-cache, must-revalidate, max-age=0
Content-Type: text/html; charset=utf-8

恩,有沒有看到 X-Powered-By 不見了?

補充一點,php.ini 可能因為不同的  php 使用方式 (apache module / cgi / cli 等) 會有 “很多份”,以 php5 為例,如果你是用 apache 的 php module,則設定檔會在 /etc/php5/apache2/,若是使用command line的php,設定檔會在/etc/php5/cli/,不確定的話 … 保險起見,可以將 /etc/php5/ 底下一層各個目錄都翻一下,每份 php.ini 都改一改 (mods-available 是放模組的就不用了)

最後補充,以上方法僅用於 “藏” 資訊,對於找工具針對特定版本伺服器的攻擊也許有點幫助,但並不能真的提升伺服器以及網頁程式本身的安全性,不能就此掉以輕心! 程式面該過濾、跳脫、阻擋的還是要做,永遠不能相信client傳過來的訊息啊~!

另外有一些像是 libapache2-mod-security2 這類的工具可以幫忙防禦一些常見攻擊或是弱點,不過設定不好的情況下也是有很大機率遇到其他狀況,要不要用就見仁見智了,我是遇過用了 mod security 之後預設設定會造成 Discuz 的上傳故障的問題 …

在 IE 瀏覽器傳遞 get 參數中文遇到亂碼

昨天被丟了一個問題:同一隻 PHP 程式在 Chrome/Firefox 丟中文參數沒問題,怎麼在 IE (Microsoft Internet Explorer) 就會亂碼?

code 大概長這樣,主要是把傳入的參數存入 DB 裡面,資料庫用的是 utf-8 的編碼

問題其實是出在 IE 傳遞參數時會以 ANSI 來編碼 (即便網頁編碼是UTF-8),自然會出現亂碼的問題,基於現在 UTF-8 是主流,所以可以在使用傳入的參數之前使用 PHP 內建的 mb_detect_encoding 做這樣的處理:

{ “UTF-8”, “BIG5”, “GB2312” } 這段可以依序換成要被識別的編碼,在編碼可以辨識(有被列入)且不是 UTF-8 的情況下會用 PHP 內建的 iconv 來做轉換的動作, 就可以解決這樣的問題啦~

原來HipHop VM(HHVM)不支援 32-bit 的環境 …

以前的HipHop似乎比較不友善 現在簡單多了!

剛剛在Lubuntu 13.04(raring)上要編譯HHVM

竟然到了最後倒數兩步給我出現…

CMake Error at CMakeLists.txt:26 (message):

32-bit support is currently unsupported, check back with a later version of HipHop.

— Configuring incomplete, errors occurred!

因為沒甚麼特殊用途…

手上拿來灌unix-like os的主機大概都只有2G的RAM

理所當然就是安裝32位元的OS了

看來要先在VirtualBox上面灌一套64bit的來玩玩看了

讓VIM存檔時自動去除行尾的空白

PHP規範之一的PSR-2(前輩翻譯)裡面的2.3有規範了一點:

There MUST NOT be trailing whitespace at the end of non-blank lines.
 
意為非空白行的行尾不可有空白
 
要處理這種瑣碎的細節其實很麻煩,尤其code一多、以前又沒按照規定來走現在卻要修正的時候
 
這邊有前輩截錄了一段程式碼可以用來處理這種問題,也順便處理了自動刪除檔案結尾N行的空白行
 

” Remove trailing whitespace when writing a buffer, but not for diff files.
” From: Vigil
function RemoveTrailingWhitespace()
if &ft; != “diff”
let b:curcol = col(“.”)
let b:curline = line(“.”)
silent! %s/s+$//
silent! %s/(s*n)+%$//
call cursor(b:curline, b:curcol)
endif
endfunction
autocmd BufWritePre * call RemoveTrailingWhitespace()

只要寫入vimrc裡面就可以了!


如果不想要自動刪除檔案結尾N行的空白行,請把上面橘色標記的code註解或是拿掉!