LAMP Web Server 網頁伺服器快速建置入門

前言 …

LAMP 是透過 Linux + Apache + MySQL + PHP 這種方式來架設網站伺服器組合的簡稱,分別代表著

  1. Linux 作業系統
  2. Apache http 網頁伺服器
  3. MySQL 資料庫
  4. PHP 網頁後端語言

LAMP 是非常廣泛被使用的網站環境建置組合,也有將其中的元件替換為其它相同功能但不同產品的組合,例如把 Linux 改為 FreeBSD 或 Windows 的 FAMP、WAMP,把 Apache 改為 NGINX 的 LNMP 等,本篇是使用 Ubuntu / Debian 作為示範,但基本上基於 Debian 以及 Ubuntu 的 GNU/Linux distributions 操作方式都大同小異,要注意不同版本的使用上多少會略有差異,本篇僅供參考。

根據撰寫本篇紀錄時 W3Techs 的統計,Linux 在 web server 的作業系統市佔率高達 36.2% ( Unix 佔總共的 68%、Linux 佔其中的 53.2% ),其中 Debian / Ubuntu 就分別佔了 Linux 的 32.6% / 31.1%:

w3techs-usage-of-operatingSystems-unix-Mar-1-2016

Apache 在 Web Server 的領域有著 55% 過半的驚人市佔率:

w3techs-usage-of-WebServers-Mar-1-2016

最新、更多資料請參考 W3Techs :

寫這篇的原因,主要是因為推薦不少人來使用 WordPress 撰寫部落格、筆記,WordPress 在此時已經擁有高達 26% 的網頁套裝軟體市佔率,而且持續成長中,平均每四個網站就有一個是使用 WordPress 架設,可想而知 WordPress 不管是在社群、生態系方便都已經相當成熟,考量到自行架設 WordPress 會比直接使用 WordPress.com 現成的服務來的更有彈性、功能更加強大,同時又可以學技術,但對於初學者對於遇到問題的恐懼一直是最大的阻礙,故撰寫這份 LAMP 簡易安裝筆記供入門者參考,對於其他同樣使用 PHP 語言的網站平台基本上都適用。

閱讀全文

Got error from Apache after upgraded Debian to Jessie (8.x)

I upgraded my Debian server to Jessie yesterday, due to I didn’t update all the configs, I found some errors, and got to fix them.

Error message:

Starting web server: apache2 failed!
The apache2 configtest failed. … (warning).
Output of config test was:
AH00526: Syntax error on line 89 of /etc/apache2/apache2.conf:
Invalid command ‘LockFile’, perhaps misspelled or defined by a module not included in the server
configuration
Action ‘configtest’ failed.
The Apache error log may have more information.

Solution:

Edit /etc/apache2/apache2.conf, replace line 89:
LockFile ${APACHE_LOCK_DIR}/accept.lock
with this line:
Mutex file:${APACHE_LOCK_DIR} default

Another error:

Starting web server: apache2 failed!
The apache2 configtest failed. … (warning).
Output of config test was:
AH00526: Syntax error on line 17 of /etc/apache2/sites-enabled/000-default.conf:
Either all Options must start with + or -, or no Option may.

Action ‘configtest’ failed.
The Apache error log may have more information.

So just add symbol + for the options without prefix symbol and it works again.

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

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

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

ubuntu_apache_php_header_in_chrome
圖例,用 Chrome 瀏覽器看出 Server版本為 Ubuntu 14.04 + Apache 2.4.7 + PHP 5.5.9

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

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

$ curl -LI 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 後大功告成:

$ sudo service nginx restart

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

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

$ sudo ln -s /etc/apache2/conf-available/security.conf /etc/apache2/conf-enabled/security.conf

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

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

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

重啟 Apache 後大功告成:

$ sudo service apache2 restart

改完之後再用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

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

$ sudo service apache2/php-fpm/php-cgi restart

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 的上傳故障的問題 …

WordPress 在上傳檔案時遇到的 “HTTP 錯誤”

使用者界面回傳的錯誤寫的就是很單純的

HTTP錯誤。

看看 Apache 的 log:

[Mon Feb 17 22:56:24.891511 2014] [fcgid:warn] [pid 13457] [client 220.134.226.197:65194] mod_fcgid: HTTP request length 139264 (so far) exceeds MaxRequestLen (131072), referer: http://example.com/wp-admin/media-new.php

所以問題很明顯 … request 太大、超過設定的許可範圍了

看了一下 mod_fcgid – Apache HTTP Server,FcgidMaxRequestLen 的預設值在 apache 2.3.6 開始是 131072,單位是 byte,所以等於只能傳 128KB 以內的資料 XD 而之前的版本預設值則是高達 1GB,所以不會遇到這樣的問題

總覺得這前後兩個值都有點極端 … 所以先調整為 10485760 (10MB) 再觀察看看,目前使用正常,沒有需要傳特別大的資料就應該是不會再有什麼問題了