HTTP-2.2
httpd 配置文件的組成:
grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式:
directive value
directive:不區分字符大小寫
value:爲路徑時,是否區分大小寫,取決於文件系統
httpd2.2程序環境
rpm -ql httpd
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf.d
/etc/httpd/logs
/etc/httpd/modules
/etc/httpd/run
/etc/logrotate.d/httpd
/etc/rc.d/init.d/htcacheclean
/etc/rc.d/init.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
/usr/lib64/httpd
/usr/lib64/httpd/modules
/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
/usr/sbin/httxt2dbm
/usr/sbin/rotatelogs
/usr/sbin/suexec
/usr/share/doc/
/usr/share/man/man8/
/var/cache/mod_proxy
/var/lib/dav
/var/log/httpd
/var/run/httpd
/var/www
/var/www/cgi-bin
/var/www/error
/var/www/html
/var/www/icons
服務腳本:/etc/rc.d/init.d/httpd
配置文件:
/etc/sysconfig/httpd
/etc/httpd/conf/httpd.conf
服務控制和啓動:
chkconfig httpd on|off
service {start|stop|restart|status|configtest|reload} httpd
站點網頁文檔根目錄:
/var/www/html
模塊文件路徑 :
/etc/httpd/modules
/usr/lib64/httpd/modules
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event
主進程文件 :
/etc/httpd/run/httpd.pid
日誌文件目錄:
/var/log/httpd
access_log: 訪問日誌
error_log :錯誤日誌
幫助文檔包:
httpd-manual
3)http協議
http 協議
http/0.9, http/1.0, http/1.1, http/2.0
stateless 無狀態,服務器沒法持續追蹤訪問者來源
解決http 協議無狀態方法
cookie 客戶端存放
session 服務端存放
http 事務:一次訪問的過程
請求:request
響應:response
協議查看或分析的工具:
tcpdump
wireshark
tshark
1》顯示服務器版本信息
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
建議使用 ServerTokens Prod
2》修改監聽的IP 和Port
Listen [IP:]PORT
省略IP表示爲0.0.0.0
Listen 指令至少一個,可重複出現屢次
Listen 80
Listen 8080
修改監聽socket ,重啓服務進程方可生效
3》持久鏈接
Persistent Connection:鏈接創建,每一個資源獲取完成後不會斷開鏈接,而是繼續等待其它的請求完成,默認關閉持久鏈接。
斷開條件:數量限制爲100
時間限制:以秒爲單位,httpd-2.4支持毫秒級
反作用:對併發訪問量較大的服務器,持久鏈接功能會使有些請求得不到響應
折衷:使用較短的持久鏈接時間
設置:
KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
測試:telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
4》MPM(multi-processing module)多路處理模塊。
prefork, worker, event(試驗階段)
httpd-2.2不支持同時編譯多個模塊,因此只能編譯時選定一個。
rpm 安裝的包提供三個二進制程序文件,分別用於實現對不一樣MPM機制的支持。
1。確認方法:
ps aux | grep httpd
默認爲/usr/sbin/httpd, 即prefork
2。查看靜態編譯的模塊
httpd -l
3。查看靜態編譯及動態裝載的模塊
httpd –M
4。動態模塊加載時,不需重啓即生效。
5。動態模塊路徑
/usr/lib64/httpd/modules/
6。更換使用的httpd程序:
vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
重啓服務生效
pstree -p|grep httpd 查看進程和線程
7。Httpd 2.4與之不一樣
以動態模塊方式提供
配置文件:/etc/httpd/conf.modules.d/00-mpm.conf
httpd –M |grep mpm
重啓服務生效
pstree -p|grep httpd 查看進程和線程
8。prefork的默認配置
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256 最多進程數, 最大20000
MaxClients 256 最大併發
MaxRequestsPerChild 4000 子進程最多能處理的請求數量,在處理MaxRequestsPerChild個請求以後, 子進程將會被父進程終止,這時候子進程佔用的內存就會釋放( 爲0時永遠不釋放)
</IfModule>
9。worker的默認配置
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0 無限制
</IfModule>
5》DSO:Dynamic Shared Object
加載動態模塊配置
vim /etc/httpd/conf/httpd.conf
配置指定實現模塊加載格式:
LoadModule <mod_name> <mod_path>
模塊文件路徑可以使用相對路徑,相對於ServerRoot,默認/etc/httpd
示例:
LoadModule auth_basic_module modules/mod_auth_basic.so
6》定義'Main' server 的文檔頁面路徑
DocumentRoot 「/path」
文檔路徑映射:
DocumentRoot 指向的路徑爲URL 路徑的起始位置
示例:
DocumentRoot "/app/data「
http://HOST:PORT/test/index.html --> /app/data/test/index.html
注意:SELinux 和iptables
7》定義站點主頁面
DirectoryIndex index.html index.html.var
8》站點訪問控制常見機制
可基於兩種機制指明對哪些資源進行何種訪問控制。
訪問控制機制有兩種,分別是客戶端來源地址,用戶帳號
文件系統路徑:
<Directory 「/path">
...
</Directory>
<File 「/path/file」>
...
</File>
<FileMatch "PATTERN">
...
</FileMatch>
URL 路徑:
<Location "">
...
</Location>
<LocationMatch "">
...
</LocationMatch>
示例:
<FilesMatch "\.(gif|jpe?g|png)$">
<Files 「?at.*」> 通配符
<Location /status>
<LocationMatch "/(extra|special)/data">
9》<Directory> 中「基於源地址」實現訪問控制
(1) Options:
後跟1個或多個以空白字符分隔的選項列表,在選項前的+ ,- 表示增長或刪除指定選項。
常見選項:
Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶。
FollowSymLinks:容許訪問符號連接文件所指向的源文件
None:所有禁用
All:所有容許
示例:
<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options FollowSymLinks
</Directory>
<Directory /web/docs>
Options Indexes FollowSymLinks
</Directory>
<Directory /web/docs/spec>
Options +Includes -Indexes
</Directory>
(2) AllowOverride:
與訪問控制相關的哪些指令能夠放在指定目錄下的.htaccess (由AccessFileName 指定)文件中,覆蓋以前的配置指令,但只對<directory> 語句有效。
AllowOverride All:全部指令都有效
AllowOverride None:.htaccess 文件無效
AllowOverride AuthConfig Indexes:除了AuthConfig和Indexes的其餘指令都沒法覆蓋
(3) order和allow 、deny
order:定義生效次序,寫在後面的表示默認法則生效。
Order allow,deny
Order deny,allow
Allow from
Deny from
allow.denv deny.allow
only allow yes yes
only deny no no
both no yes
none no yes
來源地址:
IP
網絡:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
(4)示例:
<files "*.txt">
order deny,allow
deny from 172.16. 100.100
allow from 172.16
</files>
<files "*.txt">
order allow,deny
deny from 172.16.100.100
allow from 172.16
</files>
10》日誌設定
1。日誌類型:
訪問日誌
錯誤日誌
2。錯誤日誌:
ErrorLog logs/error_log
LogLevel warn
loglevel 可選值:
debug, info, notice,warn,error,crit,alert,emerg
3。訪問日誌:
定義日誌格式:
LogFormat format 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
%h 客戶端IP地址
%l 遠程用戶,啓用mod_ident纔有效,一般爲減號「-」
%u 驗證(basic ,digest )遠程用戶, 非登陸訪問時,爲一個減號「-」
%t 服務器收到請求時的時間
%r 即表示請求報文的首行,記錄了這次請求的「方法」,"URL"以及協議版本
%>s 響應狀態碼
%b 響應報文的大小,單位是字節,不包括響應報文http 首部
%{Referer}i 請求報文中首部「referer」的值;即從哪一個頁面中的超連接跳轉至當前頁面的
%{User-Agent}i 請求報文中首部「User-Agent」的值,即發出請求的應用程序
11》設定默認字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030:wq
12》定義路徑別名
格式:Alias /URL/ "/PATH/"
DocumentRoot "/www/htdocs"
http://www.m.com/download/bash.rpm ==>/www/htdocs/download/bash.rpm
Alias /download/ "/rpms/pub/"
http://www.m.com/rpms/pub/bash.rpm ==>/www/htdocs/download/bash.rpm
13》基於用戶的訪問控制
1。認證質詢:響應碼爲401,拒絕客戶端請求,並說明要求客戶端提供帳號和密碼
2。認證:客戶端用戶填入帳號和密碼後再次發送請求報文,認證經過時,則服務器發送響應的資源
3。認證方式兩種:
basic:明文
digest:消息摘要認證, 兼容性差
4。安全域:須要用戶認證後方能訪問的路徑,應該經過名稱對其進行標識,以便於告知用戶認證的緣由。
5。用戶的帳號和密碼
虛擬帳號:僅用於訪問某服務時用到的認證標識
存儲:文本文件,SQL 數據庫,ldap 目錄存儲,nis等
6。basic 認證配置示例:
(1)定義安全域
<Directory 「/path">
Options None
AllowOverride None
AuthType Basic
AuthName "Warning!「:隨意寫
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
</Directory>
Require valid-user:全部位於AuthUserFile文件中定義的用戶都容許登陸訪問。
Require user user1 user2...:僅容許user1,user2等出現AuthUserFile文件中定義的特定幾個用戶登陸,這些用戶爲虛擬用戶,即非系統用戶。
(2) 提供帳號和密碼存儲(文本文件)
使用專用命令完成此類文件的建立及用戶管理
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
-c :自動建立文件,僅應該在文件不存在時使用
-m :md5 格式加密
-s: sha 格式加密
-D :刪除指定用戶
7。基於組帳號進行認證
(1)定義安全域
<Directory 「/path">
AuthType Basic
AuthName "String「
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/HTTPD_GROUP_FILE"
Require group grpname1 grpname2 ...
</Directory>
(2)建立用戶帳號和組帳號文件;
組文件:每一行定義一個組
GRP_NAME: username1 username2 ...
示例:
<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmins
</Directory>
vim /etc/httpd/conf.d/.htgroup
webadmins:wang mage
(3)遠程客戶端和用戶驗證的控制
Satisfy ALL|Any
ALL 客戶機IP和用戶驗證都須要經過才能夠
Any 客戶機IP和用戶驗證, 有一個知足便可
示例:
Require valid-user
Order allow,deny
Allow from 192.168.1
Satisfy Any
14》虛擬主機
1。站點標識:socket
IP 相同,但端口不一樣
IP 不一樣,但端口均爲默認端口
2。FQDN 不一樣;
請求報文中首部
Host: www.m.com
3。有三種實現方案:
基於ip :爲每一個虛擬主機準備至少一個ip 地址
基於port :爲每一個虛擬主機使用至少一個獨立的port
基於FQDN :爲每一個虛擬主機使用至少一個FQDN
4。注意:
通常虛擬機不要與main主機混用,所以要使用虛擬主機,通常先禁用main主機。
禁用方法:註釋中心主機的DocumentRoot。
這是由於其在後面,配置文件中默認是後面的配置會覆蓋前面。
使用servername時要注意dns問題。
5。虛擬主機的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot 「/path"
</VirtualHost>
建議:上述配置存放在獨立的配置文件中
6。其它可用指令:
ServerAlias:虛擬主機的別名,可屢次使用
ErrorLog:錯誤日誌
CustomLog:訪問日誌
<Directory 「/path">
</Directory>
Alias
7。基於IP 的虛擬主機示例:
<VirtualHost 172.16.100.6:80>
DocumentRoot "/htdocs1"
</VirtualHost>
<VirtualHost 172.16.100.7:80>
DocumentRoot "htdocs2"
</VirtualHost>
<VirtualHost 172.16.100.8:80>
DocumentRoot "htdocs3"
</VirtualHost>
注意:
當你使用httpd -t進行檢查時會出現報錯,而報的錯誤是servername沒有,這個不用在乎,由於沒有寫。
本機要配上全部ip地址並可以用於通訊。
8。基於端口的虛擬主機:可和基於IP的虛擬主機混和使用
listen 808
listen 8080
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "htdocs1"
</VirtualHost>
<VirtualHost 172.16.100.6:808>
ServerName www.b.net
DocumentRoot "htdocs2"
</VirtualHost>
<VirtualHost 172.16.100.6:8080>
ServerName www.c.org
DocumentRoot "htdocs3"
</VirtualHost>
注意:
httpd要監聽這裏指明的全部端口。
使用servername時要注意DNS。
要不就不使用虛擬機的dns,本身配置好dns。
要不就使用虛擬機的dns,並在/etc/hosts中配好。
9。基於FQDN的虛擬主機:
NameVirtualHost *:80,httpd2.4 不須要此指令
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "htdocs1"
</VirtualHost>
<VirtualHost *:80>
ServerName www.b.net
DocumentRoot "htdocs2"
</VirtualHost>
<VirtualHost *:80>
ServerName www.c.org
DocumentRoot "htdocs3"
</VirtualHost>
注意:一樣是注意dns。
15》status頁面
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 172.16
</Location>
ExtendedStatus On 顯示擴展信息