寫在前面html
在運維的工做中很大一部分的時間都在和Web服務器打交道。當前在開源web服務器端的軟件有兩大巨頭,其一爲Apache,二爲Nginx。近年來Nginx的市場佔有率逐年遞增。可是,做爲一個合格的運維工程師,要熟練的掌握這兩種服務端軟件的配置。
web
Apache配置文件詳解正則表達式
httpd配置文件主要有指令和容器兩種組成。容器指令通常只在容器中生效。
vim
ServerRoot指令centos
ServerRoot爲Apache的安裝家目錄,rpm安裝默認爲/etc/httpd瀏覽器
Listen指令服務器
設置服務器監聽的IP以及端口號,默認監聽服務本機全部ip地址的80端口。網絡
語法:Listen[ip:]port #配置文件中能夠屢次使用Listen指令,可是要至少使用一次。併發
DocumentRoot指令app
設置web服務器的資源根目錄,也就是客戶端訪問網站的根路徑。默認爲/var/www/html
持久連接配置
持久連接爲鏈接創建以後,每一個資源獲取完成後不會斷開鏈接,而是繼續等待其餘的請求完成。斷開有兩個條件,數量限制和時間限制。
時間限制:在上一個數據包發送完畢,間隔一個固定時間,若是超過這個時間,鏈接被釋放。
數量限制:若是連續請求多個資源,資源數量達到某個閾值,鏈接會被釋放,讓後從新創建鏈接。
KeepAlive On #啓用持久連接 KeepAliveTimeout 15 #等待同一客戶端在同一鏈接上的下一個請求的秒數。 KeepAliveRequests 100 #在持久鏈接中容許的最大請求數。設置爲0,容許無限數量。 可使用telnet 協議演示持久連接的效果。 telnet 172.18.11.6 GET / http/1.1 host:172.18.11.6 #兩次回車,構建http請求報文,若是是持久鏈接,在獲取頁面後,telnet不斷開 |
LoadModule指令
Apache的DSO機制實現,動態的加載卸載模塊,rpm安裝默認啓用該功能,若是編譯安葬須要開啓--enable-so將mod_so模塊一靜態方式集成在core模塊中。支持的模塊通常存儲在SerRoot/modules目錄下。加載模塊時,只需把模塊前面的註釋取消便可,卸載反之。
語法:LoadModule模塊(模塊中定義,不可變動) 模塊的路徑名稱(相對ServerRoot的路徑)。
[root@centos6 conf]# httpd -l|grep mod_so #httpd爲當前工做模式,查看當前版本是否支持動態加載/卸載模塊 [root@centos6 conf]# httpd.worker -M #httpd.woker爲當前的工做模式,查看當前已經加載的模塊 |
Include指令
在配置文件中有Include conf.d/*.conf 指令,系統默認加載在ServerRoot/conf.d 目錄下全部.conf結尾的配置文件。
IfModule容器
該容器中的指令只有在對應的模塊被加載時纔會被處理。該指令語法<IfModule [!]模塊>指令<IfModule >
以<IfModuleprefork.c>爲例:
<IfModule prefork.c> #只有在使用prefork模塊時纔會生效 StartServers 8 #服務啓動時啓動的服務進程數,除了出進程以外,開啓8個子進程來服務 MinSpareServers 5 #最小空閒進程數 MaxSpareServers 20 #最大空閒進程數 (假若有200個客戶端同時請求,又潮水般退去,這時空閒的200個進程不會所有被存在,而是釋放至最大空閒進程數) ServerLimit 256 #服務器進程數量最大值 MaxClients 256 #最大併發鏈接數 MaxRequestsPerChild 4000 #一個服務器進程最多可以響應所少次請求。一個進程處理完請求後不會被釋放,而是加入空閒進程隊列,一個進程最多可以被重複使用4000次,而後系統會殺掉這個進程。 </IfModule>
<IfModule worker.c> #使用worker.c工做模式下生效 StartServers 4 #服務啓動時啓動的服務進程數,又受 MaxClients 300 #最大併發鏈接數 MinSpareThreads 25 #最小空閒線程數,當所有線程都被用於處理請求時,系統會再次建立最小個線程等待用戶請求 MaxSpareThreads 75 #最大空閒線程數, ThreadsPerChild 25 #一個進程能夠建立的線程數 MaxRequestsPerChild 0 #一個進程最多可以響應請求的最大次數,0表示無上限 </IfModule> |
ServerTokens指令
顯示服務器版本信息
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-virtualhost basis. After version 2.0.44, this directive also controls the information presented by the ServerSignature directive. 建議使用:ServerTokens Prod |
ServerName指令
設置本機的主機名稱以及端口,通常在URL的重定向或者虛擬主機中用到。
Options指令
該指令爲特定目錄設置的選項,語法格式:Options [+|-]選項 [[+|-] 選項]。選項有如下幾種
None:不啓用任何功能 All:開啓除MultiViews以外的全部功能 ExecCGI:容許執行該目錄下的全部CGI腳本 FollowSymlinks:容許指定目錄下的文件連接到目錄外的文件或者目錄 Indexes:若是URL對應的目錄下沒有DirectoryIndex指定的首頁文件,則顯示該目錄下的文件索引 |
Order指令
控制默認訪問狀態以及allow和deny的次序。
Orderallow,deny 先檢查容許,再檢查拒絕,有衝突時拒絕優先
Orderdeny,allow 先檢查拒絕,在檢查容許,有衝突時容許優先
Order deny,allow Deny from all 拒絕全部訪問
Order deny,allow deny 172.18 allow 172.18.11.6 拒絕除172.18.11.6以外全部172.18網段的主機訪問 支持的網絡形式: 172.18 172.18.0.0 172.18.0.0/16 172.18.0.0/255.255.0.0 |
AllowOverride指令
設置與訪問控制相關的哪些指令能夠放在指定目錄下的.htaccess(由AccessFileName指定)文件中,覆蓋以前的配置指令,該指令只能使用在<Directory>容器中
AllowOverride All 全部指令都有效 AllowOverride None .htaccess文件無效 AllowOverride AuthConfig Indexes 除了AuthConfig 和Indexes的其餘指令都沒法覆蓋。 |
Directory容器
這個指令也是一種容器類型,做用於特定的文件系統目錄,子目錄以及目錄下的內容,語法格式:<Directory dir_path>指令</Directory>。路徑支持使用正則表達式的寫法<Directory ~ "正則">指令</Directory>。通常用於對某些目錄及文件的訪問控制。
Files容器
和<Directory>相似,做用於文件,也可以使用正則表達式,語法<Files [~] "文件名"></Files>
Lacation容器
定義的指令僅對特定的URL有效,語法<LacationURL>指令</Lacation>,支持正則表達式,使用~號。
ErrorLog指令
錯誤訪問日誌路徑,默認爲ServerRoot/logs/error_log
LogLevel指令
日誌級別: debug,info, notice, warn, error, crit,alert, emerg
LogFormat指令
定義的日誌格式,可使用Apache預先設置的格式字符。語法:LogFormat日誌格式 別名
Apache經常使用的預約義的格式字符串:
%h : 客戶端IP地址 %l : Remote loganme -表示爲空 %u :Remote user -表好爲空 %t :服務收到請求的時間 %r :請求報文首行信息(請求方法,URL 協議版本) %>s :響應狀態碼 %b : 響應報文的大小,單位是字節,不報闊響應報文首部 %{Referer}i: 請求報文當中"referer"首部的值,當前資源的訪問入口,即從那個頁面中的超連接跳轉而來 本身敲地址來的,是不會記錄的,可查看從哪兒跳轉過來的,可放置倒鏈(爲他人作嫁衣) %{User-Agent}i:請求報文當中"User-Agent"首部的值;即發出請求用到的應用程序;瀏覽器類型 |
CustomLog指令
設置客戶端的訪問日誌以及使用何種格式的日誌來記錄。默認路徑爲ServerRoot/logs/access_log ,語法:CustomLog 文件名。
VirtualHost容器
該容器的設置能夠實現Apache的虛擬主機功能,虛擬主機就是在一臺服務器上同時運行多個web業務。Apache支持基於ip,端口以及域名的主機類型。可是基於ip的虛擬主機類型須要有獨立的ip地址,在這個ip地址稀缺的年代,該種方式無疑不會在互聯網上大規模實現。基於端口的實現方式,因爲其使用方法的不便利也不會在互聯網使用。基於ip和端口方式的虛擬主機只在局域網中使用。基於域名的虛擬主機才真正的受你們所歡迎。服務器處理基於域名的虛擬主機請求時根據http的頭部信息來實現網站的分離解析,用戶可以使用不一樣的域名訪問位於同一ip地址的服務器資源。下面爲基於域名的虛擬主機配置文件:
[root@www conf.d]# vim /etc/httpd/conf.d/httpd-vhosts.conf NameVirtualHost *:80 #必須開啓基於域名的虛擬主機 <Virtualhost *:80> web虛擬主機 ServerName www.zachary.top DocumentRoot /var/www/html/web #3臺虛擬主機使用不一樣的資源主目錄,便於管理 ErrorLog "logs/www.zachary.top-error_log" 日誌文件獨立存放便於管理和分析 CustomLog "logs/www.zachary.top-access_log" common </Virtualhost> <Virtualhost *:80> #若使用基於ip的虛擬主機,能夠把*改成指定ip,基於端口的實現,更改80爲不一樣的端口 ServerName bbs.zachary.top DocumentRoot /var/www/html/bbs ErrorLog "logs/bbs.zachary.top-error_log" CustomLog "logs/bbs.zachary.top-access_log" common </Virtualhost> <Virtualhost *:80> ServerName blog.zachary.top DocumentRoot /var/www/html/blog ErrorLog "logs/blog.zachary.top-error_log" CustomLog "logs/blog.zachary.top-access_log" common </Virtualhost> |
基於域名的虛擬主機實現,在互聯網須要dns解析的支持,如果本地測試可使用修改host文件的方式或者搭建一個本地的DNS服務器來實現。基於ip和端口的虛擬主機實現,在VirtualHost後面的*修改成指定ip或者端口就可實現