虽然兴趣不是很大,但既然说解决了中文全文搜索等问题,不得不看看。看看到底是怎么解决的喽。不过从发布页就可以看到是非常匆忙发布的了,可能是因为DISCUZ!NET要发布了,赶在人家前面吧。
[更新时间:2006-08-30 22:02]
1、修复后台“外观设置---->风格界面模板总管理-■ 风格模板/CSS管理/语言包“选择简体中文后出现错误页面的BUG(涉及文件admin/template.php),单文件下载更新地址:http://p.dvbbs.net/download/upgrade.zip,下载完成后将文件名上传到相应目录即可;
[更新时间:2006-08-30 17:50]
更新描述:
1、修复Mysql4.1以下版本无法安装的问题;(涉及文件install/install.sql)
2、修复默认安装下默认管理员后台管理权限不足的问题:(涉及文件install/install.sql)
呵呵,这种问题都有。
DISCUZ!NET发布,也要试试。虽然不懂NET,但一直使用DZ的东东。
screen.width-500)this.style.width=screen.width-500;" border=0 twffan="done">
screen.width-500)this.style.width=screen.width-500;" border=0 twffan="done">
screen.width-500)this.style.width=screen.width-500;" border=0 twffan="done">
screen.width-500)this.style.width=screen.width-500;" border=0 twffan="done">
第12号超强台风IOKE将向西偏北方向移动
今年第12号超强台风IOKE的中心今天下午5点钟位于马绍尔群岛以北的西北太平洋洋面上,就是北纬16.3度、东经173.1度,中心附近最大风力仍有17级(60米/秒)。预计,超强台风中心将以每小时15公里左右的速度向西偏北方向移动,强度维持。
中央气象台特别提醒在上述海域航行的船只,及时收听超强台风信息,做好防御措施。
國網中心 & 青草湖社區大學
王順泰 (c00wht00@nchc.gov.tw)
1. 介紹
在現代的生活中網際網路(Internet)的應用愈益普及,內容也愈加的豐富且多元多樣,其中以全球資訊網(WWW)的使用所佔比例最高,並且仍以驚人的速度成長著。使用者除了可以瀏覽世界各地的網頁之外,更可以將自己精心製作的網頁放到網站上,讓所有其他的人參觀。透過這種互動,整個 Internet 就如同是一個龐大的資料庫,我們可以在上面找到各式各類我們想要的資訊。
那麼我們該如何建立一個 Web 網站呢?首先,我們需要一台可以運作的主機(例如一般廉價的個人電腦),在上面我們還需要有一個平穩強大的作業系統(在此就採用大家最為熟悉的 Linux)。除此之外,我們還需要一套能把網路上的網頁供其它人來存取的軟體,也就是所謂的 HTTP (Web) Server 協定服務軟體,HTTP Server 比較有名的包括:Apache HTTP Server、M$ 的 Internet Information Server、Netscape 的 Enterprise Server 等.. 由於我們使用的作業系統平台是 Linux,因此將針對在 Unix 系統上最受歡迎的 Apache HTTP Server 來做介紹。
Apache HTTP Server 是一個免費且開放源碼的 HTTP 伺服器,主要目的在於提供一個安全並且有效率的 HTTP Server 環境。Apache HTTP Server 目前有 Unix-Based 和 Windows 的版本。根據統計,目前 Apache HTTP Server 已成為佔有率最高的 HTTP Server 軟體,而且它的功能與執行效率並不會比一般商業的 Web Server 軟體來的差,甚至領先許多。Apache HTTP Server 目前的版本分為 1.3.x 版與 2.0.x 版,兩個版本基本上功能都差不多,不一樣的地方在於 2.0.x 的執行效率會比 1.3.x 來得好,因為 2.0.x 程式結合了執行緒〈thread〉與程序〈process〉,讓熟悉系統的管理者能夠調校各種不同的組合,達到最佳效能,而 1.3.x 版只能以程序〈process〉方式來運作,兩者觀念完全不同。另外,2.0.x 版也把許多模組內建在自己的系統裡,詳細的資料可參考 Apache 的家:http://httpd.apache.org/
2. 安裝
2.1 如何取得
Apache HTTP Server 也如同 Linux 眾多的 package 一樣會有版本的更新,新版本通常會增加新的功能或是修正一些 bug,我們可以參考 Apache 的家 http://httpd.apache.org 以得到最新的消息。本例我們以Apache版本 1.3.27 為例,原始程式可以從 請按我 取得。
另外也可以到國網中心的 opensource 網站上取得。請按我
2.2 編譯與安裝
原始程式編譯及安裝
首先將原始程式檔解壓縮。
|
解壓縮: [root@root]# tar zxvf /tmp/apache-1.3.27.tar.gz -C /usr/local/src |
執行 configuration shell script。
|
更換目錄: [root@src]# cd /usr/local/src/apache_1.3.27/ 執行 configure,--prefix 用來指定要安裝的目錄名稱: [root@apache_1.3.27]# ./configure --prefix=/usr/local/apache |
進行編譯。在編譯完成後,需執行安裝步驟。
|
編譯: [root@apache_1.3.27]# make 安裝: [root@apache_1.3.27]# make install |
在編譯安裝完成後,可以執行以下動作來測試是否安裝成功:
|
啟動 apache: [root@apache_1.3.27]# /usr/local/apache/bin/apachectl start /usr/local/apache/bin/apachectl start: httpd started
驗證,如有看到 httpd process 在執行即表示安裝成功: [root@apache_1.3.27]# ps ax | grep httpd 3146 ? S 0:00 /usr/local/apache/bin/httpd
停止 apache: [root@apache_1.3.27]# /usr/local/apache/bin/apachectl stop /usr/local/apache/bin/apachectl stop: httpd stopped |
Debian apt-get 安裝
利用 apt-get 來安裝:
|
[root@root]# /usr/bin/apt-get install apache |
RPM 安裝
在取得 apache rpm 套件後,執行 rpm -ivh 檔名。
|
[root@root]# /usr/bin/rpm -ivh apache-1.3.27.i386.rpm |
3. 設定
在編譯安裝完後,在 /usr/local/apache/conf 目錄中應該會有三個檔案,包括:httpd.conf、srm.conf、access.conf。其中,httpd.conf 用來設定伺服器﹝port號碼、使用者等..﹞。srm.conf 用來設定 設定一般使用者的網站目錄 、網頁目錄的 alias、script 檔與相關 HTML 檔案的位置等。最後,access.conf 用來設定基本存取。雖然新版 Apache HTTP Server 的文件內提到已將 httpd.conf、srm.conf 與 access.conf 這三個檔整合為一個 httpd.conf,但實際上 access.conf 與 srm.conf 仍然存在,只不過沒有內容。以下針對 httpd.conf 檔案內容的設定做簡單介紹。
3.1 httpd.conf 檔的設定
I. 全域環境變數設定
ServerType
語法:ServerType <(inetd)/(standalone)>
預設:ServerType standalone
ServerType 用來指定系統該以何種型態去啟動伺服器。型態可以是其中之一:
- inetd:伺服器將由系統程序 inetd 執行;啟動伺服器使用的命令加在 /etc/inetd.conf 檔案裡。
- standalone:伺服器將會以伺服程式〈daemon〉方式來執行;啟動伺服器使用的命令加在系統啟動指令稿裡〈/etc/rc.d/rc.local 或 /etc/rc.d/init.d/httpd 裡〉。
inetd 在這兩個選項裡比較少使用。因為接收到每個 http 連線就要重頭開始執行另一份新的伺服器程式拷貝;連線結束後,這支程式就會結束,所以每次連線要付出的代價很高,相對的使用者等待時間會加長。但是因為安全上的理由,某些管理者喜歡這個選項。
standalone 是 ServerType 最普遍的設定,因為它是最有效率的執行方式。伺服器程式只啟動一次,而且服務所有的連線。如果我們想要利用 Apache Server 來服務一個忙碌的站臺,standalone 大概將會是唯一的選擇。
例:
|
ServerType standalone -> 指定 apache 以 daemon 方式來執行 |
ServerRoot
語法:ServerRoot <目錄名稱>
預設:ServerRoot "/usr/local/apache"
ServerRoot 用於設定 Apache Server 所安裝的絕對路徑,所有網站相關的襠案都存放在此目錄中。其它配置檔的相對路徑是相對於這個路徑。
例:
|
ServerRoot "/usr/local/apache" -> 指定 apache server 安裝的根目錄為 /usr/local/apache 目錄 |
PidFile
語法:PidFile <檔案名稱>
預設:PidFile /usr/local/apache/logs/httpd.pid
PidFile 用來設定伺服器記錄它的程式之程序號碼所使用的檔案。這樣就不必用 ps 指令來尋找它的程序號碼。而 PidFile 的功能只能使用在 ServerType 為 standalone 的模式。
我們可以藉由傳送 SIGHUP〈kill -1〉信號到列在 PidFile 檔案裡的程序號碼來達成關閉或重新再打開錯誤記錄與傳輸記錄以及重新讀取配置檔等。
例:
|
PidFile /usr/local/apache/logs/httpd.pid -> 指定 apache 執行時要存放記錄 PID 檔案的路徑與檔名 |
TimeOut
語法:TimeOut <數字>
預設:TimeOut 300
TimeOut 用來設定伺服器接收一個請求以及完成一個請求最長的等待時間〈以秒為單位〉,如果在此時間內沒有回應則終止服務。所以當接收或傳送一個資料時所花的時間超過 TimeOut 所規定的時間時,伺服器便將會中斷該連線。如果網路速度較慢,則此 Timeout 時間可以設長一些。
例:
|
TimeOut 500 -> 指定 apache 接收或傳送的等待時間 |
KeepAlive
語法:KeepAlive <(On/Off)>
預設:KeepAlive On
KeepAlive 用於設定伺服器要不要開啟連續請求的功能,On 是開啟,Off 是關閉。
例:
|
KeepAlive On -> 指定 apache 開啟連續請求功能 |
MaxKeepAliveRequests
語法:MaxKeepAliveRequests <個數>
預設:MaxKeepAliveRequests 100
MaxKeepAliveRequests 用於設定伺服器所能接受之最大連續請求量,如果連續請求超過這個此數限制則 Server 會自動拒絕請求連線。若設定為 0 則表示不做限制。
例:
|
MaxKeepAliveRequests 0 -> 指定 apache 不限制所能接收之連線數量 |
KeepAliveTimeout
語法:KeepAliveTimeout <秒數>
預設:KeepAliveTimeout 15
KeepAliveTimeout 用於設定使用者 '連續' 請求等待的時間上限,如果使用者連續請求的時間超過此數,則終止此請求服務。
例:
|
KeepAliveTimeou 15 -> 指定 apache 等待使用者連續請求的時間,在接到使用者請求開始,15 秒內若沒收到新請求訊息,即中斷該連線 |
MinSpareServers / MaxSpareServers
語法:MinSpareServers <數量> / MaxSpareServers <數量>
預設:MinSpareServers 5 / MaxSpareServers 10
MinSpareServers 用於設定最小閒置 (idle) 子伺服程序數量,而 MaxSpareServers 用於設定最大閒置 (idle) 子伺服程序數量。閒置子伺服程序是目前沒有處理要求的程序。如果有多於 MaxSpareServers 的子程序,那麼父程序會終止超過此數量的子程序。如果有小於 MinSpareServers 的子程序,那麼父程序會產生超過此數量的子程序。通常不會將 MaxSpareServers 設很大,只有在非常忙碌的站臺上才有調整這個選項的需要。
例:
|
MinSpareServers 5 -> 設定最少閒置等待服務的伺服程序數量為 5 個 MaxSpareServers 10 -> 設定最大閒置等待服務的伺服程序數量為 10 個 |
StartServers
語法:StartServers <數量>
預設:StartServers 5
StartServers 用於設定啟動時所要建立的子伺服程序數量。因為程序的數量是依據負載動態控制的,通常不需要調整這個參數。
例:
|
StartServers 5 -> 設定啟動 apache 時要建立 5 個伺服程序 |
MaxClients
語法:MaxClients <數量>
預設:MaxClients 150
MaxClients 用於設定同時能夠提供給使用者的最大服務請求數目。
例:
|
MaxClients 150 -> 設定 apache 在同一時間內最大能服務 150 個連線請求 |
II. Server 主要變數設定
Port
語法:Port <數字>
預設:Port 80
Port 設定伺服器用來監聽連線的網路埠號。參數<數字>是 0 到 65535 的一個數目;某些埠號(特別是低於 1024 的)是保留給特殊的協定。請參閱 /etc/services 裡定義的一些埠的列表,而標準的 http 協定則使用 80 埠號。Port 80 是 Unix 中的一個特別埠。所有低於 1024 的埠號都是保留給系統使用的,一般使用者 (non-root) 不能使用它們;取而代之的是他們可以使用較高的埠號。要使用 80 埠你必須以 root 帳號啟動伺服器。如果你不能使用 80 埠,選擇任何其它沒有使用到的埠。非 root 使用者必須選擇高於 1023 的埠號,像是 8000 。
例:
|
Port 8000 -> 設定 apache 的連線埠號為 8000 |
User
語法:User [username / #uid]
預設:User nobody
User 用來設定伺服器程式的執行者是誰。一般是 nobody,也可以是已註冊的使用者,若用 user id 則要先加上 # 號。這個執行者應該不能有存取外界所不能看到的檔案的權限,而且這個執行者應該不能執行對 httpd 要求而言沒有意義的程式碼。建議特別為執行這個伺服器設立新的使用者。
例:
|
User apache -> 設定 apache 程式以 apache 使用者身份來執行 |
Group
語法:Group [groupname / #gid]
預設:Group nogroup
Group 用於設定 httpd 這程式的執行者所屬的群組,一般是 nogroup,此 group 必須要存在於 /etc/group 中。相同於 User 指令,這個群組應該不能有存取外界所不能看到的檔案的權限,而且應該不能執行對 httpd 要求而言沒有意義的程式碼。建議特別為執行這個伺服器設立新的群組。
例:
|
Group apache -> 設定 apache 程式以 apache 群組的身份來執行 |
ServerAdmin
語法:ServerAdmin <電子郵件地址>
預設:ServerAdmin root@localhost
ServerAdmin 用於設定此站台管理者的電子郵件地址,當伺服器發生錯誤時,會傳送這些錯誤訊息給此電子郵件地址。
例:
|
ServerAdmin chanel@armani.com -> 當 apache 發生錯誤時,會傳送這些訊息給 chanel@armani.com 這個 E-mail 的管理者 |
ServerName
語法:ServerName <主機名稱>
ServerName 用於設定該伺服器的名稱,此名稱必須是已經向伺服器本身所在網域的 DNS 註冊。若沒有一個登記的 DNS name,則改為 IP 位址。
例:
|
ServerName www.prada.com -> 設定 apache 主機的名稱為 www.prada.com |
DocumentRoot
語法:DocumentRoot <目錄名稱>
預設:DocumentRoot "/usr/local/apache/htdocs"
DocumentRoot 用於設定伺服器文件或其它資料所在的根目錄位置。伺服器會把連線請求的 URL 附加到根文件目錄 (document root) 來組合到達文件的路徑。
例:
|
DocumentRoot "/usr/local/apache/htdocs" -> 指定文件的根目錄為 /usr/local/apache/htdocs 目錄,若使用者輸入 http://myserver/doc.html,最對映到系統中的 /usr/local/apache/htdocs/doc.html 檔。 |
Directory
語法:<Directory [目錄絕對路徑]> ... </Directory>
Directory 指令區間內的參數是用於設定目錄的相關屬性或控制目錄的權限。使用方法需配合 Order 或 Options 指令。
Order
語法:Order [allow/deny/allow,deny]
Order 用於設定何人可以從這個 Server 取得控制目錄的權限。
例:
|
Oeder allow,deny |
Options
語法:Options <參數>
Options 指令配合 <Directory [目錄絕對路徑]> ... </Directory> 來控制該目錄的屬性,
指令後面的 <參數> 表示可以開啟的屬性種類,所代表的值可以包括:
- All:此目錄除 MultiViews 外,所有屬性都開啟。
- MultiViews:允許 MultiViews 內容。
- Indexes:若該目錄被以 http 的方式讀取,而該目錄中並不存在 index.htm 或 index.html 等索引檔,則會自動將該目錄的檔案資訊轉化成為 HTML 格式傳回給瀏覽器。
- IncludesNOEXEC:開放 SSI (Server-side include) 的權限,但是會關閉 CGI 程式中 #exec 與 #include 的宣告。
- Includes:開放 SSI 的權限。
- FollowSymLinks:准許以符號連結到其他目錄。
- ExecCGI:允許執行 CGI 程式。
- SymLinksfOwnerMath:允許符號連結到的目錄與原始目錄的所有人不同。
例:
|
<Directory /> <-- 設定為根目錄
<Directory "/usr/local/apache/htdocs"> |
UserDir
語法:UserDir <目錄名稱>
預設:UserDir public_html
UserDir 用來指定供使用者放置個人網頁時,該放在自家〈home〉目錄裡的那一個目錄中才能讓人瀏覽。若以 http://myserver/~username 作為開始的一個 URL 連線請求將會被轉換成以 home-dir/public_html 作為開始的檔案名稱,其中 home-dir 是 username 這個使用者的自家目錄。
例:
|
UserDir public_html -> 設定使用者必須把自己的網頁放在自家目錄的 public_html 目錄下才能供人瀏覽。對 http://myserver/~user/dir/file.html 的請求將傳回 http://myserver/home/user/public_html/dir/file.html 這個檔案。 |
DirectoryIndex
語法:DirectoryIndex <檔名1> <檔名2>...
預設:DirectoryIndex index.html
DirectoryIndex 用於設定當使用者端藉由指定沒有以檔案做結尾的目錄名稱請求該目錄的索引時所要找尋的來源列表。參數 [檔名1] 是在伺服器上相對於請求之目錄的文件;它通常是目錄裡某個檔案的名稱。可以有好幾個檔名,伺服器會回傳它所找到的文件。
例:
|
DirectoryIndex index.html -> 對於 http://myserver/docs/ 的請求若該來源設定的檔案存在的話會回傳 http://myserver/docs/index.html。 |
DefaultType
語法:DefaultType <MIME 種類>
預設:DefaultType text/plain
DefaultType 用於設定當伺服器無法辨識檔案類型,要把它當作何種的 MIME 格式。
例:
|
DefaultType text/plain -> 將無法分辨的一律當成明文文字格式 |
HostNameLookups
語法:HostNameLookups <On/Off>
預設:HostNameLookups Off
HostNameLookups 用於設定要不要把自動搜尋 HostName 的功能打開,設定為 On 時,則會記錄進入此網站使用者的主機名稱。設為 Off,則僅記錄使用者主機的 IP。
例:
|
HostNameLookups Off -> 關掉自動反查 IP 功能 |
ErrorLog
語法:ErrorLog <檔案名稱>
預設:ErrorLog /usr/local/apache/logs/error_log
ErrorLog 設定錯誤記錄檔案名稱,伺服器將會把其遭遇的每個錯誤記錄到這個檔案。如果檔案名稱不是以 / 開始的話那麼它就會被假設為相對於 ServerRoot 的路徑。
例:
|
ErrorLog /usr/local/apache/logs/error_log -> 當 apache 發生錯誤時,會把訊息記錄到 /usr/local/apache/logs 目錄下的 error_log 檔中 |
LogLevel
語法:LogLevel <debug/info/notice/warm/error/crit/alert/emerg>
預設:LogLevel warm
LogLevel 用於設定 error_log 中記錄的錯誤訊息種類,建議值是 warm,參數越往右邊所記錄的資訊越簡略。
例:
|
LogLevel debug -> 設定 apache 的記錄錯誤方式為除錯模式〈debug〉 |
Alias
語法:Alias <虛擬目錄> <實際目錄>
Alias 指令用於設定實際目錄至虛擬目錄之別名,可將原本很長的路徑簡化。
例:
|
Alias /doc /usr/local/apache/htdocs/manual/doc/ -> 原本需要用 http://localhost/manual/doc 才能連到的網頁,現在僅需使用 http://localhost/doc 即可。 |
4. 啟動與結束
當設定完 httpd.conf 之後,Apache 的設定步驟就算完成了。現在我們來看如何啟動以及結束 Apache 伺服器程式。
4.1 啟動 httpd
啟動 Apache 伺服器程式的方法非常簡單,執行以下程式,即可將伺服器程式 httpd 啟動:
|
[root@root]# /usr/local/apache/bin/apachectl start |
若使用 apt-get 或 rpm 安裝則可以直接執行位於 /etc/init.d 目錄下的指令稿來啟動:
|
[root@root]# /sbin/service httpd start 或 [root@root]# /etc/init.d/httpd start |
啟動後,可以使用 ps 指令來檢查一下目前 httpd 是否已經在執行:
|
[root@root]# ps axu | grep httpd |
4.2 結束 httpd
結束 Apache 伺服器程式的方法也非常簡單,執行以下程式,即可將伺服器程式 httpd 結束:
|
[root@root]# /usr/local/apache/bin/apachectl stop |
若使用 apt-get 或 rpm 安裝則可以直接執行位於 /etc/init.d 目錄下的指令稿來結束:
|
[root@root]# /sbin/service httpd stop 或 [root@root]# /etc/init.d/httpd stop |
4.3 測試
當啟動 Apache Server 後,可以透過開啟 X Windows 中的 Mollia 瀏覽器來測試,只需在位址列輸入:http://localhost/ 即可。或者可利用 Lynx 文字瀏覽器來測試,用法如下:
|
[root@root]# lynx -dump http://localhost/ |
若看到以下畫面就是代表連線正常安裝完成了。
|
If you can see this, it means that the installation of the [1]Apache |
5. 參考資料
- Apache Reference Manual: http://httpd.apache.org/docs/
- Study Area: http://www.study-area.net/linux/servers/linux_www.htm
- 中文 Linux WWW HOWTO: http://www.linpus.com.tw/nicedoc/CLDP/WWW-HOWTO.html
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.chedong.com/tech/apache_install.html
关键词: apache install php resin mod_gzip mod_expire webalizer cronolog
内容摘要:
Apache是一个历史悠久并且功能十分强大的WEB服务器,但其丰富的功能对于一个新手来说往往不知道从何下手。我个人感觉Apache的设计充分体现了模块化设计的优势,通过在动态模块加载(DSO)模式下的安装,任何子应用模块都可以通过配置文件的简单修改进行积木式的灵活配置。安装的过程可以从简单的静态html服务开始,一个模块一个模块的学习使用。从单纯的HTML静态服务(core),到复杂的动态页面服务(core + php, core + resin, core + php + mod_gzip, core + resin + mod_expire)。
本文主要从简化安装==>性能调优==>维护方便的角度,介绍了WEB服务的规划、HTTPD安装/应用模块配置、升级/维护等过程。让Apache和PHP,Resin等应用模块的独立升级,完全互不影响。
- WEB应用容量规划:根据硬件配置和WEB应用的特点进行WEB服务的规划及一些简单的估算公式;
- Apache安装过程:apache的通用的简化安装选项,方便以后的应用的模块化配置;
修改 HARD_SERVER_LIMIT:
vi /path/to/apache_src/src/include/httpd.h
#define HARD_SERVER_LIMIT 2560 <===将原来的 HARD_SERVER_LIMIT 256 后面加个“0”
apache编译:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most - 可选应用模块/工具的安装:php resin mod_gzip mod_expire及各个模块之间的配合;
mod_php安装:./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
mod_resin安装:./configure --with-apxs=/home/apache/bin/apxs
mod_gzip安装:修改Makefile中的 apxs路径:然后make make install
工具:日志轮循工具cronolog安装:http://www.cronolog.org - 升级/维护:看看通用和模块化的安装过程如何简化了日常的升级/维护工作;
按照以上的方法:系统管理员和应用管理员的职责可以清楚的分开,互相独立。
系统安装:系统管理员的职责就是安装好一台DSO模式的Apache,然后COLON即可,
应用安装:由应用管理员负责具体应用所需要的模块,比如PHP Resin等,并设置httpd.conf中相关的配置。
系统升级:系统管理员:升级操作系统/升级Apache
应用升级:应用管理员:升级应用模块,PHP Resin等。
Apache主要是一个内存消耗型的服务应用,我个人总结的经验公式:
apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5
为什么会有一个apache_max_process_with_good_perfermance和apache_max_process呢?原因是在低负载下系统可以使用更多的内存用于文件系统的缓存,从而进一步提高单个请求的响应速度。在高负载下,系统的单个请求响应速度会慢不少,而超过 apache_max_process,系统会因为开始使用硬盘做虚拟内存交换空间而导致系统效率急剧下降。此外,同样的服务:2G内存的机器的 apache_max_process一般只设置到1G内存的1.7倍,因为Apache本身会因为进程过多导致性能下降。
例子1:
一个apache + mod_php的服务器:一个apache进程一般需要4M内存
因此在一个1G内存的机器上:apache_max_process_with_good_perfermance < (1g / 4m) * 2 = 500
apache_max_process = 500 * 1.5 = 750
所以规划你的应用让服务尽量跑在500个进程以下以保持比较高的效率,并设置Apache的软上限在800个。
例子2:
一个apache + mod_resin的服务器: 一个apache进程一般需要2M内存
在一个2G内存的机器上:
apache_max_process_with_good_perfermance < (2g / 2m ) * 2 = 2000
apache_max_process = 2000 * 1.5 = 3000
以上估算都是按小文件服务估算的(一个请求一般大小在20k以下)。对于文件下载类型站点,可能还会受其他因素:比如带宽等的影响。
服务器个数的硬上限HARD_SERVER_LIMIT的修改:
在Apache的源代码中缺省的最大进程数是256个,需要修改apache_1.3.xx/src/include/httpd.h
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#elif defined(NETWARE)
#define HARD_SERVER_LIMIT 2048
#else
#define HARD_SERVER_LIMIT 2560 <===将原来的HARD_SERVER_LIMIT 256 后面加个“0”
#endif
#endif
解释:
Apache缺省的最大用户数是256个:这个配置对于服务器内存还是256M左右的时代是一个非常好的缺省设置,但随着内存成本的急剧下降,现在大型站点的服务器内存配置一般比当时要高一个数量级不止。所以256个进程的硬限制对于一台1G内存的机器来说是太浪费了,而且Apache的软上限 max_client是受限于HARD_SERVER_LIMIT的,因此如果WEB服务器内存大于256M,都应该调高Apache的 HARD_SERVER_LIMIT。根据个人的经验:2560已经可以满足大部分小于2G内存的服务器的容量规划了(Apache的软上限的规划请看后面)。
Apache的编译:以下通用的编译选项能满足以后任意模块的安装
./configure --prefix=/another_driver/apache/ --enable-shared=max --enable-module=most
比如:
./configure --prefix=/home/apache/ --enable-shared=max --enable-module=most
解释:
--prefix=/another_driver/apache/:建议将apache服务安装在另外一个驱动设备上的目的在于硬盘往往是一个系统使用寿命最低的设备,因此:将服务数据和系统完全分开,不仅能提高了数据的访问速度,更重要的,大大方便系统升级,应用备份和恢复过程。
--shared-module=max:使用动态加载方式载入子模块会带来5%的性能下降,但和带来的配置方便相比更本不算什么:比如模块升级方便,系统升级风险降低,安装过程标准化等
--enable-module=most:用most可以将一些不常用的module编译进来,比如后面讲到的mod_expire是就不在 apache的缺省常用模块中
如果不想build so, 也可以这样:
./configure \
"--with-layout=Apache" \
"--prefix=/path/to/apache" \
"--disable-module=access" \
"--disable-module=actions" \
"--disable-module=autoindex" \
"--disable-module=env" \
"--disable-module=imap" \
"--disable-module=negotiation" \
"--disable-module=setenvif" \
"--disable-module=status" \
"--disable-module=userdir" \
"--disable-module=cgi" \
"--disable-module=include" \
"--disable-module=auth" \
"--disable-module=asis"
但结果会发现,这样编译对服务性能只能有微小的提高(5%左右),但却失去了以后系统升级和模块升级的灵活性,无论是模块还是Apache本身升级都必须把Apache和PHP的SOURCE加在一起重新编译。
apache的缺省配置文件一般比较大:可以使用去掉注释的方法精简一下:然后再进入具体的培植过程能让你更快的定制出你所需要的。
grep -v "#" httpd.conf.default >httpd.conf
需要修改的通用项目有以下几个:
#服务端口,缺省是8080,建议将整个Apache配置调整好后再将服务端口改到正式服务的端口
Port 8080 => 80
#服务器名:缺省没有
ServerName name.example.com
#最大服务进程数:根据服务容量预测设置
MaxClients 256 => 800
#缺省启动服务后的服务进程数:等服务比较平稳后,按平均负载下的httpd个数设置就可以
StartServers 5 => 200
不要修改:
以前有建议说修改:
MinSpareServers 5 => 100
MaxSpareServers 10 => 200
但从我的经验看来:缺省值已经是非常优化的了,而且让Apache自己调整子共享进程个数还是比较好的。
特别修改:
在solaris或一些比较容易出现内存泄露的应用上:
MaxRequestsPerChild 0 =>3000
应用模块和工具的安装配置:
由于使用模块动态加载的模式,所以可以方便的通过简单的配置调整来把Apache定制成你需要的:最好把不常用模块全部清除(无论处于安全还是效率)。
比如:对于静态页面服务器:就什么其他子模块都不加载,对于PHP应用就加上PHP模块,对于JAVA应用就把Resin模块加载上。而且各种模块的插拔非常简单,这样调试过程中就可以简单的通过注释掉不需要的模块,而不用重新编译。
一般说来,可以不需要的模块包括:
#LoadModule env_module libexec/mod_env.so
#LoadModule negotiation_module libexec/mod_negotiation.so
#LoadModule status_module libexec/mod_status.so
#server side include已经过时了
#LoadModule includes_module libexec/mod_include.so
#不需要将没有缺省index文件的目录下所有文件列出
#LoadModule autoindex_module libexec/mod_autoindex.so
#尽量不使用CGI:一直是Apache安全问题最多的地方
#LoadModule cgi_module libexec/mod_cgi.so
#LoadModule asis_module libexec/mod_asis.so
#LoadModule imap_module libexec/mod_imap.so
#LoadModule action_module libexec/mod_actions.so
#不使用安全认证可以大大提高访问速度
#LoadModule access_module libexec/mod_access.so
#LoadModule auth_module libexec/mod_auth.so
#LoadModule setenvif_module libexec/mod_setenvif.so
最好保留的有:
#用于定制log格式
LoadModule config_log_module libexec/mod_log_config.so
#用于增加文件应用的关联
LoadModule mime_module libexec/mod_mime.so
#用于缺省index文件:index.php等
LoadModule dir_module libexec/mod_dir.so
可用可不用的有:
#比如:需要在~/username/下调试php可以将
LoadModule userdir_module libexec/mod_userdir.so
#比如:需要将以前的URL进行转向或者需要使用CGI script-alias
LoadModule alias_module libexec/mod_alias.so
常用的模块:
最常用的可能就是php和JAVA应用服务器的前端,此外,从性能上讲利用mod_gzip可以减少40%左右的流量,减少机器用于传输的负载,而 mod_expires可以减少10%左右的重复请求,让重复的用户对指定的页面请求结果都CACHE在本地,根本不向服务器发出请求。
建议将所有MODULE的配置都放到相应模块的配置内部:<IfModule some_module.c>some_module config </IfModule>
PHP的安装:
/path/to/php_src/configure --with-apxs=/path/to/apache/bin/apxs --with-other-modules-you-need
需要修改的配置:
AddType application/x-httpd-php .php .php3 .any_file_in_php
resin的安装设置:
/path/to/resin/src/configure --with-apxs=/path/to/apache/bin/apxs
具体的resin设置放在另外一个文件中:比如/home/resin/conf/resin.conf
<IfModule mod_caucho.c>
CauchoConfigFile /path/to/apache/conf/resin.conf
</IfModule>
mod_expires的安装配置:
<IfModule mod_expires.c>
ExpiresActive on
ExpiresByType image/gif "access plus 1 month"
ExpiresByType text/css "now plus 1 month"
ExpiresDefault "now plus 1 day"
</IfModule>
注释:
所有的.gif文件1个月以后过期
所有的文件缺省1天以后过期
mod_gzip的安装
http://www.chedong.com/tech/compress.html
cronolog可以非常整齐的将日志按天轮循存储
缺省编译安装到/usr/local/bin/下,只需要将配置改成:
CustomLog "|/usr/local/sbin/cronolog /home/apache/logs/%w/access_log" combined
用gzip压缩每天的日志:
30 4 * * * /usr/bin/gzip -f /home/apache/logs/`date -d yesterday +%w`/access_log
日志的定期删除:
30 5 * * */usr/bin/find /home/apache/logs/ -name access_log.gz -mtime +3 |xargs -r /bin/rm -f
升级维护:
由于使用动态模块加载方式(DSO模式)安装Apache,Apache的HTTPD核心服务和应用模块以及应用模块之间都变的非常灵活,建议将所有独立模块的配置都放在
<IfModule mod_name>
CONFIGURATIONS..
</IfModule>
里,这样配置非常容易通过屏蔽某个模块来进行功能调整:比如:
#AddModule mod_gzip.c
就屏蔽了mod_gzip,而其他模块不首任何影响。
安装和维护过程:
- 系统安装:系统管理员的职责就是安装系统和一个按照DSO模式安装的Apache,然后COLON。
- 应用安装:由应用管理员负责具体应用所需要的模块并设置HTTPD。
- 系统升级:系统管理员:升级系统/升级Apache
- 应用升级:应用管理员:升级应用模块:PHP CAUCHO等
- 系统备份/恢复:如果Apache不在缺省的系统盘上,只需要将Apache目录备份就可以了,遇到系统分区的硬件问题直接使用预先准备好的系统COLON,再直接将Apache所在物理盘恢复就行了。
| 系统管理员:Apache的最简化安装 | OS + Apache (httpd core only) | ||
| 应用管理员:应用模块定制 | 纯静态页面服务 core |
PHP动态页面 core+so +php |
JAVA应用 core+so +caucho +ssl |
| 应用例子: | www.example.com image.example.com |
bbs.example.com | mall.example.com |
例子:Apache和PHP模块的独立升级。
如果Apache是按照以下方式安装:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most
PHP是按照以下方式安装:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
以后单独升级Apache的时候,仍然是:
./configure --prefix=/home/apache --enable-shared=max --enable-module=most
make
su
#/home/apache/bin/apachectl stop
#make install
单独升级php时,仍然是:
./configure --with-apxs=/home/apache/bin/apxs --enable-track-vars --with-mysql
make
su
#/home/apache/bin/apachectl stop
#make install
#/home/apache/bin/apachectl start
基于反相代理的WEB加速:
squid和mod_proxy都可以实现反相代理加速。而基于缓存的代理加速比起原有WEB服务,速度会有数量级的提升。
小提示:
Apache安装后,缺省根目录下没有但很有用的2个文件:
- favicon.ico: favicon.ico是一个16x16的站点图标文件,如果浏览器发现有这个文件,在地址栏中会用这个图标替换调浏览器的网页图标。IE6和 MOZILLA等主流浏览器都支持这个功能。
例如: http://www.chedong.com/favicon.ico
- robots.txt: 用于告诉搜索引擎的爬虫程序(spider)网站那些页面可以被索引,那些不可以。
具体说明请参考:http://www.robotstxt.org/wc/robots.html
参考文档:
Apache项目
http://httpd.apache.org
mod_gzip
http://sourceforge.net/projects/mod-gzip/
Cronolog
http://www.cronolog.org
mod_expires
http://httpd.apache.org/docs/mod/mod_expires.html
面向搜索引擎的CMS设计:
http://www.chedong.com/tech/cms.html






