Apache HTTP Serverphp
HTTPD簡介html
Apache HTTP Server(簡稱Apache或httpd)是Apache軟件基金會的一個開放源代碼的網頁服務器軟件,旨在爲unix,windows等操做系統中提供開源httpd服務。因爲其安全性、高效性及可擴展性,被普遍使用,自1996年4月以來,Apache一直是Internet上最流行的HTTP服務器。它快速、可靠而且可經過簡單的API擴充,將Perl/Python等解釋器等編譯到httpd的相關模塊中。c++
HTTPD特性及功能web
Apache支持許多特性,大部分經過編譯的模塊實現,這些特性從服務器端的編程語言支持到身份認證方案。通用的語言接口支持Perl,Python,Tcl 和 PHP;流行的認證模塊包括mod_access,mod_auth和mod_digest;其餘的有SSL和TLS支持(mod_ssl),代理服務器(proxy)模塊,頗有用的URL重寫(由mod_rewrite實現),定製日誌文件(mod_log_config),以及過濾支持(mod_include和mod_ext_filter)等。主要特性以下:算法
高度模塊化設計: core + modulesexpress
支持DSO:Dynamic Shared Object ,動態共享庫apache
支持MPM模塊:Multipath Processing Modules,多道處理模塊 。編程
同時支持如下功能:虛擬主機 virtual host ;CGI:Common Gateway Interface,通用網關接口;豐富的用戶認證機制:basic;digest;用戶站點等。vim
MPM包含的機制windows
prefork機制:預先生成進程,服務器啓動時會生產多個進程,而且每個進程處理一個請求,比較穩定,任何一個進程崩潰了都不會影響到其餘的進程 。如:select()函數
worker機制:這是一種基於線程來工做,服務器啓動時生成多個進程,每個進程要生成多個線程,一個線程用來處理一個請求
event機制:基於事件驅動機制來工做的,這種機制可使用一個進程來響應多個請求。它的併發能力是最強的。它在httpd-2.4之後獲得支持。如event-driven ——事件驅動
Httpd yum安裝與編譯安裝
1)Installing on CentOS6.x , yum源安裝
# yum install httpd -y 安裝 # chkconfig --add httpd 加入啓動服務 # chkconfig httpd on 默認啓動級別自啓動 # service httpd start 啓動httpd服務
httpd相關配置文件:
主配置文件:/etc/httpd/conf/httd.conf ,這個是httpd最主要的配置文檔
擴展配置文件:/etc/httpd/conf.d/*.conf ,這個是httpd的額外配置文檔
文檔根目錄: /var/www/html ,這個是apache 首頁的文檔目錄 ,即輸入http://127.0.0.1 顯示頁面所在的目錄
服務腳本:/etc/rc.d/init.d/httpd
錯誤目錄:/var/www/error ,服務器設定錯誤,請求的資源錯誤或瀏覽器訪問出現錯誤等錯誤文件的存儲目錄
CGI目錄: /var/www/cgi-bin/ ,預設爲CGI運行腳本的存儲目錄
日誌目錄:/var/log/httpd ,client端登陸httpd時,記錄的登陸日誌等信息存儲目錄
腳本配置文件: /etc/sysconfig/httpd
Listen端口:80/tcp ,443/tcp
命令執行文件:/usr/sbin/apachectl ,/usr/sbin/httpd,/usr/bin/htpasswd
PID文件:/var/run/httpd/httpd.pid
Apache相關命令及參數
# httpd [ -d serverroot ] [ -f config ] [ -k start|restart|graceful|stop|graceful-stop ] ,用以啓動、關閉和從新啓動Web服務器進程
-f <設定文件> :指定配置文件
-d <服務器根目錄>: 指定服務器的根目錄
-l :顯示服務器編譯時所包含的模塊
-t :測試配置文件的語法是否正確
-M :顯示全部httpd 加載的模塊
# apachctl [ httpd-argument ] ,apachectl與httpd命令選項相似,不一樣之處可直接與下列項組合:
fullstatus:顯示服務器完整的狀態信息;
graceful:從新啓動Apache服務器,但不會中斷原有的鏈接;
help:顯示幫助信息;
restart:從新啓動Apache服務器;
start:啓動Apache服務器;
status:顯示服務器摘要的狀態信息;
stop:中止Apache服務器。
# htpasswd[-cimBdpsDv] passwordfile username,用於建立和更新儲存用戶名、域和用戶基本認證的密碼文件。
-c:建立一個加密文件;只在第一次添加用戶時使用
-n:不更新加密文件,只將加密後的用戶名密碼顯示在屏幕上;
-m:默認採用MD5算法對密碼進行加密;
-s:採用SHA算法對密碼進行加密;
-b:在命令行中一併輸入用戶名和密碼而不是根據提示輸入密碼;
-D:刪除指定的用戶。
實現httpd啓動、關閉、重啓方法
# service httpd stop | start | restart
# httpd -k stop | start | restart | graceful
# apachectl stop | start | restart | graceful 生產環境中重啓httpd服務,建議使用apachectl命令,使用graceful 選項
[root@VM ~]# yum install httpd -y Dependency Installed: # 自動解決依賴關係,依賴apr 和 apr-util apr.x86_64 0:1.3.9-5.el6_9.1 apr-util.x86_64 0:1.3.9-3.el6_0.1 apr-util-ldap.x86_64 0:1.3.9-3.el6_0.1 httpd-tools.x86_64 0:2.2.15-69.el6.centos mailcap.noarch 0:2.1.31-2.el6 Complete! [root@VM ~]# rpm -ql httpd # 查看httpd安裝列表 /etc/httpd /etc/httpd/conf /etc/httpd/conf.d /etc/httpd/conf/httpd.conf /etc/httpd/run /etc/rc.d/init.d/httpd /etc/sysconfig/httpd /usr/sbin/apachectl /usr/sbin/htcacheclean /usr/sbin/httpd /usr/sbin/httpd.event /usr/sbin/httpd.worker /var/run/httpd /var/www/cgi-bin /var/www/html [root@VM ~]# chkconfig --add httpd [root@VM ~]# chkconfig httpd on [root@VM ~]# service httpd start # 啓動httpd服務 Starting httpd: [ OK ] [root@VM ~]# ss -tunl | grep 80 # 驗證服務啓動正常與否 tcp LISTEN 0 128 :::80 :::* [root@VM ~]# httpd -v # 查看httpd 版本 Server version: Apache/2.2.15 (Unix) [root@VM ~]# httpd -t # 驗證httpd配置文件語法是否正確 Syntax OK [root@VM ~]# httpd -l # 查看httpd加載的模塊 Compiled in modules: core.c prefork.c http_core.c mod_so.c [root@VM ~]# httpd -k start # httpd 啓動 [root@VM ~]# ss -tunl Netid State Recv-Q Send-Q Local Address:Port tcp LISTEN 0 128 :::80 [root@VM ~]# httpd -k stop [root@VM ~]# ss -tunl | grep 80 # 驗證httpd被關閉 [root@VM ~]# apachectl start # 啓動httpd服務 httpd (pid 3545) already running [root@VM ~]# apachectl graceful #重啓httpd服務,但不中斷原有鏈接
2)Installing from source , 源碼安裝
apr ,apr-util ,gcc ,gcc-c++ ,pcre 相關環境準備 Download the latest release form http://httpd.apache.org/download.cgi 下載 # gzip httpd-NN.tar.gz 提取 # tar xvf httpd-NN.tar # cd httpd-NN # ./configure --prefix=PREFIX ‘--other-variable ’ 配置 # make && make install 編譯安裝 # vim PREFIX/conf/httpd.conf 預設功能 # PREFIX/bin/apachectl -k start 測試 # PREFIX/bin/apachectl -k stop
編譯安裝Apache須要如下需求
APR和APR-Util:此庫是必需的,確保系統上已安裝APR和APR-Util 。http://apr.apache.org/download.cgi
PCRE:此庫是必需的,但再也不與httpd捆綁在一塊兒,建議源碼安裝 # yum install pcre pcre-devel -y
GCC:確保安裝了ANSI-C編譯器 gcc 和 gcc-c++
Perl 5:該項爲可選項,對於某些支持腳本,如apsx或dbmmanage(用Perl編寫),須要Perl 5解釋器
./configure經常使用選項及功能介紹
# ./configure --help :查看相關命令幫助,查看相關支持的選項參數及功能
--prefix=PREFIX :指定默認安裝目錄
--bindir=DIR:指定二進制可執行文件安裝目錄
--sbindir=DIR:指定可執行文件安裝目錄
--includedir=DIR:指定頭文件安裝目錄
--enable-so : 啓用DSO動態加載模塊支持,須要什麼功能模塊可動態加載
--enable--ssl :SSL/TLS support (mod_ssl)
--enable-cgi :支持CGI腳本功能
--enable-rewrite : 啓用網頁地址重寫功能,實現僞靜態
--with-z=DIR:安裝zlib庫
--with-pcre=DIR :使用擴展的pcre lib庫
--with-apr=DIR :指向apr安裝路徑
--with-apr-util=DIR :指向apr-util 安裝路徑
--enable-modules=most :指定安裝DSO動態庫用來通訊
--with-mpm=prefork|worker|event :指定服務器默認支持的一種MPM模塊
--enable-mpms-shared=all :當前平臺選擇MPM加載動態模塊並以DSO動態庫方式進行建立
configure的各項參數及功能介紹,可參照官方文檔https://httpd.apache.org/docs/2.4/en/programs/configure.html
多模處理模塊MPM
默認MPM:在unix平臺端,支持prefork 、worker、event模塊
構建MPM爲靜態模塊: --with-mpm=prefork|event|worker ,若是要改變 MPM,必須從新構建。
構建MPM爲動態模塊: --enable-mpms-shared=all ,全部此平臺支持的 MPM 模塊都會被安裝 ,而後出如今生成的服務器配置文件中。 編輯 LoadModule 指令內容能夠選擇不一樣的 MPM模塊。
實現httpd啓動、關閉、重啓方法
# /usr/local/apache/bin/apachectl -f /etc/httpd/httpd.conf :啓動httpd進程,並指定啓動配置文件
# kill -TERM|USR1 `cat /usr/local/apache/logs/httpd.pid` :關閉httpd進程,經過kill命令向httpd進程發送信令
# apachectl stop | start | restart | graceful :apachectl命令實現httpd進程中止、啓動、重啓等功能
# 下載httpd ,apr ,apr-util源碼包 [root@VM ~]# wget http://mirror.olnevhost.net/pub/apache//apr/apr-1.6.3.tar.gz [root@VM ~]# wget http://mirror.olnevhost.net/pub/apache//apr/apr-util-1.6.1.tar.gz [root@VM ~]# wget http://mirror.cc.columbia.edu/pub/software/apache//httpd/httpd-2.4.34.tar.gz [root@VM ~]# ls anaconda-ks.cfg apr-util-1.6.1.tar.gz install.log apr-1.6.3.tar.gz httpd-2.4.34.tar.gz install.log.syslog [root@VM ~]# tar xf apr-1.6.3.tar.gz # 解壓文件 [root@VM ~]# tar xf apr-util-1.6.1.tar.gz [root@VM ~]# tar xf httpd-2.4.34.tar.gz [root@VM ~]# yum install gcc gcc-c++ pcre pcre-devel # 安裝httpd依賴需求 [root@VM ~]# yum groupinstall "Development tools" # 安裝包組開發工具 [root@VM ~]# yum groupinstall "Server Platform Development" # 安裝包組服務開發環境 [root@VM ~]# cd apr-1.6.3 # 編譯安裝apr [root@VM apr-1.6.3]# ./configure --prefix=/usr/local/apr [root@VM apr-1.6.3]# make && make install [root@VM ~]# cd apr-util-1.6.1 # 編譯安裝apr-util [root@VM apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ [root@VM apr-util-1.6.1]# make && make install [root@VM ~]# cd httpd-2.4.34 # 編譯安裝httpd [root@VM httpd-2.4.34]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable--ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modeles=most --enable-mpms-shared=all --with-mpm=event [root@VM httpd-2.4.34]# make && make install [root@VM bin]# vi /etc/profile.d/http.sh # 配置環境變量 export PATH=/usr/local/apache/bin:$PATH [root@VM bin]# . /etc/profile.d/http.sh #使能環境變量生效 [root@VM bin]# echo $PATH /usr/local/apache/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin [root@VM apache]# ln -sv /usr/local/apache/include/ /usr/include/httpd # 配置httpd include頭文件 `/usr/include/httpd' -> `/usr/local/apache/include/' [root@VM apache]# ls -l /usr/include/ | grep httpd lrwxrwxrwx 1 root root 26 Aug 11 20:35 httpd -> /usr/local/apache/include/ [root@VM apache]# vi /etc/man.config # 配置httpd man幫助文件 MANPATH /usr/local/apache/man # 添加該行,httpd man文件地址 [root@VM apache]# apachectl start # 啓動httpd服務 [root@VM apache]# ss -tunl | grep 80 # 驗證80端口是否處於偵聽狀態 Netid State Recv-Q Send-Q tcp LISTEN 0 128 [root@VM ~]# kill -TERM `cat /usr/local/apache/logs/httpd.pid` #中止httpd進程 [root@VM ~]# apachectl -f /etc/httpd/httpd.conf #啓動httpd進程,並指定httpd啓動配置文件
Apache配置文件介紹
主配置文件
經過將指令放在純文本配置文件中來配置Apache HTTP Server 。一般調用主配置文件 httpd.conf ,此外,可使用該Include 指令添加其餘配置文件,而且可使用通配符包含許多配置文件。
配置文件的語法
httpd配置文件每行包含一個指令。反斜槓「\」能夠用做一行上的最後一個字符,表示該指令繼續到下一行。反斜槓和行尾之間不能有其餘字符或空格。
指令的參數由空格分隔。若是參數包含空格,則必須將該參數括在引號中
配置文件中的指令不區分大小寫,但指令的參數一般區分大小寫。以「#」開頭的行被視爲註釋行,可被忽略。
可以使用apachectl configtest 或 apachectl -t命令行檢查配置文件中的語法錯誤,而無需啓動服務器。
模塊化設計
httpd是一個模塊化服務器,只包含最基本的核心功能;能夠經過加載到httpd模塊的方式提供擴展功能。 包含指令<IfModule> 和 <LoadModule>
指令範圍
經過配置文件中的指令來限定做用範圍,包含指令<Directory>,<DirectoryMatch>,<Files>,<FilesMatch>,<Location>,<LocationMatch> ,<Virtualhost>等
httpd能夠同時爲許多不一樣的網站提供服務。這稱爲虛擬主機。指令也能夠經過將它們放在<VirtualHost> 部分中來限定範圍。
.htaccess 文件
httpd容許經過放置在Web樹中的特殊文件來分散管理配置。一般會調用特殊文件.htaccess,這些.htaccess文件遵循與主配置文件相同的語法。包括指令<AccessFileName> <Allowoveride>
注:絕大多數配置修改後,能夠經過 service httpd reload 來生效;若是修改了監聽的地址或端口,必須重啓服務才能生效
以httpd.2.4 版本爲例,Httpd.conf 配置文件相關指令詳解
Listen指令是爲了設置監聽套接字 。PidFile指令是爲了指定httpd的PidFile文件。
語法:Listen [IP-address:]portnumber [protocol]
語法2:PidFile filename
Listen 80 # 設置偵聽端口 Listen 127.0.0.1:80 # 設置偵聽ip 及 端口 Listen 192.168.4.150:8000 Listen 192.168.4.150:8443 https # 偵聽 ip 192.168.4.150 8443端口 https 協議 <IfModule !mpm_netware_module> PidFile "/var/run/httpd/httpd.pid" # 指定PidFile文件爲 /var/run/httpd/httpd.pid </IfModule>
該指令設置httpd的安裝位置,編譯安裝時可經過"--prefix"選項指定,如--prefix=/usr/local/apache ;不建議安裝完成後,變動不一樣的路徑 :由於在配置文件中,部分指令路徑是依賴該httpd的根路徑的相對路徑。
語法:ServerRoot directory-path
ServerRoot "/usr/local/apache" # httpd 安裝目錄
指定server站點的根目錄。使用rpm包安裝的httpd的DocumentRoot默認值爲"/var/www/html";編譯安裝的httpd時,其DocumentRoot默認爲"$ServerRoot/htdocs"
語法:DocumentRoot directory-path
Options指令選項:
Indexes:缺乏指定的頁面時,容許將目錄中的全部文件列舉出來;除非是提供文件下載,不然出於安全考慮,這個選項是強烈建議關閉的
FollowSymLinks :容許跟隨符號連接所指向的原始文件;出於安全考慮,這個選項建議關閉
ExecCGI:容許使用mod_cgi 模塊執行CGI腳本
Includes:容許使用mod_include模塊實現服務器端包含(SGI)
MultiViews:容許使用mod_negotiation實現內容協商
SymLinksIfOwnerMatch:在連接文件屬主屬組域原始文件屬主屬組相同時,容許跟隨符號連接所指向的原始文件
AllowOverride 指令選項:用於控制是否讀取".htaccess"配置文件。
all:啓用AllowOverride特性
none:禁用AllowOverride特性。
AuthConfig:基於用戶認證時設置該值,此時將可使用AuthGroupFile, AuthName, AuthType, AuthUserFile,Require等認證相關指令。
FileInfo: 控制文檔類型時使用該值,此時將可使用ErrorDocument, SetHandler,以及一些URL重寫的指令。
Indexes:控制目錄索引時使用該值,此時可使用AddIcon, DirectoryIndex。
Limit:是否容許使用order、allow、deny指令,這三個指令已經廢棄,目前還存在是爲了兼容老版本。
Require指令選項:實現對用戶訪問限制
Require all granted :全部用戶容許訪問
Require all dined :全部用戶禁止訪問
Require Valid-user :僅容許有效用戶進行訪問
Require user userid [userid] ... 僅容許userid用戶進行訪問
Require group Group-name [group-name] ... 僅容許Group-name組內用戶進行訪問
Order 指令: 實現對用戶的訪問限制
Order Allow,Deny # 定義權限,先容許 ,後拒絕 ;在規則中,若兩者都匹配或兩者都不匹配,則以Order 命令中的第二項爲準;不然,則匹配到相關項爲準
Allow From IP | network # 容許的ip 或 network
Deny From IP | network # 拒絕的ip 或 network
實現用戶訪問限制方法:如下兩個選項二選一 ,不建議同時使用
一、Require all [ granted | dined ] 容許 或 拒絕 全部用戶訪問
二、經過Order 與 Allow 或Deny 的指令組合來實現。
DocumentRoot "/usr/local/apache/htdocs" #指定server 站點的根目錄 ,可改變該路徑地址,實現把其餘目錄做爲server根目錄 <Directory "/usr/local/apache/htdocs"> # 定義目錄屬性 Options Indexes FollowSymLinks # 配置目錄中可用的功能,包括Indexes ,FollowSymLinks ,None ,All ,ExecCGI等 AllowOverride None # 不容許存在於.htaccess文件中的指令類型 Require all granted | denied # 容許或拒絕 全部用戶訪問 Order allow,deny # 先容許,在禁止 順序匹配 ,定義限制用戶 Allow from IP | network Deny from IP | network </Directory>
httpd服務器端將DorectoryIndex指令所指定的文件響應給客戶端。如訪問 http://www.itwish.cn/ ,將自動把$Document下的index.html 文件內容返回給客戶端 。
語法:DirectoryIndex disabled | local-url [local-url]
<IfModule dir_module> DirectoryIndex index.html index.php /cgi-bin/index.pl #從左至右依次查找 ,先查找index.html 文件 ,若沒有就查找index.php 文件 ,再沒有就查找/cgi-bin/index.pl 文件 </IfModule>
KeepAlive指令用於開啓和關閉持久鏈接功能。在沒有開啓持久鏈接時,客戶端每請求一個資源都需從新創建一次TCP鏈接,而使用了持久鏈接後,客戶端只需在最初請求一次TCP鏈接,以後就可使用同一個TCP鏈接發送其餘的http請求;但長鏈接自身的缺陷是會一直佔用着鏈接不釋放,因此必須得給出一個長鏈接的超時時間,這個超時時間由KeepAliveTimeout指令控制;還能夠經過指令MaxKeepAliveRequests控制每一個長鏈接下的TCP鏈接的能接受的最大請求數。無疑,這個值應該設置的大一些,設置爲0表示無限制。
語法1:KeepAlive On|Off
語法2:KeepAliveTimeout num[ms]
語法3:MaxKeepAliveRequests number
[root@VM httpd]# vi /etc/httpd/httpd.conf # Various default settings Include /etc/httpd/extra/httpd-default.conf # 啓用擴展配置文件httpd-default.conf [root@VM extra]# vi httpd-default.conf KeepAlive On # 啓用HTTP持久鏈接功能 KeepAliveTimeout 5 # 關閉鏈接以前等待後續請求的秒數 ,經過添加ms的後綴,表示可設置爲毫秒 MaxKeepAliveRequests 50 # 限制打開時每一個鏈接容許的請求數,若爲0 ,則不限制
Apache HTTP Server是一個模塊化程序,管理員能夠經過加載不一樣的模塊組來選擇要包含在服務器中的功能。在編譯安裝時,經過選項--enable-so 來加載DSO(動態共享對象)功能。經過LoadModule命令來實現關閉或開啓功能模塊 。
語法:LoadModule status_module "modules/mod_status.so"
[root@vm ~]# vi /etc/httpd/httpd.conf #LoadModule mpm_event_module modules/mod_mpm_event.so LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #LoadModule mpm_worker_module modules/mod_mpm_worker.so LoadModule authn_file_module modules/mod_authn_file.so #LoadModule authn_dbm_module modules/mod_authn_dbm.so #LoadModule authn_anon_module modules/mod_authn_anon.so #LoadModule authn_dbd_module modules/mod_authn_dbd.so #LoadModule authn_socache_module modules/mod_authn_socache.so LoadModule authn_core_module modules/mod_authn_core.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_groupfile_module modules/mod_authz_groupfile.so LoadModule authz_user_module modules/mod_authz_user.so
Apache HTTP 服務器 2.0 擴展此模塊化設計到最基本的 web 服務器功能,它提供了能夠選擇的多處理模塊(MPM),可在編譯時使用--with-mpm選項來決定apache的工做模式。MPM 很像其它 Apache httpd 模塊,主要是區別是任什麼時候間內必須有一個且只能有一個 MPM 模塊需加載到服務器中,可用的MPM模塊包括prefork ,event ,worker等。能夠經過httpd -M命令列出apache的全部模塊,查看相應其工做方式。
Include 指令是用於在httpd啓動時,使用include指令來包含其餘配置文件,在解析配置文件時會把主配置文件httpd.conf 與include 包含的文件進行配置合併 ,實現總體對 httpd 的配置調節。
語法:Include file-path|directory-path|wildcard
[root@vm ~]# vi /etc/httpd/httpd.conf LoadModule mpm_event_module modules/mod_mpm_event.so # 手動加載的mod_mpm模塊 #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so # 若更改mpm_prefork或mpm_worker模塊,其他兩種模塊行註釋 #LoadModule mpm_worker_module modules/mod_mpm_worker.so # Server-pool management (MPM specific) Include /etc/httpd/extra/httpd-mpm.conf # 啓動httpd-mpm.conf 擴展配置文件 [root@vm ~]# vi /etc/httpd/extra/httpd-mpm.conf <IfModule mpm_prefork_module> StartServers 5 # 開機啓動的工做進程數 MinSpareServers 5 # 保留備用的最小工做進程數 MaxSpareServers 10 # 保留備用的最大工做進程數 MaxRequestWorkers 250 # httpd啓動時開啓的最大工做進程數 MaxConnectionsPerChild 0 # 服務器進程所服務的最大鏈接數,0表明不限制 </IfModule> <IfModule mpm_worker_module> StartServers 3 # 啓動的子進程的個數 MinSpareThreads 75 # 保留備用的最小工做線程數 MaxSpareThreads 250 # 保留備用的最大工做線程數 ThreadsPerChild 25 # 服務器進程的工做線程數 MaxRequestWorkers 400 # 服務器最大工做線程數 MaxConnectionsPerChild 0 # 服務器的最大進程鏈接數 ,0表明不作限制 </IfModule> <IfModule mpm_event_module> StartServers 3 # 啓動的子進程的個數 MinSpareThreads 75 # 保留備用的最小工做線程數 MaxSpareThreads 250 # 保留備用的最大工做線程數 ThreadsPerChild 25 # 服務器進程的工做線程數 MaxRequestWorkers 400 # 服務器最大工做線程數 MaxConnectionsPerChild 0 # 服務器的最大進程鏈接數 ,0表明不作限制 </IfModule> </IfModule>
ServerName用於惟一標識提供web服務的主機名,只有在基於名稱的虛擬主機中該指令纔是必須的 。ServerAlias用於定義ServerName的別名。 ServerAdmin 是用於定義管理郵箱地址。
語法1:ServerName [scheme://]domain-name|ip-address[:port]
語法2:ServerAdmin email-address|URL
語法3:ServerAlias hostname [hostname]
[root@VM httpd]# vi httpd.conf # ServerAdmin: Your address, where problems with the server should be # e-mailed. This address appears on some server-generated pages, such # as error documents. e.g. admin@your-domain.com # ServerAdmin web@itwish.cn # 定義Server管理員郵箱地址 # # ServerName gives the name and port that the server uses to identify itself. # This can often be determined automatically, but we recommend you specify # it explicitly to prevent problems during startup. # # If your host doesn't have a registered DNS name, enter its IP address here. # ServerName www.itwish.cn:80 # 定義主機名稱 [root@VM httpd]# vi extra/httpd-vhosts.conf <VirtualHost *:80> ServerAdmin webmaster@itwish.cn # 定義Server管理員郵箱地址 ServerName www.itwish.cn # 定義主機名稱 ServerAlias www # 定義主機別名 </VirtualHost>
容許每一個用戶使用該UserDir指令在其主目錄中擁有一個網站。可經過http://example.com/~username/ 進行訪問 ,注:務必要爲用戶的家目錄賦予運行httpd進程的用戶daemon擁有執行權限
語法:UserDir directory-filename [directory-filename] ...
[root@VM httpd]# vi /etc/httpd/httpd.conf LoadModule authz_host_module modules/mod_authz_host.so # 加載userdir 依賴的動態DSO文件 ,取消註釋「#」 便可實現加載。 LoadModule authz_core_module modules/mod_authz_core.so LoadModule userdir_module modules/mod_userdir.so # User home directories Include /etc/httpd/extra/httpd-userdir.conf # 包含擴展文件 httpd-userdir.conf [root@VM httpd]# vi extra/httpd-userdir.conf # Required module: mod_authz_core, mod_authz_host, mod_userdir # 該功能依賴DSO 動態模塊 mod_authz_core,mod_authz_host, mod_userdir UserDir public_html # 定義用戶訪問目錄名稱 # public_html是用戶家目錄下的目錄名稱,全部位於此目錄中的文件都可經過url http://example.com/~username進行訪問 <Directory "/home/*/public_html"> # 定義目錄頁面屬性 AllowOverride FileInfo AuthConfig Limit Indexes # 配置AllowOverride 指令 Options Indexes FollowSymlinks # 配置Options 指令 Require all granted # 配置Require 指令 </Directory> [root@VM httpd]# useradd itwish # 添加用戶及配置密碼 [root@VM httpd]# passwd itwish [root@VM itwish]# mkdir /home/itwish/public_html # 在用戶家目錄下建立Userdir 定義的目錄文件 [root@VM itwishl]# touch /home/itwish/public_html/{a,b,c} [root@VM itwish]# setfacl -m u:daemon:x /home/itwish/ # 注:務必要爲用戶家目錄配置httpd啓動用戶daemon的執行權限
測試itwish用戶的我的網站:
將URL映射到文件系統位置,並將目標指定爲CGI腳本。例:Script Alias "cgi-bin" "/usr/local/apache/cgi-bin/" 表示訪問 http://www.itwish.cn/cgi-bin/test 時,目錄映射地址爲 /usr/local/apache/cgi-bin/test
語法1:ScriptAlias [URL-path] file-path|directory-path
# 定義/cgi-bin/ 目錄映射到 /web/cgi-bin/ 目錄 ,1)功能等同於2) ,注意結尾的"/" 1) ScriptAlias "/cgi-bin/" "/web/cgi-bin/" 2) Alias "/cgi-bin/" "/web/cgi-bin/" <Location "/cgi-bin"> SetHandler cgi-script Options +ExecCGI </Location>
[root@VM httpd]# vi extra/httpd-vhosts.conf # 調整配置文件 <IfModule alias_module> # ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" # 定義目錄/cgi-bin/ 目錄映射到 /usr/local/apache/cgi-bin/ 目錄 </IfModule> <Directory "/usr/local/apache/cgi-bin"> # 定義目錄屬性 AllowOverride none Options none Require all granted </Directory> [root@VM cgi-bin]# vi test1 # 在cgi-bin目錄中建立test1 bash 腳本 #!/bin/bash cat << EOF Content-Type: text/html # 注意改行爲空行 <pre> <h1>The hostname is `hostname`. </h1> # 顯示主機名 ,使用bash命令 hostname 實現 The time is `date`. # 顯示當前訪問日期 ,使用bash命令 date 實現 </pre> # 改行爲空行 EOF [root@VM cgi-bin]# vi test2 # 在cgi-bin目錄中建立test2 perl 腳本 #!/usr/bin/perl print "content-type: text/html","\n\n"; print "<HTML>","\n"; print "<HEAD>","\n"; print "<TITLE>Perl</TITLE>","\n"; print "</HEAD>","\n"; print "<BODY>","\n"; print "<H1>Hello World</H1>","\n"; print "</BODY>","\n"; print "</HTML>","\n"; [root@VM ]# chmod o+x /usr/local/apache/cgi-bin/{test1,test2} # 注意 ,必定要給與腳本執行權限 [root@VM cgi-bin]# curl http://192.168.4.160/cgi-bin/test1 # 測試 test1 腳本執行情況 <pre> <h1>The hostname is VM. </h1> The time is Wed Aug 15 19:26:56 CST 2018. </pre> [root@VM cgi-bin]# curl http://192.168.4.160/cgi-bin/test2 # 測試test2 perl腳本執行情況 <HTML> <HEAD> <TITLE>Perl</TITLE> </HEAD> <BODY> <H1>Hello World</H1> </BODY> </HTML>
windows測試:
<VirtualHost>及</VirtualHost>用於包含一組僅適用於特定虛擬主機的指令。當服務器在特定虛擬主機上收到對文檔的請求時,它將使用該<VirtualHost> 部分中包含的配置指令。
語法:<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
addr能夠是如下任何一個,可選地後跟冒號和端口號(或*):
虛擬主機的IP地址 ;
虛擬主機IP地址的徹底限定域名(不推薦);
字符 * ,充當通配符並匹配任何IP地址;
字符串"_default_",是"*"的別名
[root@VM httpd]# vi /etc/httpd/httpd.conf # 調整httpd.conf 主配置文件 #DocumentRoot "/usr/local/apache/htdocs" # 註釋掉web站點的根目錄 ,行首加 「#」。 Include /etc/httpd/extra/httpd-vhosts.conf # 取消行首的註釋「#」 ,使能httpd-vhosts.conf 文件 [root@VM httpd]# vi extra/httpd-vhosts.conf <VirtualHost 192.168.4.160:80> # 定義虛擬主機的訪問ip爲 192.168.4.160:80 ,訪問主機名 www.itwish.cn ServerAdmin webmaster@itwish.cn # 定義主機管理郵箱地址 DocumentRoot "/usr/local/apache/htdocs/itwish.cn" # 定義該虛擬主機的根目錄 ServerName www.itwish.cn # 定義虛擬主機名稱 ServerAlias www.itwish.cn # 定義Servername 的別名 ErrorLog "logs/itwish.cn-error_log" # 定義錯誤日誌路徑 CustomLog "logs/itwish.cn-access_log" common # 定義訪問日誌目錄 <Directory "/usr/local/apache/docs/itwish.cn"> # 對根目錄設置頁面訪問屬性 ,定義Directory 指令開始範圍 Options Indexes FollowSymlinks AllowOverride None Require all granted </Directory> # 定義Directory 指令結束範圍 </VirtualHost> # 定義VirtualHost 指令的結束範圍 <VirtualHost 192.168.4.170:80> # 定義虛擬主機的訪問ip爲 192.168.4.160:80 ,訪問主機名 www.itwish.cn ServerAdmin webmaster@itwish.org DocumentRoot "/usr/local/apache/htdocs/itwish.org" ServerName www.itwish.org ServerAlias www.itwish.org ErrorLog "logs/itwish.org-error_log" CustomLog "logs/itwish.org-access_log" common <Directory "/usr/local/apache/docs/itwish.org"> Options Indexes FollowSymlinks AllowOverride None Require all granted </Directory> </VirtualHost> [root@VM httpd]# mkdir /usr/local/apache/htdocs/{itwish.cn,itwish.org} # 建立虛擬主機的根目錄 [root@VM httpd]# cd /usr/local/apache/htdocs/ [root@VM htdocs]# ls index.html itwish.cn itwish.org [root@VM htdocs]# vi itwish.cn/index.html # 編輯虛擬主機 www.itwish.cn 訪問主頁 <html><body><h1>www.itwish.cn works!</h1></body></html> [root@VM htdocs]# vi itwish.org/index.html # 編輯虛擬主機 www.itwish.org 訪問主頁 <html><body><h1>itwish.org works!</h1></body></html> [root@VM httpd]# vi /etc/hosts # 添加如下虛擬主機域名解析 地址 192.168.4.160 vm.itwish.cn vm www.itwish.cn 192.168.4.170 www.itwish.org [root@VM htdocs]# curl http://www.itwish.cn # 測試 ,主頁面顯示正常 <html><body><h1>www.itwish.cn works!</h1></body></html> [root@VM htdocs]# curl http://www.itwish.org # 測試 ,主頁面顯示正常 <html><body><h1>itwish.org works!</h1></body></html>
windows 主機測試,簡要實現 ,未配置域名解析 ,直接經過ip進行訪問:
定義web訪問日誌路徑及日誌格式
語法1:ErrorLog file-path|syslog[:[facility][:tag]]
語法2:LogFormat format|nickname [nickname]
語法3:CustomLog file|pipe format|nickname [env=[!]environment-variable| expr=expression]
定義日誌格式各項參數涵義,請參考官網文檔:https://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats
%h:客戶端地址
%l:遠程的登陸名,一般爲-
%u:認證時的遠程用戶名,一般爲-
%t:接收到的請求時的時間,爲標準英文格式時間+時區
\" :斜槓時爲後面內容作轉義
%r:請求報文的起始行
%>s:響應狀態碼,
%b:以字節響應報文的長度,不包含http報文
%{Header_Name}i:記錄指定請求報文首部的內容(value)
%u:請求的URL
經常使用日誌格式:
通用日誌格式(CLF): "%h %l %u %t \"%r\" %>s %b"
虛擬主機的通用日誌格式:"%v %h %l %u %t \"%r\" %>s %b"
NCSA擴展/組合日誌格式 :"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
引用日誌格式 :"%{Referer}i -> %U"
代理(瀏覽器)日誌格式: "%{User-agent}i"
[root@VM httpd]# vi /etc/httpd/httpd.conf # 調整httpd.conf 主配置文件 ErrorLog "logs/error_log" # 錯誤日誌路徑 LogLevel warn # 日誌等級warn <IfModule log_config_module> # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined # 定義日誌格式,格式名稱定義爲變量 combined LogFormat "%h %l %u %t \"%r\" %>s %b" common # 定義日誌格式,格式名稱定義爲變量 common <IfModule logio_module> # You need to enable mod_logio.c to use %I and %O LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio </IfModule> CustomLog "logs/access_log" common # 該CustomLog指令用於將請求記錄到服務器。指定了日誌路徑,而且選擇使用環境變量common做爲日誌的顯示格式。 </IfModule> [root@VM httpd]# vi extra/httpd-vhosts.conf <VirtualHost 192.168.4.160:80> ErrorLog "logs/itwish.cn-error_log" CustomLog "logs/itwish.cn-access_log" combined # 把日誌格式變量從common 改成 combined 或者 CustomLog "logs/itwish.cn-access_log" "%v %h %l %u %t \"%r\" %>s %b" </VirtualHost> [root@VM httpd]# vi /usr/local/apache/logs/itwish.cn-access_log # 查看訪問日誌 ,經過日誌顯示內容對比 common變量格式 與 combined 變量格式的不一樣 192.168.4.160 - - [15/Aug/2018:15:56:40 +0800] "HEAD / HTTP/1.1" 200 - 192.168.4.160 - - [15/Aug/2018:15:56:52 +0800] "GET / HTTP/1.1" 200 105 192.168.4.201 - - [15/Aug/2018:16:00:13 +0800] "GET /favicon.ico HTTP/1.1" 404 209 192.168.4.201 - - [15/Aug/2018:16:00:17 +0800] "GET /favicon.ico HTTP/1.1" 404 209 192.168.4.201 - - [15/Aug/2018:17:20:01 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3 396.99 Safari/537.36" 192.168.4.201 - - [15/Aug/2018:17:20:06 +0800] "GET / HTTP/1.1" 200 57 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0. 3282.140 Safari/537.36 Edge/17.17134"
httpd對web身份認證的支持很豐富,提供的控制也很是細緻。見http://httpd.apache.org/docs/2.4/mod/
認證方式
httpd服務器支持使用摘要認證(Digest)和基本認證(Basic)兩種方式
Digest:使用摘要認證須要在編譯httpd以前添加"--enable-auth-digest"選項,但並非全部的瀏覽器都支持摘要認證,不推薦使用;
Basic:基本認證是htpd服務的基本功能,不須要預先配置特別的選項(安全性沒有摘要認證高,但支持全部的瀏覽器)
經過用戶名和密碼形式限制訪問方式:
AllowOverride Authconfig # 啓用用戶認證
AuthName "Auth Direcrory" # 指定認證名稱,登陸的時候會經過登陸窗口顯示
AuthType Basic | Digest # 指定認證方式 Basic 或 Digest
AuthUserFile /usr/local/apache/.htpasspwd # 指定受權用戶數據文件,由htpasswd命令生成。
AuthGroupFile file-path # 指定組認證文件,文件中分組格式爲"mygroup: Jon Bob "。若是文件路徑爲相對路徑,則相對於ServerRoot
Require valid-user # 受權給合法用戶,合法用戶在.htpasspwd文件中
[root@VM httpd]# vi /etc/httpd/httpd.conf # 調整httpd.conf 主配置文件 #DocumentRoot "/usr/local/apache/htdocs" # 註釋掉web站點的根目錄 ,行首加 「#」。 Include /etc/httpd/extra/httpd-vhosts.conf # 取消行首的註釋「#」 ,使能httpd-vhosts.conf 文件 [root@VM httpd]# vi extra/httpd-vhosts.conf <VirtualHost 192.168.4.170:80> # 定義虛擬主機的訪問ip爲 192.168.4.160:80 ,訪問主機名 www.itwish.cn ServerAdmin webmaster@itwish.org DocumentRoot "/usr/local/apache/htdocs/itwish.org" # 定義該虛擬主機的根目錄 ServerName www.itwish.org ServerAlias www.itwish.org ErrorLog "logs/itwish.org-error_log" # 定義錯誤日誌路徑 CustomLog "logs/itwish.org-access_log" common # 定義web訪問日誌目錄及日誌格式 <Directory "/usr/local/apache/htdocs/itwish.org"> # 對根目錄設置頁面訪問屬性 ,定義Directory 指令開始範圍 Options Indexes FollowSymlinks AllowOverride Authconfig # 定義用戶訪問認證 AuthType Basic AuthName "Input Your name and password" AuthUserFile "/usr/local/apache/.htpasspwd" # 用戶認證文件 AuthGroupFile "/usr/local/apache/.group" # 組認證文件 Require Valid-user # 或者直接使用 Require user itwish,tom Require group Auth # 容許 </Directory> # 定義Directory 指令結束範圍 </VirtualHost> # 定義VirtualHost 指令的結束範圍 [root@VM httpd]# htpasswd -cb /usr/local/apache/.htpasspwd itwish itwish # 添加認證用戶並指定認證文件 Adding password for user itwish [root@VM httpd]# htpasswd -b /usr/local/apache/.htpasspwd tom tom # 添加認證用戶 Adding password for user tom [root@VM httpd]# echo "Auth:tom" >> /usr/local/apache/.groupname # 添加用戶到認證組Auth [root@VM httpd]# vi /usr/local/apache/.groupname Auth:tom
windows客戶端測試:分別測試用戶名itwish 和 tom 均可正常訪問主頁 Index.html
該<Location>指令經過URL限制所附指令的範圍。它與<Directory> 指令相似 ,並啓動一個以</Location>指令終止的子節 .
[root@VM httpd]# vi httpd.conf # 配置httpd.conf主文件,並加載如下DSO模塊 LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_core_module modules/mod_authz_core.so LoadModule status_module modules/mod_status.so LoadModule info_module modules/mod_info.so # Real-time info on requests and configuration Include /etc/httpd/extra/httpd-info.conf # 啓用擴展文件 [root@VM extra]# vi httpd-info.conf # 配置httpd-info.conf文件,建議指定用戶訪問。 # # Get information about the requests being processed by the server # and the configuration of the server. # # Required modules: mod_authz_core, mod_authz_host, # 依賴指定的模塊 # mod_info (for the server-info handler), # mod_status (for the server-status handler <Location /server-status> SetHandler server-status AllowOverride Authconfig # 配置用戶認證 Authtype Basic AuthName "Input The message" AuthUserFile "/usr/local/apache/.htpasspwd" Require Valid-user </Location>
windows 測試:
綜上,關於httpd.conf 配置文件介紹完畢 。更多指令及使用方式可參考官方文檔:https://httpd.apache.org/docs/2.4/mod/directives.html