Sunday, June 3, 2007

FreeBSD 6.2 WebServer(Apache2 + PHP5 + Mysql)

【作業環境】
FreeBSD 6.0、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)
【安裝及設定】
MySQL
Step1.安裝MYSQL
切換到安裝路徑,若需要另外指定資料庫欲安裝的資料夾位置(預設的資料庫路徑在 /var/db/mysql)-->安裝套件 -->啟動mysql
#cd /usr/ports/databases/mysql41-server //路徑
#make WITH_CHARSET=utf8 WITH_XCHARSET=all install clean //指定 MySQL 預設的字集為 UTF-8,並另外支援所有的字集
參數說明:
WITH_CHARSET=charset Define the primary built-in charset (latin1).
WITH_XCHARSET=list Define other built-in charsets (may be 'all').
Step2.修改rc.conf
修改 rc.conf 使系統於重開機時能自動載入 MySQL 服務
#vi /etc/rc.conf //修改rc.conf檔加入如下二行
mysql_enable="YES"
mysql_dbdir="/home/db/mysql" //指定資料庫路徑(例如資料庫指定在/home/db則db資料夾必須事先建立)
Step3.啟動 MySQL
#/usr/local/etc/rc.d/mysql-server.sh start //啟動mysql
Step4.設定 MySQL 管理者密碼
剛安裝完 MySQL 後記得趕快設定管理者密碼(這裡的 root 跟 FreeBSD 的 SuperUser Root 沒關系哦)
#mysqladmin -u root password YOUR_PASSWORD //設定新密碼
#mysqladmin -u root -p password NEW_PASSWORD //日後若要更改密碼(會請你先輸入舊密碼)
Step5.測試登入 MySQL
設定好 MySQL 管理者密碼後試著登入看看吧:p
#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
Step6.建立其它 MySQL 帳號
表示主機來源是 localhost 以 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)
Apache
Step1.安裝Apache_modssl
切換到安裝路徑-->安裝套件-->啟動apache
#cd /usr/ports/www/apache13-modssl //路徑
#make install clean //安裝套件並清除不必要檔案
Step2.修改rc.conf
修改 rc.conf 使系統於重開機時能自動載入 Apache 服務
#vi /etc/rc.conf //修改rc.conf檔加入
apache_enable="YES"
Step3.啟動 Apache
#/usr/local/etc/rc.d/apache.sh start //啟動 apache
補充
/usr/local/etc/apache/httpd.conf //httpd.conf設定檔路徑
/usr/local/www/data //預設根目錄
/usr/local/sbin/apachectl configtest //檢查語法有無錯誤
graceful //載入httpd.conf並啟動而不會瞬斷
測試 modssl 服務是否啟動
#sockstat grep http //有看到出現443就表示modssl已經成功的執行了

PHP
Step1.安裝 PHP 5
切換到安裝路徑-->安裝 PHP5 套件
#cd /usr/ports/lang/php5 //路徑
#make install clean //安裝套件並清除不必要檔案出現以下三選項按個人習慣選擇吧
[ ] apache2
[ ] DEBUG
[ ] IPV6
安裝完成後相關檔案:
/usr/local/etc看到多出了php.ini-dist(而不是以前的php.ini)及php.conf
此時打>php -m //Show compiled in modules,將只看到純化的php
[PHP Modules]
standard
[Zend Modules]
Step2.安裝 PHP Extension
由於PHP已經純化了所以擴充模組要另外安裝(由/usr/ports/UPDATING 20040719可知)
#cd /usr/ports/lang/php5-extensions //安裝路徑
#make install clean //安裝套件一樣依個人喜好點選
安裝完成後相關檔案:
/usr/local/etc/php/extension.ini //像安裝Zend Optimizer,參數就是要修改此檔而不是php.ini-dist
/usr/local/lib/php/20020429-debug (extension dir)
此時打>php -m //Show compiled in modules,將列出所安裝的extension so
[PHP Modules]
ctype
gd
gettext
imap
mysql
overload
pcre
posix
session
standard
tokenizer
xml
zlib
[Zend Modules]
隨意建立一個檔名為test.php的檔案,然後放到apache的web目錄(預設目錄是/usr/local/www/data)內容如下:如果能看到php的預設頁就表示成功了~~^^

Step3.安裝 Zend Optimizer
Zend Optimizer利用最佳化程式碼的方法,來提高 PHP 應用程式的執行速度。一般情況下,執行 Zend Optimizer 的 PHP 程式比不使用時效率要快上 40% 到 100% 。也因此可以套顯降低伺服器的 CPU Loading。 [Zend官網]
#cd /usr/ports/devel/ZendOptimizer //切換至安裝路徑
#make install //安裝
===> 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"
請把上面這幾行貼到 /usr/local/etc/php/extension.ini 吧,然後在打php -m應該可看 到 ZendOptimizer 已確實載入了
[PHP Modules]
ctype
dom
iconv
libxml
pcre
posix
session
SimpleXML
SPL
SQLite
standard
tokenizer
xml
Zend Optimizer
[Zend Modules]
Zend Extension Manager
Zend Optimizer
補充1:備份 Apache log
方法一、使用 newsyslog.conf
當網路流量增大時,Log也每天肥大,要讓它永無止境的肥大下去嗎?見人見智若要定期備份apache log用個簡單的方式那就是newsyslog但值得注意必須要加上/var/run/httpd.pid 讓apache能重新啟動,否則當newsyslog rotate log之後,並沒有送個SIGHUP給apache,將導致apache的log寫到不知道什麼地方去....而出現newsyslog[66253]: logfile turned over錯誤訊息。
#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 套件的功能就在於能把 log 每天產生,從該套件的敘述也可知道其功能 A web log rotation utility that provides datestamp filename,可利用該套件的功能把 apache 產生的 log 分批每天產生。
#cd /usr/ports/sysutils/cronolog;make install clean //安裝 cronolog 套件
修改 apache 設定檔來分批每天產生 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 //修改後
補充2:Apache .htaccess應用
當您有些網頁不想讓人可以隨便瀏覽(如:個人管理介面、程式後台.....),此時可利用Apache內的.htaccess功能來替網頁作管制使用者的保護,方法常使用為"密碼(AuthConfig)"與"管制來源 IP(Limit)"這二種方法來過濾使用者;但要注意的是httpd.conf內關於該目錄的AllowOverride必須設為 AuthConfig 及 Limit 才能使用.htaccess去覆蓋原本對該目錄的設定,反之若設為 None 則 .htaccess 則無法使用。
Step1.設定.htaccess
切換到要保護的目錄下-->建立.htaccess檔-->指定密碼檔的存放路徑authuserfile-->管制來源IP(即只有設定的來源IP段才能進入管理介面輸入帳號密碼)
#cd /home/weithenn/web/admin //切換到要保護的目錄下
#vi .htaccess //建立.htaccess檔且內容如下
AuthType Basic
AuthName "Weithenn Admin Auth"
AuthUserFile /home/weithenn/web/.htpasswd //指定密碼檔的存放路徑
require valid-user

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 能瀏覽網頁
allow from .weithenn.lan //允許網域 weithenn.lan 能瀏覽網頁

Step2.建立.htpasswd密碼檔
切換到密碼檔存放路徑-->建立帳號-->設定密碼,要注意日後要再新增使用者不必使用-c參數(也就是htpasswd .htpasswd admin),只有在第一次設定 htpasswd 時才需使用 -c 這個參數,因為它代表建立一個密碼檔要修改密碼可使用 -m 參數,如果您的密碼檔已存在而又使用 -c 參數,則原本的密碼檔將會被新的所覆蓋。
#cd /home/weithenn/web //切換到密碼檔存放路徑
#htpasswd -c .htpasswd admin //建立帳號為admin
New password:請輸入密碼
Re-type new password:再輸入一次確認
補充3:Apache ExtendedStatus應用
Apache 內建 server-status 及 server-info 二種可即時觀看伺服器狀態及模組的方法,apache 設定檔預設是將這些選項 mark 起來的,要使用很簡單只要把 mark 拿掉,另外記得只允許內部的網段去查看即可(避免安全性問題)
#vi /usr/local/etc/apache/httpd.conf
ExtendedStatus On //預設值為 # 請將 # 拿掉
###server-status 伺服器狀態資訊

SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.1. //僅允許網段 192.168.1 能觀看

###server-info 伺服器組態資訊

SetHandler server-info
Order deny,allow
Deny from all
Allow from 192.168.1. //僅允許網段 192.168.1 能觀看

成果觀看
http://Your_FQDN/server-status
可在加上如下參數 (ex.http://Your_FQDN/server-status?refresh 為每秒更新一次)
notable -- 用來支援無法顯示 Table 的 Browser
refresh -- 每一秒更新一次畫面
refresh=n -- 每 n 秒更新一次畫面
auto -- 顯示 apache 的狀態資料


##
PHPMYADMIN
###
Alias /phpmyadmin/ "/usr/local/www/phpMyAdmin/"


Options none
AllowOverride Limit

Order Deny,Allow
Deny from all
Allow from 127.0.0.1 .example.com