一、 httpd文件的基本格式
主配置文件位置, /etc/httpd/conf/httpd.conf
1. 配置文件參數格式
配置參數 值
特點:
配置指令不區分字符大小寫
值可能區分大小寫
有些指令可以重復出現多次
例如: Listen [IP:] 80
2. 配置文件格式包含三部分
全局配置
主機配置:適用于主機只提供一個站點
虛擬主機:用于提供多個站點
3. 配置文件語法測試:
# service httpd configtest # httpd -t 大多數配置修改后可以直接通過service httpd reload來生效, 如果修改了監聽地址或端口,必須重啟服務才能生效;
二、 各項配置參數
1. Listen [IP:]port
次指令可以出現多次,用來指定多個不同套接字 Listen 80 只所有ip的80端口 Listen 172.16.100.7:8080
2. 配置使用keep alive
KeepAlive {On|Off} KeepAliveTimeout 2 # 保持連接時長 MaxKeepAliveRequests 50 # 最大請求數
3. MPM模塊相關配置
<IfModule prefork.c> StartServers: 默認啟動的工作進程數; MinSpareServers: 最少空閑進程數; MaxSpareServers: 最大空閑進程數; ServerLimit: 最大活動進程數;正在被請求的 MaxClients: 并發請求的最大數;一定大于ServerLimit MaxRequestsPerChild: 每個子進程在生命周期內所能夠服務的最多請求個數; </IfModule> <IfModule worker.c> StartServers:啟動的子進程的個數 MaxClients: 并發請求的最大數; MinSpareThreads:最小空閑線程數; MaxSpareThreads:最大空閑線程數; ThreadsPerChild:每個子進程可生成的線程數; MaxRequestsPerChild:每個子進程在生命周期內所能夠服務的最多請求個數,0表示不限定; </IfModule> 注:httpd-2.2.15 不支持event 模塊
4. DSO模塊加載方式
LoadModule foo_module modules/mod_foo.so ## 如果是使用相對路徑,則為相對于ServerRoot所定義的位置而言,如果取消裝載,直接在配置文件中把這一行取消 例子:LoadModule auth_digest_module modules/mod_auth_digest.so httpd -M 列出已經裝載的所有DSO以及非DSO模塊 Loaded Modules: core_module (static) mpm_prefork_module (static) http_module (static) so_module (static) auth_basic_module (shared) httpd -l 列出支持的非DSO模塊(比如已經編譯進入主程序的) Compiled in modules: core.c # 核心模塊 prefork.c # 編譯時,有且只有一個模型 http_core.c # http核心模塊 mod_so.c # 實現模塊裝卸
實際上,在sbin下有三個httpd程序,分別為httpd, httpd.worker, http.event, 分別編譯進入了prefork, worker, event 模塊, 默認使用httpd也就是prefork。如果需要修改可以
把服務腳本配置文件/etc/sysconfig/httpd 中的
#HTTPD=/usr/sbin/httpd.worker
取消注釋,或者改成其他位置
5. 配置站點根目錄,配置文件中修改
DocumentRoot /path/to/somewhere ## 這里配置新網頁文件目錄 ,除此之外還需要修改新目錄的屬性,在以下容器中修改
6. 配置頁面訪問屬性
<Direcotry "/path/to/somewhere"> Options: Indexes: 缺少指定的默認頁面時,允許將目錄中的所有文件以列表形式返回給用戶;危險; FollowSymLinks: 允許跟隨符號鏈接所指向的原始文件;危險 None: 所有都啟用; All: 所有都啟用; ExecCGI: 允許使用mod_cgi模塊執行CGI腳本; Includes: 允許使用mod_include模塊實現服務器端包含(SSI); MultiViews:允許使用mod_negotiation實現內容協商; SymLinksIfOwnerMatch:在鏈接文件屬主屬組與原始文件的屬主屬組相同時,允許跟隨符號鏈接所指向的原始文件; <Directory>
7. 基于主機的訪問控制
<Direcotry "/path/to/somewhere"> Options AllowOverride None ## 下面基于IP的訪問機制是否被禁用,None是不禁用 Order Deny,Allow # 后面為默人 Allow from <網段或地址> #允許 Deny from <網段或地址> # 不允許 <Directory> 最佳匹配機制: 二者都匹配時或者二者都不匹配時以后者默認為準,否則以匹配到的為準
8. 定義默認主頁面, 從左向右尋找,知道找到位置,默認為index.html
DirectoryIndex index.php index.html home.html default.html
9、用戶目錄
如果期望讓每個用戶都可以創建個人站點:http://Server_IP/~Username/
userdir disablied: 禁止 userdir public_html
public_html是用戶家目錄下的目錄名稱,所有位于此目錄中的文件均可通過前述的訪問路徑進行訪問
用戶的家目錄得賦予運行httpd進程的用戶擁有(進入)執行權限;
10、配置日志功能
/var/log/httpd/ access.log: 訪問日志,其需要記錄的內容需要自定義 error.log: 錯誤日志
訪問日志: CustomLog "/path/to/access_log_file" Format_Name ## 配置指令,定義日志文件的指令 LogFormat Format_String Format_Name ## 配置指令, 定義日志格式 %h: 客戶端地址 %l: 遠程登錄名,通常為- %u: 認證時的遠程用戶名,沒有認證時為- %t: 收到請求時的時間; %r: 請求報文的起始行; %>s: 響應狀態碼; %b: 響應報文的長度,單位為字節 %{Header_Name}i: 記錄指定請求報文首部的內容(value); 實例: 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
詳情請參考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
錯誤日志:
ErrorLog
11. 路徑別名
Alias /alias/ "/path/to/somewhere/" ##前面加“/”后面也要加,否則都不加 意味著訪問http://Server_IP/alias/時,其頁面文件來自于/path/to/somewhere這個位置
12. 設定默認字符集,默認為UTF-8,字符集和網頁不匹配,訪問時為亂碼
AddDefaultCharset UTF-8
13. CGI腳本路徑別名
路徑別名: URL –> fileSystem URL文件系統某位置的映射
CGI腳本路徑別名: URL –> 腳本存放路徑
CGI(Common Gateway Interface): 允許網頁訪問在特定目錄下執行一些腳本,shell腳本依賴系統命令,有時需要UID和GID, 這也造成了安全隱患。
PHP,python 等腳本語言也是用類似的協議,但是由于有自己庫,可以避免依賴系統庫。
控制CGI腳本路徑別名的模塊: mod_alias, mod_cgi
在/etc/httpd/conf/httpd.conf 配置
ScriptAlias /URL/ "/path/to/somewhere/" 實例 ## 配置文件中配置 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" ## 在/var/www/cgi-bin/ 下面創建測試腳本,如下,并給執行權限 #!/bin/bash # cat << EOF Content-Type: text/html <pre> The hostname is: `hostname`. The time is: `date`. </pire> EOF ## 為了測試方便,關閉虛擬機的iptables,用宿主機訪問192.168.233.128/cgi-bin/test.sh, 的到如下結果,說明測試成功
14. 基于用戶的訪問控制
虛擬用戶: 由于安全需要,服務器的訪問用戶,并不是系統真正的用戶。
虛擬用戶信息的存放方式:
文件: 例如,/etc/httpd/conf/.htpasswd
SQL數據庫, dbm, ldap 等。
認證相關的模塊:
認證類型: auth*
1.basic 基本認證, 用戶名和密碼為明文傳輸 LoadModule auth_basic_module modules/mod_auth_basic.so 2. 摘要認證,用戶名和密碼哈希編碼后傳輸 LoadModule auth_digest_module modules/mod_auth_digest.so
認證提供者(authentication provider):賬號和密碼的存放位置, authn*
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 LoadModule authn_dbm_module modules/mod_authn_dbm.so
認證授權機制(authentication): 根據什么進行授權
LoadModule authz_host_module modules/mod_authz_host.so ## 主機 LoadModule authz_user_module modules/mod_authz_user.so ## 用戶名 LoadModule authz_owner_module modules/mod_authz_owner.so ## 文件屬主 LoadModule authz_groupfile_module modules/mod_authz_groupfile.so ## 用戶組
舉例:
1) 基于文件,作基本認證,基于用戶名密碼
## 創建/var/www/html/fin 文件夾,并在里面創建index.html 加入簡單內容, 這個文件夾將被保護 ## 在配置文件中添加 <Directory "/var/www/html/fin"> Options None AllowOverride AuthConfig ## 明確指出覆蓋前面設置的用戶訪問控制,使用用戶認證進行控制 AuthType Basic ## 認證類型為基本認證 AuthName "Private Area" ## 瀏覽器彈出的質詢框上面的說明 AuthBasicProvider file ## 基于文件認證 AuthUserFile /etc/httpd/conf/.htpasswd ## 認證文件的存放位置 Require valid-user </Directory> ## 使用使用htpasswd命令生成認證庫 -c: 創建文件,創建第一個用戶時使用 ## 只有第一次創建文件時需要這個選項,以后追加不需要,否則會被覆蓋 -m: 密碼基于MD5編碼存儲 ## 使用MD5碼進行編碼 # htpasswd -c -m /etc/httpd/conf/.htpasswd tom New password: Re-type new password: Adding password for user tom # htpasswd -m /etc/httpd/conf/.htpasswd jerry New password: Re-type new password: Adding password for user jerry
2)基于用戶組
<Directory "/var/www/html/fin"> Options None AllowOverride AuthConfig AuthType Basic AuthName "Private Area" AuthBasicProvider file AuthUserFile /etc/httpd/conf/.htpasswd AuthGroupFile /etc/httpd/conf/.htgroup Require group GroupName </Directory> 組文件:組文件格式 組名: 用戶1 用戶2 用戶3
15. 虛擬主機
一個物理服務器提供多個站點; 使用虛擬主機得先取消中心主機 Web: Socket(IP, port) 1) 基于不同的IP實現不同的虛擬主機 變化IP 2) 基于不同的port實現不同的虛擬主機 變化port 3) 基于不同的FQDN實現不同的虛擬主機 : httpd 的請求首部中的host, 來確定訪問的那個主機,如果用戶用ip地址請求,則自上而下一次匹配 變化ServerName的值 httpd 2.2.2 需要啟用 NameVirtualHost *:80, 而且下IP:port需要一致 使用前,要取消掉中心主機,然后開啟virualhost 容器 <virtualhost IP:port> ServerName DocumentRoot "" <Directory ""> Options </Directory> ServerAlias ServerAdmin </virtualhost> 關閉中心主機極為,把全局的 DocumentRoot 注釋掉
虛擬主機的單獨配置:
1)用戶認證
2)訪問日志
3)錯誤日志
4)別名
5)腳本別名
實例:
## 注釋掉中心主機 DcumentRoot指令 #DocumentRoot "/var/www/html" 1) 基于IP的虛擬主機 <VirtualHost 192.168.233.128:80> DocumentRoot /var/www/a.com ServerName www.a.com </VirtualHost> <VirtualHost 172.25.136.56:80> DocumentRoot /var/www/b.com ServerName www.b.com </VirtualHost> ## 創建/var/www/b.com 和 /var/www/a.com 兩個目錄,并且創建簡單的測試首頁,index.html # mkdir /var/www/b.com && echo "hello " > /var/www/index.html # mkdir /var/www/a.com && echo "hello > /var/www/index.html ## reload 配置文件 # service httpd reload ## 使用elinks 測試,注意,要給自己主機設置兩個端口,與配置文件容器中的相匹配 # elinks --dump 192.168.233.128 hello! www.a.com # elinks --dump 172.25.136.56 hello www.b.com 2) 基于端口實現虛擬主機 ## 修改配置文件保證,httpd監聽在需要的端口上,這里設置為80 和 8080 Listen 80 Listen 8080 ## 同樣要注釋掉原主機,然后添加虛擬主機容器 <VirtualHost 192.168.233.128:80> DocumentRoot /var/www/a.com ServerName www.a.com </VirtualHost> <VirtualHost 192.168.233.128:8080> DocumentRoot /var/www/b.com ServerName www.b.comon </VirtualHost> ## 由于改變了端口,所以需要重啟服務 # service httpd restart ## 同樣使用elink 測試 # elinks --dump 192.168.233.128:8080 hello www.b.com # elinks --dump 192.168.233.128:80 hello! www.a.com 3)基于不同主機名,添加虛擬主機 ## 在/etc/hosts 文件同一條IP添加兩個解析結果 192.168.233.128 www.a.com 192.168.233.128 www.b.com ## 在2.2.2 版本中要啟動 NameVirtualHost 項, 并保證內容和下面容器中的ip和端口寫法一致 NameVirtualHost 192.168.233.128:80 ## 修改配置文件, 添加虛擬主機容器 <VirtualHost 192.168.233.128:80> DocumentRoot /var/www/a.com ServerName www.a.com </VirtualHost> <VirtualHost 192.168.233.128:80> DocumentRoot /var/www/b.com ServerName www.b.com </VirtualHost> ## 重新加載配置文件 # service httpd reload ## 測試 # elinks --dump www.a.com hello! www.a.com # elinks --dump www.b.com hello www.b.com
原創文章,作者:以馬內利,如若轉載,請注明出處:http://www.www58058.com/4052
馬內利出品,必屬精品
@stanley:囧。。。。。。
prefork 配置那里
MaxClients: 并發請求的最大數;一定大于ServerLimit
不是大于 是 小于
ServerLimit一定要大于等于MaxClients
@YUANWOW:哦哦 對哦,我給寫反了好像。當時沒仔細看,多謝指出 !