Related Posts Plugin for WordPress, Blogger...

1、前言

LAMP,簡單說就是利用 OpenSource 其低成本、高穩定性的特性來建置或應用於一般中/小企業上,成為目前最火紅的選擇。(請尊重 Weithenn 的辛勞!!)

文章目錄

1、前言
2、實作環境
3、安裝及設定
4、MySQL
          步驟1.安裝 MySQL 套件
          步驟2.修改 rc.conf
          步驟3.啟動 MySQL 服務
          步驟4.設定 MySQL 管理者密碼
          步驟5.測試登入 MySQL
          步驟6.建立其它 MySQL 帳號
          補充1:基本 MySQL 操作指令
5、Apache 1.x
          步驟1.安裝 Apache_modssl 套件
          步驟2.修改 rc.conf
          步驟3.啟動 Apache 服務
          補充1.Apache 設定檔說明 (httpd.conf)
          補充2.備份 Apache Log
          補充3. .htaccess 應用
          補充4.Apache ExtendedStatus 應用
          補充5.Redirect 轉址應用
6、Apache 2.x
          步驟1.安裝 Apache22 套件
          步驟2.修改 rc.conf
          步驟3.啟動 Apache 服務
          補充1.mod_cband 頻寬限制
7、PHP
          步驟1.安裝 PHP 5
          步驟2.安裝 PHP Extension
          步驟3.測試 Apache 能否處理 PHP 檔案
          步驟4.安裝 PHP 加速器 (Zend Optimizer)
8、參考
9、Me FAQ
          Q1.安裝 mysql323-server 套件時出現錯誤訊息?
          Q2.安裝 mod_php5 套件時出現錯誤訊息?
          Q3.安裝完 mod_php5 後無法看到 PHP 的資訊網頁卻直接看到文字?
          Q4.安裝完 mod_php5 後卻無法看到 PHP 的資訊網頁卻變成下載?
          Q5.如何讓瀏覽器不能看到網站目錄結構?
          Q6.Apache 服務無法啟動且出現錯誤訊息?
          Q7.更新 Apache 版本為 1.3.31 之後卻無法啟動服務?
          Q8.無法傳遞參數給 PHP?
          Q9.無法連結 cgi-bin 下的檔案且出現錯誤訊息?
          Q10.如何判斷 PHP 是否支援 GD 功能?
          Q11.無法正確載入 PHP 擴充模組?
          Q12.無法完整顯示 PHP 資訊頁面?
          Q13.無法建立資料庫 Can't create database ?
          Q14.無法啟動 MySQL 服務?
          Q15.php4-extensions 安裝後無法使用?
          Q16.安裝 Zend Optimizer 後 segmentation fault (core dump)?
          Q17.無法啟動 MySQL 服務 InnoDB: Error: pthread_create returned 35?
          Q18.PHP 無法連結 MySQL 並出現錯誤 Call to undefined function: mysql_pconnect()?
          Q19.MySQL 服務無法啟動 Can't open privilege tables: Table 'mysql.host' doesn't exist?
          Q20.無法安裝 php5-snmp extension?

2、實作環境

  • FreeBSD 6.x Release (請尊重 Weithenn 的辛勞!!)
  • FreeBSD 6.0、6.1、6.2 Release
  • mysql-server-4.1.18_2、5.1.18
  • apache+mod_ssl-1.3.34+2.8.25_3
  • mod_php5-5.0.0.a5,1(php4-4.4.2_1)

3、安裝及設定

本篇分為三部份說明即 MySQL (Database)、PHP (Web Language)、Apache (Web Server),有關於 FreeBSD 如何安裝則不在此綴述請參考站內文章 圖解安裝 FreeBSD 5.x

4、MySQL

步驟1.安裝 MySQL 套件

切換至 Ports Tree 路徑安裝 MySQL 套件,並且設定 MySQL 預設編碼採用 UTF-8 並安裝 (支援) 所有編碼格式。

安裝編碼格式參數說明:(請尊重 Weithenn 的辛勞!!)
  • WITH_CHARSET=charset: Define the primary built-in charset (latin1).
  • WITH_XCHARSET=list: Define other built-in charsets (may be 'all').

依如下操作步驟安裝 MySQL 套件,並指定 MySQL 預設的字集為 UTF-8,且支援所有的字集。
#cd /usr/ports/databases/mysql41-server  //路徑
#make WITH_CHARSET=utf8 WITH_XCHARSET=all install clean  //指定 MySQL 預設字集


步驟2.修改 rc.conf

修改 /etc/rc.conf 以便當系統重新開機時能自動載入 MySQL 服務,此次實作中將 MySQL 資料庫存放路徑指定至 /home/db/mysql 下 (我喜歡將資源都收集到 /home 下),因此記得先建立該資料夾並指定擁有者為 mysql 以便後續 mysql 服務能存取該資料夾。(請尊重 Weithenn 的辛勞!!)

建立 MySQL 資料庫存放資料夾
#mkdir /home/db/mysql                   //建立 MySQL 存放資料夾
#chown -R mysql:mysql /home/db/mysql    //指定權限 (以利後續 mysql 服務存取)

修改 /etc/rc.conf 檔案,設定日後開機時自動啟動 MySQL 服務,並且指定資料庫存放路徑 (例如資料庫指定在/home/db則db資料夾必須事先建立)。
#vi /etc/rc.conf               //修改 rc.conf 檔加入如下二行
 mysql_enable="YES"            //啟動 MySQL 服務
 mysql_dbdir="/home/db/mysql"  //指定資料庫存放路徑 


步驟3.啟動 MySQL 服務

鍵入如下指令來啟動 MySQL 服務
#/usr/local/etc/rc.d/mysql-server.sh start   //啟動 MySQL 服務

步驟4.設定 MySQL 管理者密碼

剛安裝好的 MySQL 記得趕快設定管理者密碼,因為預設密碼為 空白 (下列所設定的 MySQL 管理者帳號 root 跟 FreeBSD 的 SuperUser Root 沒關係哦),
#mysqladmin -u root password YOUR_PASSWORD      //初次設定 MySQL 管理者密碼
#mysqladmin -u root -p password NEW_PASSWORD    //日後更改密碼請加上參數 -p


步驟5.測試登入 MySQL

設定好 MySQL 管理者密碼後,請登入 MySQL 確定您所設定的 MySQL 管理帳號密碼可進行存取。
#mysql -u root -p
 Enter password:        //輸入剛才設定的 MySQL 管理者密碼
 Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 1581 to server version: 5.0.27
 Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 mysql>                 //成功登入 MySQL


步驟6.建立其它 MySQL 帳號

下列指令將建立允許 sqluser1 的 MySQL 帳號可對 testdb 資料庫進行任何操作。
  • 主機來源: localhost
  • MySQL 帳號: sqluser1
  • MySQL 密碼: 1234
  • 指定資料庫: testdb
 mysql> grant all privileges on testdb.* to sqluser1@localhost IDENTIFIED BY '1234';
 Query OK, 0 rows affected (0.00 sec)
 mysql> FLUSH PRIVILEGES ;     //重新載入(使變更生效)
 Query OK, 0 rows affected (0.01 sec)


補充1:基本 MySQL 操作指令

以下記錄常用基本 MySQL 指令及語法,詳細內容可參考 MySQL :: MySQL 5.1參考手冊 :: 13. SQL 語句語法
  • 登入 MySQL: mysql -u root -p
  • 顯示所有資料庫: mysql> show databases;
  • 切換資料庫: mysql> use databases_name;
  • 顯示 Tables: mysql> show tables;
  • 查詢指令的 Tables 內容: select * from tables_name;
  • 插入新資料列: mysql> INSERT INTO `Table_Name` ( `欄位1` , `欄位2`) VALUES ( `值1` , `值2` );
  • 更新資料列: mysql> UPDATE `Table_Name` SET `欄位1` = `值1` , `欄位2` = `值2` WHERE where_definition;
  • 更新資料庫: mysql> FLUSH PRIVILEGES;
  • 匯入 Dump Files 至指定的資料庫: mysql -u root -p databases_name < backup1.sql

5、Apache 1.x

步驟1.安裝 Apache_modssl 套件

切換至 Ports Tree 路徑安裝 Apache_modssl 套件 (具有 SSL 模組的 Apache)。
#cd /usr/ports/www/apache13-modssl   //切換至安裝路徑
#make install clean                  //安裝套件並清除暫存檔案


步驟2.修改 rc.conf

修改 /etc/rc.conf 以便系統重新開機時能自動載入 Apache 服務。
#vi /etc/rc.conf            //修改 rc.conf檔內容如下
 apache_enable="YES"        //加入此行


步驟3.啟動 Apache 服務

鍵入如下指令來啟動 Apache 服務。(請尊重 Weithenn 的辛勞!!)
#/usr/local/etc/rc.d/apache.sh start   //啟動 Apache 服務
鍵入如下指令來檢查 Apache 服務是否啟動成功,由於此次實作安裝具有 SSL 模組 (HTTPs) 的 Apache,因此啟動 Apache 服務之後系統應該要開啟相對應的服務埠號 HTTP (Port 80)、HTTPs (Port 443) 才是正確的。
#sockstat |grep http    //聆聽 Port 443 表示 Apache modssl 執行成功
 www     httpd        86990 16 tcp4   61.60.59.58:80      *:*
 www     httpd        86990 17 tcp4   61.60.59.58:443    *:*


補充1.Apache 設定檔說明 (httpd.conf)

簡述 httpd.conf 參數及意義

補充2.備份 Apache Log

當 Apache Log 隨著網站經營時間、網路流量增大...等,Apache Log 日漸肥大若沒規劃好 Log 產生的方式的話,除了在分析/備份 Apache Log 造成麻煩之外更可能因為硬碟空間規劃不當而造成空間爆滿。以下介紹二種方式 (newsyslog.conf、cronolog) 來處理 Apache Log。

方式一、設定 newsyslog.conf

我們可透過修改 newsyslog.conf 來達成定期備份 Apache Log 的目的,但有一點請注意也就是必須加上 (/var/run/httpd.pid) 使 newsyslog 服務在 Rotate Apache Log 之後能傳送 SIGHUP 給 Apache 服務 (Apache 服務重新啟動),否則將因為 Apache 服務未重新啟動而造成相關錯誤發生 (ex. newsyslog66253: logfile turned over),有關於 newsyslog 可參考站內文章 newsyslog.conf
#vi /etc/newsyslog.conf
 /var/log/httpd-access.log   644  7   *   @T00  Z /var/run/httpd.pid
 /var/log/httpd-error.log    644  7   *   @T00  Z /var/run/httpd.pid

方式二、安裝 cronolog 套件

cronolog 套件的功能也是 Rotate Apache Log 且經過 cronolog 處理過的 Apache Log 又容易應用於分析軟體上,而透過修改 Apache 設定檔 (httpd.conf) 我們可每天產生 Apache Log。(請尊重 Weithenn 的辛勞!!)
#cd /usr/ports/sysutils/cronolog      //切換到 cronolog 安裝路徑
#make install clean                   //安裝套件並清除暫存檔案

修改 Apache 設定檔,使用 cronolog 指令並配合參數 (%Y=year, %m=month, %d=day) 來每天產生 Log
#vi /usr/local/etc/apache/httpd.conf
 ErrorLog /var/log/httpd-error.log                                  //預設值
 ErrorLog "|/usr/local/sbin/cronolog /home/log/%Y_%m_%d-error.log"  //修改後
 CustomLog /var/log/httpd-access.log combined                       //預設值
 CustomLog "|/usr/local/sbin/cronolog /home/log/%Y_%m_%d-access.log" combined  //修改後


補充3. .htaccess 應用

當您網站上有某些網頁不想讓人可以隨便瀏覽 (例如:管理介面、程式後台.....),此時可利用 Apache 內的 .htaccess 功能來替網頁進行管制保護,以下實作為利用 .htaccess 來保護指定網頁。

.htaccess 設定注意事項:
必須確定 Apache 設定檔 (httpd.conf) 關於該目錄的 AllowOverride 設定不可為 None 否則 .htaccess 功能無效。 (AuthConfig 及 Limit)
  • AllowOverride 設為 AuthConfig 為使用 帳號/密碼 進行管制保護。
  • AllowOverride 設為 Limit 為使用 管制來源 IP 進行管制保護。
  • AllowOverride 設為 None 則 .htaccess 功能失效。

補充3-1.設定 .htaccess 檔

此次實作為保護在網站根目錄 (/home/weithenn/web) 下 admin 資料夾,管制方式為管制來源 IP (也就是只有允許的來源 IP 才能連結) 及使用者帳號/密碼的驗證。
#cd /home/weithenn/web/admin      //切換到要保護的目錄下
#vi .htaccess                     //建立.htaccess 檔內容如下  
 AuthType Basic
 AuthName "Weithenn Admin Auth"             //驗證視窗說明文字
 AuthUserFile /home/weithenn/web/.htpasswd  //指定密碼檔的存放路徑
 require valid-user
 <Limit GET>
 order deny,allow
 deny from all
 allow from 61.60.59.58           //允許來源 IP 為 61.60.59.58
 allow from 192.168.1.            //允許來源網段 IP 為 192.168.1.x
 allow from .weithenn.lan         //允許來源網域 DNS 尾碼
 </Limit>

補充3-2.建立 .htpasswd 密碼檔

切換到我們剛才指令存放密碼檔的路徑 (/home/weithenn/web) 下之後利用 htpasswd 指令來建立 .htaccess 驗證的使用者帳號及密碼,以下為簡述 htpasswd 指令常用參數,關於 htpasswd 詳細內容可參考 FreeBSD Man Pages - htpasswd
  • -c:新增使用者帳號及密碼 (將建立 .htaccess 密碼檔案,適用於第一次執行此指令)。
  • -m:新增使用者帳號及密碼 (在 .htaccess 密碼檔案已存在的情況下使用)。
  • -b:新增使用者帳號及密碼 (在最後輸入使用者密碼,也就是不會請您輸入二次密碼)。
#cd /home/weithenn/web            //切換到密碼檔存放路徑
#htpasswd -c .htpasswd weithenn   //建立帳號為 admin
 New password: 請輸入密碼
 Re-type new password: 再輸入一次確認

所以上述二個步驟設定完成之後,若要連結管理保護網頁 (此例為 http://www.weithenn.org/admin) 除了要從允許的來源 IP (此例為 61.60.59.58) 之外還須正確輸入使用者帳號及密碼 (此例為 weithenn / 123456) 才可成功連結至此網頁。

補充4.Apache ExtendedStatus 應用

Apache 內建 server-status 及 server-info 二種可即時觀看 Apache 伺服器 狀態模組 的方法,在 Apache 設定檔預設是將這些選項註解掉的,要使用這二個功能的方法很簡單只要在 Apache 設定檔將註解符號 (#) 拿掉即可,另外請記得設定只允許內部的網段可以查看此資訊 (避免安全性問題)。(請尊重 Weithenn 的辛勞!!)
#vi /usr/local/etc/apache/httpd.conf
 ExtendedStatus On               //預設值為註解,請將註解符號 (#) 拿掉
###server-status 伺服器狀態資訊
 <Location /server-status>
     SetHandler server-status
     Order deny,allow
     Deny from all
     Allow from 192.168.1.       //僅允許網段 192.168.1.x 能觀看
 </Location>
###server-info 伺服器組態資訊
 <Location /server-info>
    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from 192.168.1.        //僅允許網段 192.168.1.x 能觀看
 </Location>

設定完成後便可在您主機後面加上連結名稱 (ex. http://www.weithenn.org/server-status) 即可即時查看 Apache 狀態:
  • server-status:查看 Apache 執行狀態
  • server-status?notable:用來支援無法顯示 Table 的瀏覽器
  • server-status?refresh:每秒更新畫面一次
  • server-status?refresh=n:每 n 秒更新畫面一次
  • server-status?auto:顯示 Apache 的狀態資料
  • server-info:查看 Apache 模組資訊

補充5.Redirect 轉址應用

當網站更改網址時,例如本站由 weithenn.idv.tw 更改為 weithenn.org 時如何進行轉址設定讓原來連結至 weithenn.idv.tw 的網友們能自動連結至新網址 weithenn.org ? 此時就可使用 Redirect 轉址功能來處理,在設定前請先確定您在 Apache 設定檔 httpd.conf 中有載入 mod_rewrite.so。
將下列設定值貼至原來 weithenn.idv.tw 虛擬主機 (Virtual Host) 設定內,如下設定為所有連結至 www.weithenn.idv.tw 的需求都會 Redirect 轉址至新網址 www.weithenn.org 其中 301 代表永久轉址 (Permanently Moved),這是對網站 SEO 最安全的轉址方式。
<VirtualHost 61.60.59.58:80>
    ServerAdmin weithenn@gmail.com
    DocumentRoot "/home/user/weithenn/web"
    ServerName www.weithenn.idv.tw
    RewriteEngine on
    RewriteRule ^(.*) http://www.weithenn.org$1 R=301,L
    ErrorLog "/dev/null"
    CustomLog "/dev/null" combined
</VirtualHost>


6、Apache 2.x

步驟1.安裝 Apache22 套件

切換至 Ports Tree 路徑安裝 Apache22 套件。(請尊重 Weithenn 的辛勞!!)
#cd /usr/ports/www/apache22     //切換至安裝路徑
#make install clean             //安裝套件並清除暫存檔案


步驟2.修改 rc.conf

修改 /etc/rc.conf 以便系統重新開機時能自動載入 Apache 服務。
#vi /etc/rc.conf             //修改 rc.conf檔內容如下
 apache22_enable="YES"       //加入此行


步驟3.啟動 Apache 服務

鍵入如下指令來啟動 Apache 服務。
#/usr/local/etc/rc.d/apache22 start //啟動 Apache 服務
鍵入 sockstat 指令來檢查 Apache 服務是否啟動成功,因此啟動 Apache 服務之後系統應該要開啟相對應的服務埠號 HTTP (Port 80) 才是正確的,預設未啟動 SSL 也就是 HTTPs (Port 443) 有關於 SSL 的部份則不在此篇討論。(請尊重 Weithenn 的辛勞!!)
#sockstat |grep http     //聆聽 Port 80 表示 Apache22 執行成功
 www     httpd        86990 16 tcp4   61.60.59.58:80      *:*


補充1.mod_cband 頻寬限制

當 Apache 負責許多 Virtual Host 時如何針對每個網站去作最大頻寬流量、每月下載流量、連線數量...限制? mod_cband 可清鬆達成此項任務,本次安裝版本為 mod_cband-0.9.7.5_2

有關於連線速率 (bps / Bps) 的觀念簡述如下:
Bps (Bytes per secend / 每秒傳送 Byte 數) 也就是 1Bps = 8bps
  • 一般 Client 端軟體皆使用此單位 (例如下載檔案 IE、FileZilla...等)

bps (bit per secend / 每秒傳送 bit 數) 也就是 8bps = 1Bps
  • 一般上網頻寬速率使用此單位 (例如 ADSL 12M/1M 單位即為 bps)

所以若是 ADSL 速度 12M / 1M 線路則 理論 上頻寬為 (實際值約為理論值的 60 ~ 75% 左右)
12M / 1M bps = 12288kbps / 1024kbps = 1536KBps / 128KBps,了解後我們開始安裝 mod_cband。
#cd /usr/ports/www/mod_cband   //切換到安裝路徑
#make install clean            //安裝套件並清除暫存檔案

安裝完成後確定系統是否有 mod_cband.so 模組檔案。
#ll /usr/local/libexec/apache22/mod_cband.so
 -rwxr-xr-x  1 root  wheel  75126  8 31 14:53 /usr/local/libexec/apache22/mod_cband.so

查看及修改 Apache 設定檔 httpd.conf 中是否有載入 mod_cband.so 模組。
#vi /usr/local/etc/apache22/httpd.conf
 ...略...
 LoadModule cband_module   libexec/apache22/mod_cband.so  //確定載入cband模組
 ...略...
# Virtual hosts
 Include etc/apache22/extra/httpd-vhosts.conf  //載入 Virtual Host 設定檔
# Cband
 Include etc/apache22/extra/httpd-cband.conf   //新增此行,屆時用來觀看 CBand 狀態
 ...略...

Virtual Host 設定如下,當然 CBand 的功能不只如此,要了解更詳細的限制內容請參考 mod_cband Document,下列設定中:
  • CBandSpeed 1024 50 50: 表示網站總流量 1024 kbps (1Mbps = 128KBps),每秒允許最多 50 連線要求,每個要求最多 50 連線數量。
  • CBandRemoteSpeed 20 3 3: 表示每個要求 20 kbps (= 2.5KBps),每秒允許最多 3 連線要求,每個要求最多 3 連線數量。
#vi /usr/local/etc/apache22/extra/httpd-vhosts.conf
 NameVirtualHost 61.60.59.58:80
 <VirtualHost 61.60.59.58:80>
    ServerAdmin service@weithenn.org
    DocumentRoot "/home/web/test"
    ServerName www.weithenn.org
    CBandSpeed 1024 50 50
    CBandRemoteSpeed 20 3 3

    ErrorLog "|/usr/local/sbin/cronolog /home/log/test/%Y_%m_%d-error.log"
    CustomLog "|/usr/local/sbin/cronolog /home/log/test/%Y_%m_%d-access.log" combined
 </VirtualHost>

查看 CBand 運作狀態及每個 Virtual Host 的流量狀態設定如下,設定完成後您可鍵入例如 http://www.weithenn.org/cband-status 的 URL 來即時查看 CBand 運作狀態 mod_cband Screenshots。
#cd /usr/local/etc/apache22/extra
#cp httpd-info.conf httpd-cband.conf  //複製查看 Apache Status 設定檔來進行修改
#vi httpd-cband.conf                  //修改 CBand 設定檔內容如下
 <Location /cband-status>
    SetHandler cband-status
    Order deny,allow
    Deny from all
    Allow from 61.60.59.0/24          //僅允許此網段能查看 CBand 狀態
 </Location>

設定完成後重新啟動 Apache 服務即可。
#/usr/local/etc/rc.d/apache22 restart
 Performing sanity check on apache22 configuration:
 Syntax OK
 Stopping apache22.
 Starting apache22.


7、PHP

步驟1.安裝 PHP 5

切換至 Ports Tree 路徑安裝 PHP 5 套件。 (請尊重 Weithenn 的辛勞!!)
#cd /usr/ports/lang/php5     //切換到安裝路徑
#make install clean          //安裝套件並清除暫存檔案

安裝 PHP 5 完成後相關檔案及指令如下:
  • PHP 設定檔:/usr/local/etc/php.ini-dist (舊版為 php.ini) 及 php.conf
  • 如何查看系統所安裝的 PHP 擴充模組 (PHP-Extension)
#php -m            //查看 PHP 擴充模組
 PHP Modules
 standard          //目前未安裝任何 PHP 擴充模組
 Zend Modules


步驟2.安裝 PHP Extension

由於 PHP 已經純化 (請參考 /usr/ports/UPDATING 20040719),所以 PHP 擴充模組必須另外安裝
#cd /usr/ports/lang/php5-extensions   //切換到安裝路徑
#make install clean                   //安裝擴充模組

安裝 PHP 擴充模組 (PHP-Extension) 完成後相關檔案及指令如下:
  • 擴充模組設定檔: /usr/local/etc/php/extension.ini (ex. 安裝 Zend Optimizer 為修改此設定檔而不是 php.ini-dist)
  • 擴充模組存放資料夾: /usr/local/lib/php/20020429-debug
  • 查看剛才安裝的 PHP 擴充模組 (PHP-Extension)

#php -m       //查看 PHP 擴充模組
 PHP Modules
 ctype        //以下列出所安裝的 PHP 擴充模組
 gd
 gettext
 imap
 mysql
 overload
 pcre
 posix
 session
 standard
 tokenizer
 xml
 zlib
 Zend Modules


步驟3.測試 Apache 能否處理 PHP 檔案

安裝完 PHP 擴充模組 (PHP-Extension) 之後,請測試您的 Apache 是否已經能處理 PHP 檔案了,請建立一個 PHP 檔案 (ex. test.php),然後將 test.php 放到您 Apache 所指定的 DocumentRoot 目錄 (預設目錄 /usr/local/www/data),若瀏覽器能 PHP 資訊頁面,即表示您的 Apache 已能正確處理 PHP 檔案了。(請尊重 Weithenn 的辛勞!!)
#vi /usr/local/www/data/test.php   //建立 test.php 檔案,內容如下
 <?
 phpinfo();
 ?>


步驟4.安裝 PHP 加速器 (Zend Optimizer)

Zend Optimizer 為利用最佳化 PHP 程式碼的方式來提高 PHP 應用程式的執行速度。一般情況下,透過 Zend Optimizer 執行的 PHP 程式比不使用時效率要快上 40% 到 100%。因此可以瞭解 Zend Optimizer 可以有效降低伺服器的 CPU Loading。
#cd /usr/ports/devel/ZendOptimizer  //切換至安裝路徑
#make install                       //安裝 Zend Optimizer
 ===>  ZendOptimizer-2.5.7 :
 Because of licensing restrictions, you must fetch the source distribution
 manually.
 Please access http://www.zend.com/store/free_download.php?pid=13
 with a web browser, read the license and click the "I ACCEPT" button.
 Download the source file, ZendOptimizer-2.5.7-freebsd5.1-i386.tar.gz,
 and place it in /usr/ports/distfiles.

由上述訊息可知,系統顯示必須下載 ZendOptimizer-2.5.7-freebsd5.1-i386.tar.gz 並放置於 /usr/ports/distfiles 之後鍵入 make install 指令來開始安裝 ZendOptimizer 安裝完成後出現如下訊息
 [Zend]
 zend_optimizer.optimization_level=15
 zend_extension_manager.optimizer="/usr/local/lib/php/20041030/Optimizer"
 zend_extension_manager.optimizer_ts="/usr/local/lib/php/20041030/Optimizer_TS"
 zend_extension="/usr/local/lib/php/20041030/ZendExtensionManager.so"
 zend_extension_ts="/usr/local/lib/php/20041030/ZendExtensionManager_TS.so"

請將上面這幾行 Zend 設定資訊貼到 PHP 擴充模組設定檔 (/usr/local/etc/php/extension.ini) 中,修改完成後請鍵入檢查 PHP 擴充模組指令 (php -m) 應該可看到 ZendOptimizer 擴充模組載入。
#php -m         //查看 PHP 擴充模組
 PHP Modules
 ctype
 dom
 iconv
 libxml
 pcre
 posix
 session
 SimpleXML
 SPL
 SQLite
 standard
 tokenizer
 xml
 Zend Optimizer //Zend Optimizer 載入成功
 Zend Modules
 Zend Extension Manager
 Zend Optimizer


8、參考


9、Me FAQ

Q1.安裝 mysql323-server 套件時出現錯誤訊息?

Error Message:
安裝 mysql323-server 套件中途時停止安裝出現如下錯誤訊息
Sorry, the host 'dmz' could not be looked up. Please configure the 'hostname' command to return a correct hostname.
If you want to solve this at a later stage, restart this script with the --force option
*** Error code 1
Stop in /usr/ports/databases/mysql323-server.

Ans:
此台機器主機名稱為 dmz 至 /etc/hosts 加上這台主機的 IP 及 hostname 後再次執行安裝便順利完成。

Q2.安裝 mod_php5 套件時出現錯誤訊息?

Error Message:
安裝 mod_php5 套件中途時停止安裝出現如下錯誤訊息
==> Installing for gettext-0.13.1
==> Generating temporary packing list
==> Checking if devel/gettext already installed
==> An older version of devel/gettext is already installed (gettext-0.12.1)
You may wish to ``make deinstall'' and install this port again by ``make reinstall'' to upgrade it properly.
If you really wish to overwrite the old port of devel/gettext without deleting it first, set the variable "FORCE_PKG_REGISTER"
in your environment or the "make install" command line.
*** Error code 1
Stop in /usr/ports/devel/gettext.
*** Error code 1
Stop in /usr/ports/devel/bison.
*** Error code 1
Stop in /usr/ports/www/mod_php5.
*** Error code 1

Ans:
由上述訊息可知目前系統中 gettext 套件版本太舊,系統尋問您是否要要強制安裝新版 gettext 套件? 此次解決方式為更新 gettext 套件後即可順利安裝 mod_php5 套件了。

Q3.安裝完 mod_php5 後無法看到 PHP 的資訊網頁卻直接看到文字?

Error Message:
連結 PHP 測試網頁直接看到英文字而不是看到 PHP 資訊網頁。

Ans:
請確定在安裝 PHP 時是否有勾選下列項目 (沒有的話就 make config 之後再安裝吧)
[X] APACHE     Build Apache module
檢查 httpd.conf 內是否有載入 PHP module (有勾選 Build Apache module 才會有)
LoadModule php5_module        libexec/apache22/libphp5.so
檢查 httpd.conf 內是否有如下二行內容 (沒有就加上吧)
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

檢查 httpd.conf 內是否有 index.php 沒有就加上吧 (今天安裝的 apache-2.2.4_2 要自已加上 index.php)
 <IfModule dir_module>
    DirectoryIndex index.html index.php
 </IfModule>


Q4.安裝完 mod_php5 後卻無法看到 PHP 的資訊網頁卻變成下載?

Error Message:
連結 PHP 測試網頁直接變成下載 test.php 檔案而不是看到 PHP 資訊網頁。
Ans:
確定在安裝 PHP 時是否有勾選下列項目 (沒有的話就 make config 後再安裝吧)
[X] APACHE     Build Apache module
檢查 httpd.conf 內是否有載入 PHP module (有勾選 Build Apache module 才會有)
LoadModule php5_module        libexec/apache22/libphp5.so
檢查 httpd.conf 內是否有如下二行 (沒有就加上吧)
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps

檢查 httpd.conf 內是否有 index.php 沒有就加上吧 (今天安裝的 apache-2.2.4_2 要自已加上 index.php)
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>


Q5.如何讓瀏覽器不能看到網站目錄結構?

Error Message:
下圖所顯示為網站內網頁的存放目錄及子目錄 (網站目錄結構),因為 Apache 預設開放 Indexes 的功能也就表示當瀏覽器找不到 Apache 目錄中預設的首頁時,Apache 將會自產生索引並列出目錄中的檔案,這雖然是 Apache 人性化的地方對於測試用網路可能很方便,但在商業經營的網站上您應該不希望網站目錄結構被人看光光吧?

Ans:
修改 Apache 設定檔 (httpd.conf) 將參數 Indexes 刪除後記得重新啟動 Apache 服務即可。
Options Indexes FollowSymLinks MultiViews  //預設值,把 Indexes 參數刪除即可
Options FollowSymLinks MultiViews           //修改後


Q6.Apache 服務無法啟動且出現錯誤訊息?

Error Message:
鍵入指令啟動 Apache 服務之後出現如下錯誤訊息
httpd could not be started
查看 Log 內出現訊息為
mod_unique_id: unable to gethostbyname

Ans:
請在 /etc/hosts 下加入您的主機 IP 及 localhost、localhost.mydomain,例如如下內容
#vi /etc/hosts
 61.60.59.58  www  www.weithenn.org  //加入此行


Q7.更新 Apache 版本為 1.3.31 之後卻無法啟動服務?

Error Message:
最近將 Apache 的版本更新到 1.3.31 之後卻無法啟動 Apache 服務

Ans:
從 Apache 1.3.31 之後版本開始,Apache 的啟動方式有些許更動詳細內容可參考 (/usr/local/etc/rc.d/apache.sh),請在 /etc/rc.conf 加入如下三行即可順利啟動 Apache 服務。
#vi /etc/rc.conf
 apache_enable="YES"
 apache_flags=""
 apache_pidfile="/var/run/httpd.pid"


Q8.無法傳遞參數給 PHP?

Error Message:
輸入參數 100 給 abc (例如http://test.com?abc=100) 但 PHP 卻抓不到 abc 的值?

Ans:
因為 PHP4.x 版傳遞參數選項預設是關的 (此例為 mod_php4-4.3.5_7,1 ) 修改 /usr/local/etc/php.ini 後再重新啟動 Apache 服務即可。
register_globals = Off--> On

Q9.無法連結 cgi-bin 下的檔案且出現錯誤訊息?

Error Message:
libintl.so 函式是安裝 /usr/port/devel/gettext/ 程式後取得理論上來說若目前版本的相關函數是 libintl.so.5 為何還要去讀取舊的 libintl.so.4 版本? 因為當您安裝 gmake 時 gmake 會去連結安裝 gmake 而當時的 libinl.so 的版本是 version 4,也就是 libintl.so.4 當你更新過相關的 Ports (devel/gettext) 則系統會用 libintl.so.5 取代 libintl.so.4 除非能取得先前系統保留舊有的 libintl.so.4 否則就會出現安裝 (執行) 失敗的狀況.
usr/libexec/ld-elf.so.1: Shared object "libc.so.4" not found
Ans:
解決方式二有種 (請自行擇一即可)
方式一、把目前版本 ln 到舊版本讓系統能找到新的函數版本
#cd /lib
#ln -s libutil.so.5 libutil.so.4

方式二、更新系統相關函數版本 (把使用舊版本的套件全部更新為新版本) 可以透過 Portupgrade 重新建立所有與 gettext 相關的 Ports 程式
#portupgrade -fr gettext

Q10.如何判斷 PHP 是否支援 GD 功能?

Error Message:
該如何判斷 PHP 是否已經支援 GD 功能?

Ans:
您可透過查看 PHP 資訊頁看 GD 是否載入,或將下列程式碼新增至一個 PHP 檔案內容如下
<?php
    header ("Content-type: image/png");
    $newImg = ImageCreate(250,250);
    $skyblue = ImageColorAllocate($newImg,136,193,255);
    ImageFill($newImg,0,0,$skyblue);
    ImagePNG($newImg);
    ImageDestroy($newImg);
?>

若 GD Libary 成功運作則會顯示一張 250 * 250 的天空藍圖片,若 GD Libary 未載入 (或失敗) 則出現無法顯示錯誤的圖片的訊息

Q11.無法正確載入 PHP 擴充模組?

Error Message:
安裝 PHP 擴充模組完成,但無法使用 PHP 擴充模組? 將載入 PHP 擴充模組語法 (extension=*.so) 貼入 php.ini 中且重新啟動 Apache 服務之後 httpd-error.log 出現類似如下的警告訊息
PHP Warning:  xml:  Unable to register functions, unable to load in Unknown on line 0
PHP Warning:  zlib:  Unable to register functions, unable to load in Unknown on line 0
...略...

Ans:
因為 PHP 已經純化,且 PHP 擴充模組載入清單已更改為寫入至 (/usr/local/etc/php/extension.ini) 檔案中,只需確定在 php.ini-dist (extension_dir =) 中是否正確指定您放置 PHP 擴充模組檔案路徑即可。

Q12.無法完整顯示 PHP 資訊頁面?

Error Message:
phpinfo() show到HTTP Headers Information就停住了show不出extension的東西? 當嘗試讀取 PHP 資訊頁面 (phpinfo) 時網頁顯示到 HTTP Headers Information 項目就卡住了,也就是無法繼續顯示 PHP 擴充模組項目 (但測試 GD 功能卻是正常的代表有載入成功?)

Ans:
請鍵入 php -i 指令 (等於是文字方式呈現的 PHP 資訊頁面 phpinfo),出現如下錯誤訊息,將 Imagemagick 套件先移除掉在重新安裝之後就可順利讀取 PHP 資訊頁面 (phpinfo)。
#php -i
 /libexec/ld-elf.so.1: /usr/local/lib/libMagick.so.6: Undefined symbol "pthread_equal"
#pkg_delete pecl-imagick-0.9.11


Q13.無法建立資料庫 Can't create database ?

Error Message:
當嘗試要建立資料庫時出現如下錯誤訊息
 MySQL 傳回:
#1006 - Can't create database 'shopper'. (errno: 28)

Ans:
此次狀況為 MySQL 放置在預設的 /var/lib 下,而 /var 因為空間規劃不當 (被 Log 佔滿空間),將肥大的 Log 清除後就可正常建立資料庫了。

Q14.無法啟動 MySQL 服務?

Error Message:
啟動 MySQL 服務後卻無法進入並出現如下錯誤訊息
ERROR 2002: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
Ans:
請在 /etc/rc.conf 加上如下內容,然後執行 /usr/local/etc/rc.d/mysql-server.sh start 來啟動 MySQL 即成功 (若不知道要加什麼參數到 /etc/rc.conf內,請執行 /usr/local/etc/rc.d/mysql-server.sh rcvar 即可,或可參考 /etc/default/rc.conf)
#vi /etc/rc.conf
 mysql_enable="YES"                //加入此行


Q15.php4-extensions 安裝後無法使用?

Error Message:
安裝 PHP4 擴充模組之後,雖然打 php -m 指令有顯示出擴充模組安裝,但用 phpinfo 卻看不到擴充模組,也無法使用擴充模組功能?

Ans:
請修改 php.ini (若是新版本請修改 php.ini-dist),修改完成後請重新啟動 Apache 服務即可。
#vi /usr/local/etc/php.ini
 extension_dir = "/usr/local/lib/php/20020429/"  //指定放置 extension 路徑


Q16.安裝 Zend Optimizer 後 segmentation fault (core dump)?

Error Message:
安裝 Zend Optimizer 後欲查看 PHP 擴充模組狀況系統卻回應如下錯誤訊息 (php -v 或 php -m 都一樣)
segmentation fault (core dump)
且查看 /var/log/messages 則出現如下錯誤訊息
kernel: pid 11954 (php), uid 0: exited on signal 11 (core dumped)
Ans:
此次原因為 PHP 擴充模組中的 imagick.so 所造成,將該項目註解掉之後便不在出現 Core Dump 的狀況。

Q17.無法啟動 MySQL 服務 InnoDB: Error: pthread_create returned 35?

Error Message:
無法啟動 MySQL 服務,檢查 mysql.err 後發現錯誤訊息如下
050722 12:23:59  mysqld started
InnoDB: Error: pthread_create returned 35
050722 12:23:59  mysqld ended

Ans:
此問題為 Kernel 內的參數而導致的,從上列 Mail List 討論中可知,將 Kernel 內的參數調整一下完成後重新編譯核心再重開機就可順利啟動 MySQL 服務了。
options  MAXDSIZ="(2048*1024*1024)"   //原 Kernel 參數
options  MAXDSIZ="(2047*1024*1024)"   //調整為此數值 (2048 >> 2047)


Q18.PHP 無法連結 MySQL 並出現錯誤 Call to undefined function: mysql_pconnect()?

Error Message:
安裝 MySQL 相關的 PHP 擴充模組但仍無法連結至 MySQL? 只要嘗試連結 MySQL 時便出現類似如下的錯誤訊息
Fatal error: Call to undefined function: mysql_pconnect() in /home/web/weithenn/class.Configuration.php on line 49
Ans:
原因為沒有安裝 php4-mysql 套件,所以雖然在 PHP 擴充模組中有勾選 MySQL 選項但仍無法跟 MySQL 溝通,安裝 /usr/ports/databases/php4-mysql 之後 PHP 便可順利與 MySQL 溝通了。
#php -m
 PHP Modules
 ctype
 mysql   //安裝 php4-mysql 後在安裝 PHP 擴充模組 MySQL 選項後才會出現此行
 overload
 pcre
 posix
 session
 standard
 tokenizer
 xml
 zlib
 Zend Modules


Q19.MySQL 服務無法啟動 Can't open privilege tables: Table 'mysql.host' doesn't exist?

Error Message:
當嘗試啟動 MySQL 服務時發現 mysqld 起不來,看了一下 MySQL 的 Log 後發現如下錯誤訊息
Fatal error: Can't open privilege tables: Table 'mysql.host' doesn't exist
Ans:
原因在於您目前的 MySQL 缺少 host 相關檔案 (host.frm、host.MYD、host.MYI),請重新安裝 MySQL Server 或者試試從其它機器的 mysql 目錄下複製下列三個檔案到您的 mysql 目錄內即可。
host.frm
host.MYD
host.MYI


Q20.無法安裝 php5-snmp extension?

Error Message:
安裝 php5-snmp extension 時無法安裝並出現如下錯誤訊息
===>  Script "configure" failed unexpectedly.
Please report the problem to ale@FreeBSD.org maintainer and attach the
"/usr/ports/net-mgmt/php5-snmp/work/php-5.2.12/ext/snmp/config.log" including
the output of the failure of your make command. Also, it might be a good idea
to provide an overview of all packages installed on your system (e.g. an `ls
/var/db/pkg`).
*** Error code 1
Stop in /usr/ports/net-mgmt/php5-snmp.
*** Error code 1
Stop in /usr/ports/lang/php5-extensions.
*** Error code 1
Stop in /usr/ports/lang/php5-extensions.

Ans:
找了一下 FreeBSD Query PR Database 後發現有人已反應此一問題 ports/144137: net-mgmt/php5-snmp make install fail 但看來維護者還沒時間修,只好自已先硬衝了,簡述方法如下
#cd /usr/ports/net-mgmt/php5-snmp  //切換到安裝路徑
#pkg_add -r php5-snmp
 Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.0-release/Latest/php5-snmp.tbz... Done.
 Fetching ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.0-release/All/perl-5.8.9_3.tbz... Done.
 pkg_add: package 'perl-5.8.9_3' conflicts with perl-threaded-5.10.1   //與此套件衝突
 pkg_add: please use pkg_delete first to remove conflicting package(s) or -f to force installation
 pkg_add: pkg_add of dependency 'perl-5.8.9_3' failed!
#pkg_delete -f perl-threaded-5.10.1  //移除此套件
#pkg_add -r php5-snmp                //移除衝突套件後即可順利安裝


安裝完成後發現 Perl 版本為 5.8.9 (perl -v),目前 php5-snmp extension 已安裝完成。
#php -m | grep snmp
 snmp
#grep 'snmp' /usr/local/etc/php/extensions.ini
 extension=snmp.so
文章標籤: