HTTPD詳解

1、HTTPD服務的相關信息

●服務腳本:/etc/rc.d/init.d/httpd

●運行目錄:/etc/httpd

●主配置文件:/etc/httpd/conf/httpd.conf

●擴展配置:/etc/httpd/conf.d/*.conf

●網頁文件根目錄:/var/www/html

●CGI:./var/www/cgi-bin/

2、配置文件的構成

全局配置

(1)配置監聽的地址和端口:

  Listen [IP:] PORT

(2)配置所選用的MPM模塊(多道處理模塊)

★prefork.c模塊(一個非線程型的、預派生的MPM)

prefork模式使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個連接。在大多數平臺上,Prefork MPM在效率上要比Worker MPM要高,但是內存使用大得多。prefork的無線程序設計在某些情況下將比worker更有優勢:他能夠是喲哦那個那些沒有處理好線程安全的第三方模塊,並且對於那些線程調試困難的平臺而言,他也更容易調試一些。      

主進程綁定特權端口;

派發或或回收子進程;

讀取分析主配置文件;

# httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c

工作方式:一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並作出應答。Apache總是試圖保持一些備用的(spare)或是空閒的子進程用於迎接即將到來的請求。這樣客戶端就無需在得到服務前等候子進程的產生。在Unix系統中,父進程通常以root身份運行以便綁定80端口,而Apache產生的子進程通常以一個低特權的用於運行。User和Group指令用於配置子進程的低特權用戶。運行子進程的用戶必須要對他所服務的內容有讀取的權限,但是對服務內容之外的其他資源必須擁有儘可能少的權限。

ServerLimit   20000
StartServers   5
MinSpareServers   5
MaxSpareServers   10
MaxClients   1000
MaxRequestsPerChild 0
ServerLimit     2000
//默認的MaxClient最大是256個線程,假如想配置更大的值,就的加上ServerLimit這個參數。20000是ServerLimit這個參數的最大值。假如需要更大,則必須編譯apache,此前都是無需重新編譯Apache。
生效前提:必須放在其他指令的前面
StartServers   5
//指定服務器啓動時建立的子進程數量,prefork默認爲5。
MinSpareServers   5
//指定空閒子進程的最小數量,默認爲5。假如當前空閒子進程數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。
MaxSpareServers   10
//配置空閒子進程的最大數量,默認爲10。假如當前有超過MaxSpareServers數量 的空閒子進程,那麼父進程將殺死多餘的子進程。此參數不要 設的太大。假如您將該指令的值配置爲比MinSpareServers小,Apache將會自動將其修改成"MinSpareServers+1"。
MaxClients   256
//限定同一時間客戶端最大接入請求的數量(單個進程併發線程數),默認爲256。任何超過MaxClients限制的請求都將進入等候隊列,一旦一個鏈接被釋放,隊列中的請求將得到服務。要增大這個值,您必須同時增大ServerLimit 。
MaxRequestsPerChild 10000
//每個子進程在其生存期內允許伺服的最大請求數量,默認爲10000.到達MaxRequestsPerChild的限制後,子進程將會結束。假如MaxRequestsPerChild爲"0",子進程將永遠不會結束。
將MaxRequestsPerChild配置成非零值有兩個好處:
1.能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。

worker.c模塊(支持混合的多線程多進程的多路處理模塊)
   worker MPM 使用多個子進程,每個子進程有多個線程。每個線程在某個確定的時間只能維持一個連接。通常來說,在一個高流量的HTTP服務器上,Worker MPM是個比較好的選擇,因爲Worker MPM的內存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,假如一個線程崩潰,整個進程就會連同其任何線程一起"死掉".由於線程共享內存空間,所以一個程式在運行時必須被系統識別爲"每 個線程都是安全的"。

# httpd.worker -l
Compiled in modules:
  core.c
  worker.c
  http_core.c
  mod_so.c

httpd默認情況是以prefork爲模塊的,要以work模型則需要編輯配置文件,打開httpd.worker模型

vim /etc/sysconfig/httpd
# The service must be stopped before changing this variable.
#
HTTPD=/usr/sbin/httpd.worker
#
# To pass additional options (for instance, -D definitions) to the
# httpd binary at startup, set OPTIONS here.
#
#OPTIONS=


ServerLimit   50
ThreadLimit   200
StartServers   5
MaxClients   5000
MinSpareThreads   25
MaxSpareThreads   500
ThreadsPerChild   100
MaxRequestsPerChild 0
ServerLimit 16
//服務器允許配置的進程數上限。這個指令和ThreadLimit結合使用配置了MaxClients最大允許配置的數值。任何在重啓期間對這個指令的改變都將被忽略,但對MaxClients的修改卻會生效。
ThreadLimit 64
//每個子進程可配置的線程數上限。這個指令配置了每個子進程可配置的線程數ThreadsPerChild上限。任何在重啓期間對這個指令的改變都將被忽略,但對ThreadsPerChild的修改卻會生效。默認值是"64".
StartServers 3
//服務器啓動時建立的子進程數,默認值是"3"。
MinSpareThreads 75
//最小空閒線程數,默認值是"75"。這個MPM將基於整個服務器監控空閒線程數。假如服務器中總的空閒線程數太少,子進程將產生新的空閒線程。
MaxSpareThreads 250
//配置最大空閒線程數。默認值是"250"。這個MPM將基於整個服務器監控空閒線程數。假如服 務器中總的空閒線程數太多,子進程將殺死多餘的空閒線 程。MaxSpareThreads的取值範圍是有限制的。Apache將按照如下限制自動修正您配置的值:worker需要其大於等於 MinSpareThreads加上ThreadsPerChild的和
MaxClients 400
//允許同時伺服的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候 隊列。默認值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,您必須同時增加 ServerLimit的值。
ThreadsPerChild 25
//每個子進程建立的常駐的執行線程數。默認值是25。子進程在啓動時建立這些線程後就不再建立新的線程了。
MaxRequestsPerChild 0
//配置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。假如MaxRequestsPerChild爲"0",子進程將永遠不會結束。
將MaxRequestsPerChild配置成非零值有兩個好處:
1.能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
注意
對於KeepAlive鏈接,只有第一個請求會被計數。事實上,他改變了每個子進程限制最大鏈接數量的行爲。
工作方式:
每個進程能夠擁有的線程數量是固定的。服務器會根據負載情況增加或減少進程數量。一個單獨的控制進程(父進程)負責子進程的建 立。每個子進程能夠建立 ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache總是試圖維持一個備 用(spare)或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。在Unix中,爲了能夠綁定80端口,父進程一般都是以 root身份啓動,隨後,Apache以較低權限的用戶建立子進程和線程。User和Group指令用於配置Apache子進程的權限。雖然子進程必須對 其提供的內容擁有讀權限,但應該儘可能給予他較少的特權。另外,除非使用了suexec ,否則,這些指令配置的權限將被CGI腳本所繼承。

(3)配置服務器支持長連接

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive ON       #將長連接選項打開keep

(4)加載模塊配置

# Example:
# LoadModule foo_module modules/mod_foo.so
#
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so


●主服務器

(1)站點目錄配置

#ServerName www.example.com:80  #主機名定義
DocumentRoot           #配置站點目錄
<Directory "">
</Directory>
<Location "URL">

(2)配置頁面文件訪問屬性

<Directory "FS_PATH">
   Option
      Indexes:是否允許索引頁面文件
</Directory>

注:在生產線上非下載站點,不允許使用索引頁面,非常的不安全

FollowSynlinks:是否跟隨鏈接文件:
SymlinksifOwnerMatch :
ExecCGI:是否運行執行CGI腳本;

(3)APACHE訪問控制

利用Apache實現訪問控制的配置指令包括如下3種.

1.Order指令

Order指令用於指定允許訪問控制或者拒絕訪問控制規則的順序。

Order只能設置爲“Order Allow,Deny"或Order Deny ,Allow",分別用來表明用戶先設置允許的訪問地址還是先設置禁止訪問的地址。

Order選項用於定義默認的訪問權限與Allow和Deny語句的處理順序,而Allow和Deny語句可以針對客戶機的域名或IP地址進行設置,以決定哪些客戶機能夠訪問服務器。

Order語句設置的兩種值的具體含義如下.

★Allow,Deny

默認禁止所有客戶機的訪問,且Allow語句在Deny語句之前被匹配。如果某條件即配Deny語句,又匹配Allow語句,則Deny語句會起作用(因爲Deny語句覆蓋了Allow語句)。

★Deny,Allow

默認允許所有客戶機訪問,且Deyn語句在Allow語句之前被匹配。如果某條件即匹配Deny語句,又匹配Allow語句,則Allow語句會起作用(因爲Allow語句覆蓋了Deny語句)。

2、Allow指令

Allow指令指明運行訪問的地址或地址序列。例如Allow from all指令表明允許所有IP來的訪問請求。

3、Deny指令

Deny指令指明禁止訪問的地址或地址序列。例如Deny from all指令表明禁止所有的IP來的範圍請求。

4、userdir配置讓每個用戶擁有自己的站點


<IfModule mod_userdir.c>
    #
    #
    UserDir disabled          #禁用
    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disabled" line above, and uncomment
    # the following line instead:
    #
    #UserDir public_html      #啓用

5、定義默認主頁面

DirectoryIndex   index.php index.jsp  index.html  #優先找到的話放在最左側

6、配置日誌功能

日誌有兩類,訪問日誌和錯誤日誌。

錯誤日誌:

ErrorLog logs/error_log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common                                      
LogFormat "%{Referer}i -> %U" referer                                             
LogFormat "%{User-agent}i" agent

訪問日誌

CustomLog logs/access_log combined
#
# Optionally add a line containing the server version and virtual host
# name to server-generated pages (internal error documents, FTP directory
# listings, mod_status and mod_info output etc., but not CGI generated詳細日誌:

7、設置虛擬目錄和目錄權限

要從主目錄以外的其他目錄中進行發佈,就必須創建虛擬目錄。虛擬目錄是一個爲於Apache主目錄外的目錄,它不包含在Apache主目錄中,但在訪問Web站點的用戶看來,它與位於主目錄中的子目錄是一樣的。每個虛擬目錄有一個別名,用戶在Web瀏覽器中可以通過此名來訪問虛擬目錄,如http://Server IP //Alias文件名,就可以訪問虛擬目錄下的任何文件裏。

使用Alias選項可以創建虛擬目錄,在主配置文件中,Apache默認已經創建了兩個虛擬目錄,這兩條語句分別建立了"/icons/"和“/manual"兩個虛擬目錄,它們對應的物理路徑分別是”/var/www/icons"和“/var/www/manual"兩個虛擬目錄,它們對用的物理路徑分別是”/var/www/icons/"和“/var/www/manual"

Alias /icons "/var/wwwicons/"
Alias /manual "/var/www/manual"

在實際使用過程中,用戶可以自己創建虛擬目錄,比如創建名爲/test的虛擬目錄,它所對應的路徑爲上面幾個例子中常用的/var/www/html/rhel5:


Alias  /test  "/var/www.html/rhel5"

如果需要對其機型進行權限設置,可以加入以下語句:

<Directory "/var/www/html/rhel5">
  AllowOverride  None
Options Indexes
Order allow,deny
Allow from all
</Directory>

8、腳本路徑別名,必須要裝載CGI模塊

  CGI:協議

ScriptAlias /PATH /PAHT/TO/SOMEDIR
CGI測試腳本
#!/bin/bash
cat <<EOF
Content-Type:test/html
<pre>
The hostname is: `/bin/hostname`.
The time is:`date`.
</pre>

9、認證和授權使用實例

(1)使用主配置文件配置用戶認證及授權

在本例中,用戶可以在Apache的主配置文件httpd.conf中加入以下語句,建立對目錄/var/www/html/rhel5訪問的用戶認證和授權機制:

<Directory ”/var/www/html/rhel5"
AllowOverride None
AuthType Basic
AuthName "rhel5"
AuthUserFile /etc/httpd/passwd_auth
Require user rhel5 cgweb
</Directory>

●AllowOveride:該選項定義了不使用htaccess文件

●AuthType Basic:AuthType 選項定義了對用戶實施認證的類型,最常用的是由mod_auth提供的Basic

●AuthName:定義了Web瀏覽器顯示輸入用戶/密碼對話框時的領域內容。

●AuthUserFile:定義了口令文件的路徑,即使用htpasswd建立的口令文件。

●Require user:定義了允許那些用戶訪問,各用戶之間用空格分開。

需要注意的是,在AuthFile選項定義中,還要使用語句事先建立認證用戶rhel5和cgweb,該選項中的定義才能生效。

具體語句如下:

#htpasswd -c /etc/httpd/passwd_auth rhel5
#htpasswd -c /etc/httpd/passwd_auth cgweb

(2)使用.htaccess文件配置用戶認證和授權

在本例中,爲了完成如上述例子統一的功能,需要先在主配置文件中加入以下語句:

<Directory "/var/www/html/rhel5">
AllowOverride AuthConfig
</Directory>

上述語句中的AllowOverride選項允許在.htaccess文件中使用認證和授權指令。

然後,在.htaccess文件中添加以下語句即可:


AuthType Basic
AuthName "Please Login:"
AuthUserFile /etc/httpd/passwd_auth
Require user rhel5 cgweb

在AuthUserFile選項定義中,也要使用如下語句事先建立認證用戶rhel5和cgweb,該選項中定義才能生效:

#htpasswd -c /etc/httpd/passwd_auth rhel5
#htpasswd /etc/httpd/passwd_authcgweb

●虛擬主機

虛擬主機和主服務器不能同時使用,關閉主服務器,首先註釋掉DocumentRoot主目錄

(1)基於端口的虛擬主機

<VirtualHost 192.168.2.221:80>
  ServerName 123.com
  DocumentRoot "/web/host1"
  DirectoryIndex index.html
</VirtualHost>
<VirtualHost 192.168.2.221:8080>
  ServerName 456.com
  DocumentRoot "/web/host2"
  DirectoryIndex index.html
</VirtualHost>

(2)基於IP地址的虛擬主機

<VirtualHost 192.168.2.221:80>
  ServerName 123.com
  DocumentRoot "/web/host1"
  DirectoryIndex index.html
</VirtualHost>
<VirtualHost 192.168.2.225:80>
  ServerName 456.com
  DocumentRoot "/web/host2"
  DirectoryIndex index.html
</VirtualHost>

(3)基於主機名的虛擬主機。首先開啓NameVirtualHost 192.168.2.221:80

<VirtualHost 192.168.2.221:80>
  ServerName www.abc.com
  DocumentRoot "/web/host1"
  DirectoryIndex index.html
</VirtualHost>
<VirtualHost 192.168.2.225:80>
  ServerName www.cba.org
  DocumentRoot "/web/host2"
  DirectoryIndex index.html
</VirtualHost>

在主機hosts中綁定這兩個域名,用elinks測試

[root@node1 ~]# elinks -dump http://www.abc.com
     node1
[root@node1 ~]# elinks -dump http://www.cba.org
     node2



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章