httpd服務
httpd是一個開源軟件,且一般用作web服務器來使用。目前最流行的web服務器軟件叫做httpd, 在早期的http server就叫做apache,到了http server 2.0以后就改名為httpd了。 所以有時候聽到apache服務器和httpd服務器其實都是指得是一個意思。
httpd生成的文件
httpd目前有多個版本,主流有兩個版本分別為:2.2、2.4,
在安裝了httpd軟件之后,會生成配置文件。 這些文件有:
其中主配置文件:/etc/httpd/conf/httpd.conf
分段配置文件:/etc/httpd/conf.d/*.conf(一般自己定義配置在此文件下重新建立)
模塊的目錄:/etc/httpd/modules
日志目錄:/etc/log/httpd/*
訪問日志為:./access_log
錯誤日志為:./err_log
網頁文件的存放的根目錄:/var/www/html
httpd的特性
高度模塊化: core + modules
DSO:dynamic shared object
MPM:Multipath processing Modules (多路處理模塊)
prefork:多進程模型,每個進程響應一個請求、一個主進程:負責生成子進程及回收子進程;負責創建套接字; 負責接收請求,並將其派發給某子進程進行處理,每個子進程處理一個請求。
worker:多進程多線程模型,每線程處理一個用戶請求、一個主進程:負責生成子進程、負責創建套接字、 負責接收請求、並將其派發給某子進程進行處理,每個子進程負責生成多個線程,每個線程負責響應用戶請求; 並發響應數量為:子進程數量*子進程創建的最大線程數量。
event:事件驅動模型,多進程模型,每個進程響應多個請求、一個主進程 :負責生成子進程、負責創建套接字、 負責接收請求,並將其派發給某子進程進行處理,子進程基於事件驅動機制直接響應多個請求。
注:在/etc/httpd/conf.modules.d/00-mpm.conf切換工作模型
httpd的功能特性
CGI:Common Gateway Interface
虛擬主機:IP,PORT, FQDN
反向代理
負載均衡
路徑別名
豐富的用戶認證機制
basic
digest
支持第三方模塊
服務控制
systemctl enable|disable httpd.service #開機啟動與否
systemctl {start|stop|restart|status} httpd.service #單次操作狀態
httpd的主配置文件
通過yum安裝的httpd的主配置文件在以下路徑
httpd-2.2:/etc/httpd/conf/httpd.conf
httpd-2.4:/etc/httpd/conf/httpd.conf
#另外還有分段配置文件位於:
/etc/httpd/conf.d/目錄下,所有以.conf結尾的文件。
配置文件的結構
/etc/httpd/conf/httpd.conf
Section 1: Global Environment
Section 2: 'Main' server configuration
Section 3: Virtual Hosts
httpd服務的基礎配置
修改監聽的IP以及端口
格式為: Listen [IP-address:]portnumber [protocol]
此語句的使用有以下幾點注意事項:
-
IP-address可省略,表示0.0.0.0匹配全部IP;
-
此指令Listen可重復出現多次監聽多個IP地址和端口;
-
修改監聽的socket后,需重啟服務進程方可生效;
-
若限制其必須通過ssl通信時,protocol需定義為https;
案例
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 192.168.0.109:8080 #新增監聽端口8080
使用長連接
長連接指的是tcp鏈接建立之后,每個資源獲取完成后不全斷開連接,而是繼續等待其他資源請求;但是對於並發訪問量較大的服務器,長連接的使用會使得后續某些請求無法得到正常的響應。對於這種情況, 可通過使用較短的長連接超時時長和設置較少的長連接請求數來緩解。
其配置命令為:
keepalive On|off #是否啟動長連接
keepAliveTimeout 15 #長連接超時時間
MaxKeepAliveRequests 100 #最多保持多少個長連接請求
定義Web目錄
在httpd服務的主配置文件中,默認情況下DocumentRoot "/var/www/html"定義了默認web站點目錄的路徑。
如需自定義默認的目錄,需要找如下格式進行添加:
httpd-2.2:
<Directory "/PATH/TO/FILE">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
httpd-2.4:
<Directory "/PATH/TO/FILE">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
options包括以下可選參數:


-
AllowOverrideAllowOverride選項用於定義每個目錄下.htaccess文件中的指令類型,但通常設置None。
-
OrderOrder選項用於定義缺省的訪問權限與Allow和Deny語句的處理順序。
-
Allow/DenyAllow和Deny語句可以針對客戶機的域名或IP地址進行設置,以決定哪些客戶機能夠訪問服務器。如:Allow from all或者Deny from 172.16.0.0/24等等。
-
Require all granted此為http-2.4中的允許所有人訪問的格式。除此還可以禁止某個IP或域名的訪問,如:Require not ip 1.1.1.1、Require not host host.example.com或者禁止所有人訪問Require all denied。
httpd的訪問控制
1、在Directory中基於IP地址實現訪問控制
在http-2.2中基於IP地址的訪問控制是利用allow和Deny參數來實現的,如下例子:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from [IP|NetAddr]
Deny from [IP|NetAddr]
</Directory>
其中NetAddr的格式可類似:172.16、172.16.0.0、172.16.0.0/16、172.16.0.0/255.255.0.0。
而httpd-2.4中基於Ip地址訪問的控制是利用Require參數來實現的,其中Require參數可混合使用,如下例子:
<Directory "/data/html">
AllowOverride none
Options none
<RequireAll>
Require host google.com #只允許來自域名為google.com的主機訪問;
Require not host www.magedu.com #不允許來自域名為www.magedu.com的主機訪問;
</RequireAll>
</Directory>
使用案例:
禁止主機IP192.168.0.100和109訪問相應的主機頁面:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.0.108:80>
DocumentRoot "/data/html"
<Directory "/data/html">
AllowOverride none
Options none
<RequireAll>
Require all granted #允許所有主機訪問
Require not ip 192.168.0.110 192.168.0.100 #禁止匹配的Ip訪問
</RequireAll>
</Directory>
</VirtualHost>
2、在Directory中基於用戶的訪問控制
在Directory中支持的認證方式有兩種Basic明文認證和digest消息摘要認證,由於並不是所有瀏覽器都支持摘要認證,因此一般來說用的較多的是明文認證
首先利用htpasswd命令生成認證的配置文件:
[root@localhost ~]# htpasswd -cb /data/userpasswd charlie 123456
Adding password for user charlie
[root@localhost ~]# htpasswd -b /data/userpasswd wch magedu
Adding password for user wch
[root@localhost ~]# cat /data/userpasswd charlie:$apr1$1.t1GT7Z$HFMLZT7SR5eF6i51efMo90
wch:$apr1$nzfsSQ4g$qvo8tPvRV5uwnAehOCmr9.
隨后編輯httpd的主配置文件,設置用戶認證:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/html" #修改默認的web目錄
<Directory "/data/html">
AllowOverride none
Options none
AuthType Basic #設置認證類型為Basic
AuthName "welcome to my server." #設置認證提示
AuthUserFile "/data/userpasswd" #指定認證文件的路徑
Require user charlie wch #指定允許訪問的認證用戶
</Directory>
httpd服務除了根據用戶做訪問控制之外,還能將用戶划分為相應的域組,並根據域組來做相應的訪問控制。下面為以剛才演示的用戶控制為背景做的域組訪問控制示列:
首先創建域組文件:
[root@localhost ~]# vim /data/Usergroupgroup1:charlie
group2:wch
編輯httpd的主配置文件:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/html"
<Directory "/data/html">
AllowOverride none
Options none
AuthType Basic
AuthName "welcome to my server"
AuthUserFile "/data/userpasswd"
AuthGroupFile "/data/Usergroup" #添加域組文件
Require group group1 #選擇允許認證訪問的域組
</Directory>
四、httpd的虛擬主機VirtualHost
學習了如何在定義httpd的web目錄后,大家肯定都會躍躍欲試。但是經歷實操之后,大家可能就會去想着創建第二個web目錄,然后就發現創建的第二個web目錄無法被正常讀取訪問。此時就需要利用到httpd服務的VirtualHost功能來幫助大家完成這個需求。
Apache虛擬主機就是在一個Apache服務器上配置多個虛擬主機,實現一個服務器提供多站點服務,其實就是訪問同一個服務器上的不同目錄。
虛擬主機支持三種訪問方式:
-
基於IP的方式,需為每個虛擬主機准備至少一個Ip地址,其配置方式如下:
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs" #虛擬主機的web目錄
</VirtualHost>
基於port的方式,需要為每個虛擬主機使用至少一個獨立的port,其配置方式如下:
Listen 8080 #在指定其他端口時,需添加監聽語句
<VirtualHost 172.16.100.6:8080> #指定不同的port
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
基於FQDN的方式,為每個虛擬主機使用至少一個FQDN,其配置方式如下:
NameVirtualHost 172.16.100.6:80 #如果是httpd-2.2,需要在配置文件中添加此句
<VirtualHost 172.16.100.6:80>
ServerName www.a.com #指定FQDN
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName www.b.net #指定FQDN
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>