2009年4月8日 星期三

FreeBSD 7.01 release 安裝記錄5(網頁伺服器:第二步Apache22)

==============================
安裝apache22 + mpm_worker + mod_fastcgi
==============================
Apache + mpm_worker + mod_fastcgi + php-cgi
[FreeBSD]安裝 apache2 (worker) + PHP5.2.6 + mod_fastcgi + php5-fcgi
修正 Apache Worker MPM 與 APC 設定
安裝時請記得勾選MYSQL CGID

# cd /usr/ports/www/apache22
# make config WITH_MPM=worker install clean
# pkg_info | grep apache
;
; 成功會出現
;
# apache-worker-2.2.9_5 Version 2.2.x of Apache web server with worker MPM.

編輯 /usr/local/etc/apache22/httpd.conf

#內定值:網站目錄設定,可自行修改目錄位置
DocumentRoot "/usr/local/www/apache22/data"
#設定Apache的讓網站的檔案結構不讓別人看到,以內定值為例
<Directory "/usr/local/www/apache22/data">
# 原碼:
Options Indexes FollowSymLinks
# 修改:
#Options Indexes FollowSymLinks ; 註解此行
# 或修改成:
Options -Indexes FollowSymLinks
</Directory>
#約216行原碼:
#DirectoryIndex index.html;加上 index.php 或直接改成index.php
DirectoryIndex index.php
#再加上這兩行
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps


裝apache22時 /etc/rc.conf 加上

apache22_enable="YES"
apache22_http_accept_enable="YES"

這樣就會在跑起來的時候幫你 load accf_http 這個需要的 kernel module 了。
==============================
apache相關指令
==============================

# apachectl start //start啟動服務,restart重啟,stop停止
# apachectl configtest //測試配置文件 是否正確

==============================
Worker MPM 配置
==============================
修改 /usr/local/etc/apache22/httpd.conf

# 約420行,若之前有修改以上的設置,則在422行 原碼:
# Server-pool management (MPM specific)
#Include etc/apache22/extra/httpd-mpm.conf 將#去掉
Include etc/apache22/extra/httpd-mpm.conf

修改httpd-mpm.conf
 
# vi /usr/local/etc/apache22/extra/httpd-mpm.conf ; httpd-mpm.conf內找到
<IfModule mpm_worker_module>
StartServers 1
ServerLimit 3
MaxClients 100
MinSpareThreads 25
MaxSpareThreads 50
ThreadLimit 50
ThreadsPerChild 50
MaxRequestsPerChild 10000
</IfModule>

引用:
設計只跑起一隻 httpd,負責所有的連線。
「StartServers」就是剛啟動時要先生出來的 httpd 程序數量
「ServerLimit」定義了最大程序數量,每個程序裡面會包含「ThreadsPerChild」個 Thread(每個 Thread都可以應對一個 Request,不需要傳統那樣一個 Request 就需要一個程序。而當不夠的時候,他會自動增加 Thread 或 Child 來處理)
「MinSpareThreads」和「MaxSpareThreads」定義了最少和最多的空閒 Thread 數量。接著,這邊用「ThreadLimit」來限制了每個 Child 的最大 Thread 數量。
「ThreadPerChild」和「ServerLimit」的乘績決定了「MaxClients」的上限,也就是能夠承受的最大 Request 數量。
「MaxRequestsPerChild」,決定了 Child 接受了幾個 Request 之後就要關閉,等待如果需要才重新產生一個程序。預設是零,也就是不結束。設定重新產生,可以避免安全問題,更重要的是不需要那麼多程序時不會佔用著資源。

調整的時候,可以搭配 ab 壓力測試:

ab -c 同時連線數量 -n 每個連線的Request數量

ex:
ab -c 50 -n500
ab -c 100 -n 1000


==============================
安裝mod_fastcgi ; 若php5尚未安裝請先跳過,等php5安裝(CGI FASTCGI要勾選)完後再安裝
==============================
1.安裝mod_fastcgi 並新建 fastcgi目錄

# cd /usr/ports/www/mod_fastcgi
# make install clean
# mkdir /usr/local/www/fastcgi

確認PHP5支援fastcgi

# cd /usr/ports/lang/php5
# make showconfig | grep -i FASTCGI
支援出現底下訊息:
# FASTCGI=on "Enable fastcgi support (CGI only)"
或此指令
# /usr/local/bin/php-cgi -v
支援出現底下訊息:
PHP 5.2.5 with Suhosin-Patch 0.9.6.2 (cgi-fcgi) (built: Mar 6 2008 09:15:41)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
其中出現 cgi-fcgi 即有支援

2.然後寫個 script 給 fastcgi 來跑 php:

#!/bin/sh
PHPRC="/usr/local/etc"
export PHPRC
PHP_FCGI_CHILDREN=128
export PHP_FCGI_CHILDREN
exec /usr/local/bin/php-cgi

3.存成 /usr/local/www/fastcgi/php.fcgi,記得要

# chmod 755 /usr/local/www/fastcgi/php.fcgi

4.編輯 /usr/local/etc/apache22/httpd.conf 大概在105行

原式:
LoadModule php5_module libexec/apache22/libphp5.so
#LoadModule fastcgi_module libexec/apache22/mod_fastcgi.so
修改後:
#LoadModule php5_module libexec/apache22/libphp5.so ; 會衝突,所以必順把它註解
LoadModule fastcgi_module libexec/apache22/mod_fastcgi.so

然後寫個 mod_fastcgi.conf 放在 /usr/local/etc/apache22/Includes/ 底下:

<IfModule fastcgi_module>
FastCgiConfig -maxClassProcesses 1
FastCgiConfig -idle-timeout 60 //若使用大量資料上傳,如上傳資料庫檔案,則設大一點
ScriptAlias /fastcgi/ "/usr/local/www/fastcgi/"
AddHandler fastcgi-script .fcgi
AddHandler php-fastcgi .php
Action php-fastcgi /fastcgi/php.fcgi
</IfModule>
<Directory /usr/local/www/fastcgi>
SetHandler fastcgi-script
AllowOverride All
Order allow,deny
Allow from all
</Directory>

讓httpd 只能生出一隻 fastcgi,再加上前面限制只有一隻 httpd,可以確保整個 apache 只會透過這個 fastcgi socket 跑 php。
原本 php 該要 AddType 的部分還是要加,改好以後 apache restart 就可以用了。
==============================
備註:
==============================
從PHP5.2.10版本開始(現在有PHP5.2.10和5.3兩個版本),有None-Thread Safe與Thread Safe兩種版本的可供選擇,這兩種版本有何不同,作為使用者來說又應該如何選擇呢?下面聚友將為您講述。

先從字面意思上理解,None-Thread Safe就是非線程安全,在執行時不進行線程(thread)安全檢查;Thread Safe就是線程安全,執行時會進行線程(thread)安全檢查,以防止有新要求就啟動新線程的 CGI 執行方式耗盡系統資源。

再來看PHP的兩種執行方式:ISAPI和FastCGI。FastCGI執行方式是以單一線程來執行操作,所以不需要進行線程的安全檢查,除去線程安全檢查的防護反而可以提高執行效率,所以,如果是以 FastCGI(無論搭配 IIS 6 或 IIS 7)執行 PHP ,都建議下載、執行 non-thread safe 的 PHP (PHP 的二進位檔有兩種包裝方式:msi 、zip ,請下載 zip 套件)。而線程安全檢查正是為ISAPI方式的PHP準備的,因為有許多php模塊都不是線程安全的,所以需要使用Thread Safe的PHP。

[保留不使用它]
portupgrade -fr 重編 lang/php5 和 lang/php5-extensions 重新編過就會是 Thread Safe
==============================
語系支援與虛擬伺服器設定
==============================

# 修改httpd.conf
# vi /usr/local/etc/apache22/httpd.conf
# 語系支援
# Language settings
#Include etc/apache22/extra/httpd-languages.conf ; 把註解拿掉
Include etc/apache22/extra/httpd-languages.conf
# 虛擬伺服器設定
# Virtual hosts
#Include etc/apache22/extra/httpd-vhosts.conf ; 把註解拿掉
Include etc/apache22/extra/httpd-vhosts.conf

# 設定虛擬主機
# vi /usr/local/etc/apache22/extra/httpd-vhosts.conf
# 自行修改成所需設定
NameVirtualHost 192.168.1.10 ; 請設定成主機IP,可虛擬/實體IP,虛擬IP請自行設定IP分享器
<VirtualHost 192.168.1.10>
ServerAdmin admin@Domain
DocumentRoot /usr/local/www/apache22/data/freebsd.ntut.idv.tw/www ; 主機內網站目錄
ServerName freebsd.ntut.idv.tw ; 網站網址
ErrorLog /var/log/httpd-error.log
CustomLog /var/log/httpd-access.log common
</VirtualHost>

沒有留言:

張貼留言