Httpd 2.2常見配置 要配置http服務的配置文件,先備份一下,養成良好習慣,如果誤操作導致http服務起不來,就可以將備份的主配置文件重新覆蓋一下 httpd配置文件的組成:有三大部分組成,其實配置文件裡面的內容放的順序沒有規定,之所以把它劃分為三部分是為了查看更加清晰 # grep "Se... ...
Httpd 2.2常見配置
要配置http服務的配置文件,先備份一下,養成良好習慣,如果誤操作導致http服務起不來,就可以將備份的主配置文件重新覆蓋一下
httpd配置文件的組成:有三大部分組成,其實配置文件裡面的內容放的順序沒有規定,之所以把它劃分為三部分是為了查看更加清晰
# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment 全局配置
### Section 2: 'Main' server configuration 主伺服器配置
### Section 3: Virtual Hosts 虛擬主機
瞭解http服務的配置文件是學好http服務的基礎,下麵我們就一起來看一下http服務的配置文件有哪些功能
在啟動http服務時,總會有一些錯誤,如圖:
vim /etc/httpd/conf/httpd.conf,進入到配置文件之後搜索ServerName,然後按照格式隨便添加一個功能變數名稱就行了
2、顯示伺服器版本信息
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
This setting applies to the entire server and cannot be enabled or disabled on a virtualhost-by-virtualhostbasis.
After version 2.0.44, this directive also controls the information presented by the ServerSignaturedirective.
建議使用:ServerTokens Prod,這時因為別人可以通過遠程來查看你的伺服器版本信息,知道了你的伺服器版本信息,就可以針對你的伺服器版本來攻擊你,使用了Prod,就會隱藏你的伺服器版本信息
curl -I 192.168.10.135 可以顯示伺服器版本信息
vim /etc/httpd/conf/httpd.conf,進入到配置文件後,搜索ServerTokens,如圖:
改完之後,在重新載入配置文件,service httpd reload,再次查看伺服器版本信息
3.修改監聽的IP和Port
在httpd服務的配置文件當中,監聽的埠預設為80埠,你也可以人為的修改埠,比如修改成9527埠
重新載入httpd服務service httpd reload,再查看一下埠號ss -ntl
沒有80埠,此時監聽http服務的是9527埠,此時你在訪問時就要指定埠號了,不然會訪問失敗
當然你也可以將改埠號綁定在指定的本機IP地址上,不指定就預設綁定在本機的所有IP地址上,如圖:將80埠綁定在本機的192.168.10.135上,將9527埠綁定在172.17.0.182上
這樣別人訪問時就必須指定埠號了,因為192.168.10.135綁定在80埠上,不指定就預設為80埠,所以能訪問成功,而172.17.0.182綁定在9527埠上,這時你不指定就不能訪問了
4.持久連接
Persistent Connection:連接建立,每個資源獲取完成後不會斷開連接,而是繼續等待其它的請求完成,預設關閉持久連接
副作用:對併發訪問量較大的伺服器,持久連接功能會使用有些請求得不到響應
如果不配置http服務配置文件的話,預設只能訪問一個資源,就斷開連接
在http服務配置文件將KeepAlive off改為KeepAlive on
5、MPM(Multi-Processing Module)多路處理模塊
httpd-2.2不支持同時編譯多個模塊,所以只能編譯時選定一個;rpm安裝的包提供三個二進位程式文件,分別用於實現對不同MPM機制的支持
預設為/usr/sbin/httpd, 即prefork模式
/usr/lib64/httpd/modules/動態模塊路徑
StartServers 8 開啟的伺服器(表現為開啟了http服務,運行了8個httpd主程式)
MaxRequestsPerChild 4000 子進程最多能處理的請求數量。在處理MaxRequestsPerChild 個請求之後,子進程將會被父進程終止,這時候子進程占用的記憶體就會釋放(為0時永遠不釋放)
將來開啟了http服務就會運行4個httpd.worker程式,每個主程式包含25個線程,所以總共有100個線程,但是支持最多的空閑線程只有75個,所以要殺死一個httpd.worker程式,所以當你開啟了http服務,就只有3個httpd.worker程式運行
ab -c 100 -n 1000 http://192.168.10.135/a.jpg總共1000個請求訪問a.jpg,併發同時能夠訪問100個,註意:訪問的頁面儘量大一些,不然無法測試性能
經過幾次測試,prefork每秒能夠處理的次數大約為520次
經過幾次測試,worker每秒能夠處理的請求次數大約為512次
6、DSO:Dynamic Shared Object(動態共用對象)
LoadModule<mod_name> <mod_path>
http服務要實現一個功能,要看他的模塊是否載入,在http服務的配置文件中,如果你把某個模塊給註釋掉,然後再重啟http服務,那麼http服務就沒有了這個模塊所對應的功能,例如:我將modules/mod_auth_basic.so這個模塊給註釋掉,如圖:
重啟服務,再查看所有的動態和靜態模塊就查不到了,http服務就沒有這個basic驗證的功能了
7、定義'Main' server的文檔頁面路徑
http://HOST:PORT/test/index.html
預設是/var/www/html,如圖我將預設的路徑給註釋掉,更改為/app/data
然後再/app/data目錄下建一個index.html,再在裡面寫點東西
在重啟服務,再來訪問,訪問的頁面就是在/app/data下編輯的index.html的內容,不是/var/www/index.html的內容了
8、定義站點主頁面
DirectoryIndex index.html index.html.var
訪問站點的主頁面先找index.html,再找index.html.var如果都找不到,就會訪問一個錯誤頁面
為什麼會返回一個錯的頁面呢,這是因為在另外一個配置文件/etc/httpd/conf.d/welcome.conf做了配置
vim /etc/httpd/conf.d/welcome.conf
我在根目錄下麵建一個子目錄bbs,裡面創建一個index.html文件,並寫上內容
如果把bbs裡面的index.html文件改個名a.html,再次去訪問,竟然顯示站點的文件列表,這樣是很危險的
所以應該在http伺服器的根目錄下麵以及其下麵的子目錄都建一個index.html或者index.html.tar文件,以防止這種現象出現
9.站點訪問控制常見機制
<FilesMatch "\.(gif|jpe?g|png)$">正則表達式
<Files "?at.*"> 通配符,?是任意的一個字元,.就是點,*是任意字元串
<LocationMatch "/(extra|special)/data"> URL
10、<Directory>中"基於源地址"實現訪問控制
(1) Options:後跟1個或多個以空白字元分隔的選項列表
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶
FollowSymLinks:允許訪問符號鏈接文件所指向的源文件
1.更改根目錄的許可權,對某個用戶設置acl許可權,或者設置根目錄下文件的許可權來實現訪問控制
註意:設置acl許可權是對apache用戶設置,因為訪問資源是通過apache用戶來訪問的
2.也可以在主配置文件里配置,也可以在子配置文件中配置,為了方便管理,在子配置文件中配置/etc/httpd/conf.d/*.conf
在/etc/httpd/conf.d/目錄下隨便創建一個以conf為結尾的配置文件,這就是http服務的子配置文件,假如說創建一個test.conf文件
vim /etc/httpd/conf.d/test.conf
如果什麼都不加,就預設能夠訪問軟鏈接,和不能子目錄下的索引,也就是子目錄的文件列表(在子目錄下沒有index.html或者index.html.tar的情況下)
現在我想要拒絕能夠訪問軟鏈接和拒絕顯示子目錄下的索引,如圖,也可以寫成options none,不加-允許
重啟服務,這樣別人就不能訪問你的軟鏈接和子目錄的索引了,而且根目錄的子目錄會繼承父目錄的配置,所以別人也不能訪問子目錄里的軟鏈接和子目錄下的子目錄索引
bbs是根目錄下的子目錄,bbs目錄中沒有index/html和index.html.tar,也不能訪問目錄的索引
bbs1是bbs的子目錄,並且裡面沒有index.html或者index.html.tar,也不能訪問bbs1的索引
也可以單獨對根目錄下的子目錄進行配置,讓其不繼承對根目錄的配置
與訪問控制相關的哪些指令可以放在指定目錄下的.htaccess(由AccessFileName指定)文件中,覆蓋之前的配置指令
AllowOverride None:.htaccess 文件無效
AllowOverride AuthConfig Indexes除了AuthConfig 和Indexes的其它指令都無法覆蓋
註意:.htaccess這個文件必須在你所做了訪問控制的目錄里創建,如圖:我對/app/data做了訪問控制,所以要在/app/data下創建.htaccess覆蓋之前的訪問控制指令
vim /app/data/.htaccess在這個文件里設置配置指令來覆蓋之前的配置指令,如圖:拒絕了訪問子目錄的索引和訪問軟鏈接
(3)order和allow、deny(HTTP2.4版本已經取消,使用別的方法代替)
vim /etc/htpd/conf.d/test.conf
允許和拒絕的毫無關係,所以order後面的allow和deny次序無所謂,允許192.168.10.188訪問,拒絕192.168.10.200訪問
允許的包括拒絕的,因為order後面deny在最後,所以拒絕的生效,允許192.168.10.0/24這個網段里的所有IP地址訪問,但除了192.168.10.200
允許的包括拒絕的,因為order後面allow放在最後,所以允許的生效,允許192.168.10.0/24這個網段里的所有IP地址訪問
11.日誌設定
debug, info, notice, warn,error
定義日誌格式:LogFormatformat strings
LogFormat"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
參考幫助:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%l 遠程用戶,啟用mod_ident才有效,通常為減號"-"
%u 驗證(basic,digest)遠程用戶,非登錄訪問時,為一個減號"-"
•%r First line of request,即表示請求報文的首行;記錄了此次請求的"方法","URL"以及協議版本
•%b 響應報文的大小,單位是位元組;不包括響應報文http首部
•%{Referer}i 請求報文中首部"referer"的值;即從哪個頁面中的超鏈接跳轉至當前頁面的
•%{User-Agent}i 請求報文中首部"User-Agent"的值;即發出請求的應用程式
12、設定預設字元集
設置指定的字元集(預設是UTF-8),修改http服務的配置文件
12、定義路徑別名
http://www.magedu.com/download/bash.rpm
==>/www/htdocs/download/bash.rpm
http://www.magedu.com/download/bash.rpm
http://www.magedu.com/images/logo.png
==>/www/htdocs/images/logo.png
定義路徑別名:假如我訪問根目錄下的bbs就給你跳轉到/app/bbsdir下的主頁面
1.在/app下建一個目錄bbsdir,在這個目錄下創一個主頁面文件index.html
echo /app/bbdir > /app/bbsdir/index.html
vim /etc/httpd/conf.d/test.conf
alias /bbs /app/bbsdir (註意這裡的/bbs是相對路徑,相對於/var/www/html)
3.訪問根目錄下的bbs,如圖:確實跳轉到了/app/bbsdir目錄下的主頁面
14、基於用戶的訪問控制
認證質詢:WWW-Authenticate:響應碼為401,拒絕客戶端請求,並說明要求客戶端提供賬號和密碼
認證:Authorization:客戶端用戶填入賬號和密碼後再次發送請求報文;認證通過時,則伺服器發送響應的資源
安全域:需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便於告知用戶認證的原因
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...