httpd服務的主配置文件一般爲httpd根目錄下的conf/httpd.conf文件,經過yum安裝的httpd服務的主配置路徑一般以下:php
httpd-2.2:/etc/httpd/conf/httpd.conf
httpd-2.4:/etc/httpd/conf/httpd.confhtml
主配置文件的格式大致分爲三部分:python
Section 1: Global Environment
Section 2: 'Main' server configuration
Section 3: Virtual Hostslinux
但httpd-2.4版本中刪除了相應的描述,不過大致與httpd-2.2相同。web
另外除了主配置文件以外,也存在着其餘的配置目錄路徑,一般在主配置文件中會使用Include conf.d/*.conf
、Include conf.modules.d/*.conf
(httpd-2.4)相似的語句去調用對應的目錄下的配置文件,其路徑格式爲相對路徑,根目錄由主配置文件中的Serverroot決定。shell
本文案例基於 Centos 7.4 httpd-2.4。apache
在主配置文件中,httpd服務監聽IP地址和接口的語句格式爲:vim
Listen [IP-address:]portnumber [protocol]瀏覽器
此語句的使用有如下幾點注意事項:安全
使用案例:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf Listen 80 Listen 192.168.0.109:8080 #新增監聽端口8080 [root@localhost ~]# systemctl restart httpd [root@localhost ~]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 192.168.0.109:8080 *:* LISTEN 0 128 *:22 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 :::80 :::* LISTEN 0 128 :::22 :::* LISTEN 0 100 ::1:25 :::*
長鏈接指的是tcp連接創建以後,每一個資源獲取完成後不全斷開鏈接,而是繼續等待其餘資源請求;可是對於併發訪問量較大的服務器,長鏈接的使用會使得後續某些請求沒法獲得正常的響應。對於這種狀況, 可經過使用較短的長鏈接超時時長和設置較少的長鏈接請求數來緩解。
其配置命令爲:
keepalive On|off #是否啓動長鏈接 keepAliveTimeout 15 #長鏈接超時時間 MaxKeepAliveRequests 100 #最多保持多少個長鏈接請求
使用案例:
[root@localhost ~]# vim /etc/httpd/conf.d/keepalive.conf KeepAlive on KeepAliveTimeout 30 MaxKeepAliveRequests 100 [root@localhost ~]# systemctl restart httpd #重啓服務 [c:\~]$ telnet 192.168.0.109 80 #在電腦終端用telnet測試鏈接性 Connecting to 192.168.0.109:80... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. GET /index.html HTTP/1.1 Host:192.168.0.109 HTTP/1.1 200 OK Date: Tue, 01 May 2018 10:06:06 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Tue, 01 May 2018 10:03:41 GMT ETag: "d-56b2215c57e7e" Accept-Ranges: bytes Content-Length: 13 Content-Type: text/html; charset=UTF-8 hello,world/ GET /index2.html HTTP/1.1 #啓動了長鏈接後,能夠再次發起請求,直到到達超時時間;不啓動的話,完成一次請求報文後即會退出telnet。 Host:192.168.0.109 HTTP/1.1 200 OK Date: Tue, 01 May 2018 10:06:39 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Tue, 01 May 2018 10:05:43 GMT ETag: "15-56b221cfe406e" Accept-Ranges: bytes Content-Length: 21 Content-Type: text/html; charset=UTF-8 welcome to my office
在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>
參數 | 說明 |
---|---|
Indexes | 容許目錄瀏覽,當客戶僅指定要訪問的目錄,但沒有指定要訪問的文件,且目錄下不存在默認文檔時,顯示該目錄中的文件及子目錄列表索引 |
MultiViews | 容許內容協商的多重視圖,容許返回指定的訪問目錄下的相關聯的文件 |
All | All包含了除MultiViews以外的全部特性,如沒有指定options,默認爲All |
ExecCGI | 容許在該目錄下執行CGI腳本 |
FollowSymLinks | 容許跟蹤符號連接到源文件 |
Includes | 容許服務器端包含功能 |
IncludesNoExec | 容許服務器端包含功能,但禁止執行CGI腳本 |
None | 不調用options參數 |
AllowOverride
AllowOverride選項用於定義每一個目錄下.htaccess文件中的指令類型,但一般設置None。
Order
Order選項用於定義缺省的訪問權限與Allow和Deny語句的處理順序。
Allow/Deny
Allow和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
。
使用案例:
新建/data/html目錄,編輯修改httpd服務,使其可以web訪問/data/html目錄下的test.html目錄文件:
[root@localhost ~]# mkdir -pv /data/html #建立對應的web目錄 mkdir: created directory ‘/data’ mkdir: created directory ‘/data/html’ [root@localhost ~]# vim /data/html/test.html #建立指定html文件 this is a test page. [root@localhost ~]# chcon -R --reference /var/www/html/ /data/html/ #複製/var/www/html的selinux安全上下文到/data/html [root@localhost ~]# vim /etc/httpd/conf/httpd.conf #編輯主配置文件 #DocumentRoot "/var/www/html" #註釋原先默認的web根目錄 DocumentRoot "/data/html" #指定新建的目錄爲web根目錄 <Directory "/data/html"> #定義目錄 AllowOverride none Options none Require all granted </Directory> [root@localhost ~]# systemctl restart httpd #重啓httpd服務
在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.1六、172.16.0.0、172.16.0.0/1六、172.16.0.0/255.255.0.0。
而httpd-2.4中基於Ip地址訪問的控制是利用Require參數來實現的,其中Require參數可混合使用,以下例子:
<Directory "/data/html"> AllowOverride none Options none <RequireAll> Require ip [IP|NetAddr] #容許訪問的IP或網段 Require not ip [IP|NetAddr] #拒絕訪問的Ip或網段 </RequireAll> </Directory>
此外httpd-2.4版本中還能夠利用host名來進行訪問控制,如:
<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> [root@localhost ~]# systemctl restart httpd
在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. [root@localhost ~]# chcon -R --reference /var/www/ /data/userpasswd #修改userpasswd文件的安全上下文
隨後編輯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/Usergroup group1: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的web目錄後,你們確定都會躍躍欲試。可是經歷實操以後,你們可能就會去想着建立第二個web目錄,而後就發現建立的第二個web目錄沒法被正常讀取訪問。此時就須要利用到httpd服務的VirtualHost功能來幫助你們完成這個需求。
Apache虛擬主機就是在一個Apache服務器上配置多個虛擬主機,實現一個服務器提供多站點服務,其實就是訪問同一個服務器上的不一樣目錄。
虛擬主機支持三種訪問方式:
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs" #虛擬主機的web目錄 </VirtualHost>
使用案例:
利用virtualhost基於IP的方式實現/var/www/html目錄和/data/html目錄下的網頁文件的同時訪問:
[root@localhost ~]# ifconfig ens33:1 192.168.0.108/24 #添加第二個Ip地址 [root@localhost ~]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.109 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::b2a9:6dff:b894:5e61 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:74:5b:1f txqueuelen 1000 (Ethernet) RX packets 28472 bytes 38273549 (36.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4913 bytes 588675 (574.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens33:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.108 netmask 255.255.255.0 broadcast 192.168.0.255 ether 00:0c:29:74:5b:1f txqueuelen 1000 (Ethernet) [root@localhost ~]# vim /etc/httpd/conf/httpd.conf <VirtualHost 192.168.0.108:80> DocumentRoot "/data/html" #設置此虛擬主機的web根目錄 <Directory "/data/html"> AllowOverride none Options none Require all granted </Directory> </VirtualHost> [root@localhost ~]# systemctl restart httpd
Listen 8080 #在指定其餘端口時,需添加監聽語句 <VirtualHost 172.16.100.6:8080> #指定不一樣的port ServerName www.a.com DocumentRoot "/www/a.com/htdocs" </VirtualHost>
使用案例:
利用不一樣的端口,分別訪問/var/www/html和/data/html目錄下的網頁文件:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf Documentroot /var/www/html Listen 8080 #監聽8080端口 <virtualhost *:8080> 定義8080端口的虛擬主機 Documentroot /data/html #設置虛擬主機的web根目錄 <Directory "/data/html"> #設置目錄 AllowOverride none Options none Require all granted #容許全部人訪問 </Directory> </virtualhost> [root@localhost ~]# systemctl restart httpd
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>
使用案例:
根據不一樣的FQDN顯示不一樣的web頁面:
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf <virtualhost *:80> Servername www.a.com #設置域名爲www.a.com Documentroot /data/html #此虛擬主機對應/data/html目錄 <Directory "/data/html"> AllowOverride none Options none Require all granted </Directory> </virtualhost> <virtualhost *:80> Servername www.b.com #設置域名爲www.b.com Documentroot /data/html2 #此虛擬主機對應/data/html2目錄 <Directory "/data/html2"> AllowOverride none Options none Require all granted </Directory> </virtualhost> [root@localhost ~]# systemctl restart httpd
在測試的linux主機上編輯/etc/hosts文件:
[root@localhost ~]# vim /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.0.109 www.a.com #添加www.a.com的域名指向192.168.0.109 192.168.0.109 www.b.com #添加www.b.com的域名指向192.168.0.109
telnet 192.168.0.109 的80端口測試結果得:
[root@localhost ~]# telnet 192.168.0.109 80 Trying 192.168.0.109... Connected to 192.168.0.109. Escape character is '^]'. GET /index.html HTTP/1.1 Host:www.a.com #訪問的URL爲www.a.com HTTP/1.1 200 OK Date: Tue, 01 May 2018 09:33:20 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Tue, 01 May 2018 09:08:34 GMT ETag: "28-56b21509f361c" Accept-Ranges: bytes Content-Length: 40 Content-Type: text/html; charset=UTF-8 This is the index.html from /data/html. #顯示www.a.com對應的web內容 [root@localhost ~]# telnet 192.168.0.109 80 Trying 192.168.0.109... Connected to 192.168.0.109. Escape character is '^]'. GET /index.html HTTP/1.1 Host:www.b.com #訪問的URL爲www.b.com HTTP/1.1 200 OK Date: Tue, 01 May 2018 09:27:24 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Tue, 01 May 2018 09:21:38 GMT ETag: "29-56b217f57a00c" Accept-Ranges: bytes Content-Length: 41 Content-Type: text/html; charset=UTF-8 This is the index.html from /data/html2. #顯示了www.b.com對應的web內容
參考連接:
https://httpd.apache.org/docs/2.4/mod/mod_authz_core.html#require
http://httpd.apache.org/docs/2.4/mod/mod_authz_core.html