HTTPD之二————HTTPD服務詳解————httpd的配置文件常見設置

HTTPD之二————HTTPD服務詳解————httpd的配置文件常見設置

HTTP伺服器應用

http伺服器程式

httpd  apache
nginx
lighttpd

應用程式伺服器

IIS,asp
tomcat,jsp
jetty  開源的servlet容器,基於java的web容器
Resin CAUCHO公司,支援servlets和jsp的引擎
webshpere(IBM),weblogic(BEA),jboss,oc4j(oracle)

市場佔有率統計

www.netcraft.com

Httpd介紹

特性:

高度模組化:core + modules
DSO: Dynamic  Shared  Object 動態加卸載
NPM:multi-processing module多路處理模組

MPM工作模式

prefork:多進程I/O模型,每個進程響應一個請求,默認模型

一個主進程:生成和回收n個子進程,創建套接字,不響應請求
多個子進程:工作work進程,每個子進程處理一個請求:系統初始時,預先生成多個空閑進程,等待請求,最大不超過1024個

worker:復用的多進程I/O模型,多進程多執行緒,IIS使用此模型

一個主進程:生成m個子進程,每個子進程負責生成n個執行緒,每個執行緒響應一個請求,並發響應請求:m*n

event:事件驅動模型(Worker模型的變種)

一個主進程:生成m個子進程,每個進程直接響應n個請求,並發響應請求:m*n,有專門的執行緒來管理這些keep-alive類型的執行緒,當有真實請求時,將請求傳遞給服務執行緒,執行完畢後,又允許釋放。這樣增強了高並發場景下的請求處理能力
httpd-2.2:event 測試版,centos6默認
httpd-2.4:event 穩定版,centos7默認

prefork MPM

image-20210616080910580

worker MPM

image-20210616080936087

event MPM

image-20210616081000932

進程角色

image-20210616081038156

httpd功能特性

1> 虛擬主機
    IP、Port、FQDN
2> CGI:Common Gateway Interface,通用網關介面
3> 反向代理
4> 負載均衡
5> 路徑別名
6> 豐富的用戶認證機制
   basic
   digest
7> 支援第三方模組

httpd-2.4新特性

MPM支援運行為DSO機制;以模組形式按需載入
event MPM生產環境可用
非同步讀寫機制
支援每模組及每目錄的單獨日誌級別定義
每請求相關的專用配置
增強版的表達式分析式
毫秒級持久連接時長定義
基於FQDN的虛擬主機不需要NameVirutalHost指令
新指令,AllowOverrideList
支援用戶自定義變數
更低的記憶體消耗

Httpd 安裝

安裝方式:

rpm:centos發行版,穩定,建議使用 ``編譯:訂製或特殊需求

安裝httpd並啟動服務:

yum ``install` `httpd -y``systemctl start httpd

CentOS 7程式環境:httpd-2.4
配置文件:

/etc/httpd/conf/httpd``.conf``/etc/httpd/conf``.d/*.conf

檢查配置語法:

httpd –t

服務單元文件: /usr/lib/systemd/system/httpd.service

配置文件:/etc/sysconfig/httpd

服務控制和啟動:

systemctl ``enable``|disable httpd.service``systemctl {start|stop|restart|status} httpd.service

站點網頁文檔根目錄:

/var/www/html

模組文件路徑:  

/etc/httpd/modules``/usr/lib64/httpd/modules

主程式文件:

/usr/sbin/httpd

主進程文件:

/etc/httpd/run/httpd``.pid

日誌文件目錄:

/var/log/httpd``access_log: 訪問日誌``error_log:錯誤日誌

安裝幫助文檔包:

yum isntall httpd-manual -y

注意:安裝完幫助手冊之後,重啟httpd服務,沒有網路也可以在網上輸入指定的IP地址加manual手冊就可以查看幫助手冊。

示例:192.168.34.100/manual  

image-20210616081327266

Httpd常見配置

httpd配置文件的組成:

主要組成:

Global Environment
Main Server configuration
virtual host

配置格式:directive value

directive 不區分字元大小寫
value 為路徑時,是否區分大小寫,取決於文件系統

官方幫助

//httpd.apache.org/docs/2.4/

(2)httpd配置文件的組成:修改前先備份,養成好備份

vim /etc/httpd/httpd.conf

為了避免文件比較混亂可以新建一個測試文件單獨存放寫入的配置文件資訊即可

vim /etc/httpd/conf.d/testconf
ServerTokens Prod
systemctl reload httpd  重新載入httpd服務

測試顯示資訊結果

[root@centos7html]#curl -I //192.168.34.100/
HTTP/1.1 403 Forbidden
Date: Wed, 27 Nov 2019 13:04:46 GMT
Server: Apache    可以看到此時只是顯示apache頭部
Last-Modified: Thu, 16 Oct 2014 13:20:58 GMT
ETag: "1321-5058a1e728280"
Accept-Ranges: bytes
Content-Length: 4897
Content-Type: text/html; charset=UTF-8

image-20210616083604418

配置文件在的設置      首部顯示的資訊

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 越詳細越不安全

image-20210616083632428

修改監聽的IP和Port

Listen [IP:]PORT
(1) 省略IP表示為本機所有IP
(2) Listen指令至少一個,可重複出現多次

Listen 80 
Listen 8080

示例:

Listen 192.168.1.100:8080
Listen 80

指定固定的IP地址和監聽埠固定綁定

vim /etc/httpd/conf/httpd.conf
Listen 192.168.34.100:9527 監聽指定的IP地址和埠號

image-20210616083754032

在/var/www/html目錄下創建一個index.html文件

image-20210616083819739

在另外一個終端監聽,此時就必須指定IP地址和埠號才能監聽到具體的內容

image-20210616083852695

持久連接

Persistent Connection:連接建立,每個資源獲取完成後不會斷開連接,而是繼續等待其它的請求完成,默認關閉持久連接``斷開條件:時間限制:以秒為單位, 默認5s,httpd-2.4 支援毫秒級``副作用:對並發訪問量大的伺服器,持久連接會使有些請求得不到響應``折衷:使用較短的持久連接時間

設置:KeepAlive On|Off 默認支援長久連接

KeepAliveTimeout 15  默認是以s為單位,斷開時長

測試:telnet WEB_SERVER_IP PORT

GET /URL HTTP/1.1
Host: WEB_SERVER_IP

開始驗證斷開時長情況:

vim /etc/httpd/conf.d/test.conf
KeepAliveTimeout 15      設置斷開時長為15s
systemctl reload  httpd     重新載入httpd

image-20210616084031493

此時在另一個主機上連接配置好的連接超時時長機器,連接超過15s之後就會自定斷開

[root@centos777~]#telnet  192.168.34.100 80
Trying 192.168.34.100...
Connected to 192.168.34.100.
Escape character is '^]'.
GET /index.html HTTP/1.1
HOST: 1.1.1.1

MPM( Multi-Processing Module)多路處理模組

prefork, worker, event

切換使用的MPM,默認使用prefork模組較多

vim ``/etc/httpd/conf``.modules.d``/00-mpm``.conf

啟用要啟用的MPM相關的LoadModule指令即可

查看靜態編譯的模組

httpd -l

查看靜態編譯及動態裝載的模組

httpd –M

動態模組載入:不需重啟即生效

動態模組路徑

/usr/lib64/httpd/modules/

修改模組配置,只需要將前面的注釋去掉,重啟httpd服務,就可以使用當前的模組:

vim /etc/httpd/conf.modules.d/00-mpm.conf 

image-20210616084215615

prefork的配置:

StartServers         8   # 一開始啟動服務時有8個進程
MinSpareServers      5  # 最小空閑進程
MaxSpareServers      20 # 最大空閑進程
ServerLimit 256     # 最多進程數,最大20000
MaxRequestsPerChild  4000  # 子進程最多能處理的請求數量。在處理MaxRequestsPerChild 個請求之後,子進程將會被父進程終止,這時候子進程佔用的記憶體就會釋放(為0時永遠不釋放)
MaxClients 256      # 最大並發數

修改httpd的include包含的以*.conf結尾的配置文件,防止與主配置文件混亂,限制進程數與並發數,設置情況需要根據生產環境進行設置,設置完之後重啟httpd服務:systemctl restart httpd

[root@centos7 ~]# vim /etc/httpd/conf.d/test.conf
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000

worker的配置:

ServerLimit       16    最多執行緒數
StartServers       2    一開始準備2個執行緒
MaxRequestWorkers 150   最大處理請求數量
MinSpareThreads    25   最小空閑進程
MaxSpareThreads   75    最大空閑進程
ThreadsPerChild   25     每個子執行緒的25個最大執行緒

與上面的prefork配置同理,需要開啟work模組,並設置work模組的最大執行緒與進程,限制大小可以根據實際生產環境進行設置。

[root@centos7 ~]# vim /etc/httpd/conf.d/test.conf
ServerLimit 16
StartServers 2
MaxRequestWorkers 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25

DSO: Dynamic Shared Object

載入動態模組配置

/etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf

配置指定實現模組載入格式:

LoadModule <mod_name> <mod_path>

模組文件路徑可使用相對路徑:相對於ServerRoot(默認/etc/httpd)

示例:

LoadModule auth_basic_module
modules/mod_auth_basic.so

演示:

如果不想讓此LoadModule auth_basic_module模組不再生效,直接在配置文件中注釋掉此模組即可

[root@centos7~]#cd /etc/httpd/conf.modules.d
[[email protected]]#ls
00-base.conf  00-dav.conf  00-lua.conf  00-mpm.conf  00-proxy.conf  00-systemd.conf  01-cgi.conf
[[email protected]]#vim 00-base.conf   在此配置文件中修改配置文件

image-20210617083647453

由於已經被注釋掉,此時已經搜不到此模組資訊:

httpd -M |grep basic

image-20210617083722181

再將配置文件中的模組再修改回去,此時再驗證結果

vim /etc/httpd/conf.modules.d/00-base.conf,將要啟用的模組的#去掉即可,此時已經能查看到當前的模組

image-20210617083744390

定義’Main’ server的文檔頁面路徑

DocumentRoot 「/path」

文檔路徑映射:

DocumentRoot指向的路徑為URL路徑的起始位置

示例:

DocumentRoot "/app/data「
//HOST:PORT/test/index.html --> /app/data/test/index.html

注意:SELinux和iptables的狀態

練習:

新建一個/data/www目錄,將訪問的網站頁面是此目錄,我們怎麼去修改呢?

[root@centos7data]#mkdir /data/www
[root@centos7data]#cp /var/www/html/index.html /data/www/
[root@centos7 ~]# echo welcome to beijing > /data/www/index.html

修改定義文件格式,將文件格式可以寫入到臨時的文件中,在include包含的*.conf配置文件中指定新的訪問網頁路徑,不需要注釋掉httpd默認的主配置文件的/var/www/html/目錄,默認會優先訪問新創建的目錄路徑

[[email protected]]#vim /etc/httpd/conf.d/test.conf
DocumentRoot "/data/www"
<Directory "/data/www">
Require all granted
</Directory>

image-20210617083941716

修改完之後重新啟動httpd服務

systemctl restart httpd

此時可以通過/data/html訪問頁面。

image-20210617084120792

定義站點主頁面

搜索:/DirectoryIndex

格式:DirectoryIndex index.html index.html.var

分析:

查詢//192.168.30.106/ 及其子目錄時,不指定文件,可以默認打開目錄下的index.html文件

在配置文件中默認的模組語句,優先使用index.html文件

vim /etc/httpd/conf/httpd.conf

<IfModule dir_module>
    DirectoryIndex index.html                        </IfModule>

image-20210617084230701

如果將baidu.html寫在index.html上面,此時的優先順序高於index.html文件,優先訪問的就是baidu.html

image-20210618083404331

子配置文件 /etc/httpd/conf.d/welcome.confwelcome.conf不是以conf結尾的文件,且將/var/www/html/目錄下的index.html文件移動到別的目錄下,此時訪問頁面時就會報錯

image-20210618083446462

[[email protected]]#mv welcome.conf  welcome.conf.bak  將配置文件改名
[[email protected]]#systemctl restart httpd
[root@centos7data]#mv /var/www/html/index.html /data/    將index.html文件移動到data目錄下

重啟httpd服務:systemctl restart httpd

報錯頁面,此時被拒絕訪問:

img

站點訪問控制常見機制

可基於兩種機制指明對哪些資源進行何種訪問控制訪問控制機制有兩種:客戶端來源地址,用戶帳號
文件系統路徑:

<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">

中「基於源地址」實現訪問控制

(1) Options:後跟1個或多個以空白字元分隔的選項列表,可在總配置文件中修改,也可從創建一個自配置文件中修改設置

在選項前的+,- 表示增加或刪除指定選項

常見選項:

Indexes:指明的URL路徑下不存在與定義的主頁面資源相符的資源文件時,返回索引列表給用戶
FollowSymLinks:允許訪問符號鏈接文件所指向的源文件
None:全部禁用
All: 全部允許

在新建的文件夾中進行設置/etc/httpd/conf.d/test.conf

vim /etc/httpd/conf.d/test.conf

<directory /data/www>
options indexes       指明URL路徑下部存在於定義的主頁面資源相符的資源文件時,返回列表給用戶                 Require  all granted
</directory>

image-20210618083800112

配置文件中指明要訪問的文件路徑:vim /etc/httpd/conf/httpd.conf

image-20210618083846664

將/etc/httpd/conf.d/welcome.conf的配置文件進行修改並重啟httpd服務,然後再網頁訪問,此時就可以顯示文件列表資訊:

[root@centos7html]#cd /etc/httpd/conf.d
[[email protected]]#ls
autoindex.conf  manual.conf  README  test.conf  userdir.conf  welcome.conf
[[email protected]]#mv welcome.conf  welcome.conf.bak
[[email protected]]#systemctl restart httpd

顯示效果:

image-20210618083943615

(2)FollowSymLinks:允許訪問符號鏈接文件所指向的源文件

[[email protected]]#cd /data/www
[root@centos7www]#ls
baidu.html  index.html.bak  shenzhen.html
[root@centos7www]#ln -s /etc etcdir  將etc創建一個軟連接,軟連接名為etcdir

在新建的文件中修改配置文件,允許訪問軟連接的源文件

vim /etc/httpd/conf.d/test.conf
<directory /data/www>
options indexes FollowSymLinks   允許訪問軟連接的源文件                                                                                                      
Require  all granted
</directory>

重啟httpd服務

systemctl restart httpd  

在網頁上查看效果,此時可以看到etcdir軟鏈接到etc下的文件:

image-20210618084115027

image-20210618084139030

示例一:

<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>

(3)AllowOverride

與訪問控制相關的哪些指令可以放在指定目錄下的.htaccess(由AccessFileName指定)文件中,覆蓋之前的配置指令

只對語句有效

AllowOverride All: .htaccess中所有指令都有效
AllowOverride None: .htaccess 文件無效,默認不寫就是文件無效
AllowOverride AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都無法覆蓋

在/data/www/目錄下新建一個.htaccess文件,並將指定的指令添加到該文件中

cd /data/www   切換到www目錄下
vim .htaccesss  新建一個.htaccess文件
options indexes FollowSymLinks   允許使用的指令

然後在/etc/httpd/conf.d/test.conf配置文件中修改相關配置文件,允許所有指令有效:

vim /etc/htttpd/conf.d/test.conf

<directory /data/www>
allowoverride  all
#options indexes FollowSymLinks                     Require  all granted
</directory>

image-20210618084426110

重啟httpd服務:

systemctl restart httpd

查看網頁效果,可以訪問結果:

image-20210618084500590

(4)基於IP的訪問控制:

1> 無明確授權的目錄,默認拒絕
2> 允許所有主機訪問:Require all granted
3> 拒絕所有主機訪問:Require all denied
4> 控制特定的IP訪問:
           Require ip IPADDR:授權指定來源的IP訪問
           Require not ip IPADDR:拒絕特定的IP訪問
5> 控制特定的主機訪問:
           Require host HOSTNAME:授權特定主機訪問
           Require not host HOSTNAME:拒絕 HOSTNAME:
6> FQDN:特定主機
          domin.tld:指定域名下的所有主機

不能有失敗,至少有一個成功匹配才成功,即失敗優先

<RequireAll>
Require all granted
Require not ip 172.16.1.1 拒絕特定IP
</RequireAll>

多個語句有一個成功,則成功,即成功優先

<RequireAny>
Require all denied    所有都不可以訪問
require ip 172.16.1.1 允許特定IP
</RequireAny>

演示:

先將/etc/httpd/conf.d目錄下的welcome.conf.bak恢復為welcome.conf

cd /etc/httpd/conf.d
mv welcome.conf.bak  welcome.conf

在配置文件中/etc/httpd/conf.d/test.conf修改內容,不允許192.168.34.101訪問

<directory /data/www>
<requireall>     此配置需要嵌套在directory中
Require  all granted
require not ip 192.168.34.101  拒絕192.168.34.101進行訪問
</requireall>                                       </directory>

檢查語法:httpd -t 並重啟httpd服務。

image-20210618084728236

用192.168.34.101主機進行遠程登錄嘗試,此時訪問拒絕:

curl -I 192.168.34.100

image-20210618084747039

192.168.34.102訪問100的主機正常:

image-20210618084812106

演示:

在配置文件中/etc/httpd/conf.d/test.conf修改內容,只允許192.168.34.101IP地址訪問

<directory /data/www>
<requireany>
Require  all denied
require ip 192.168.34.101
</requireany>                                                                              
</directory>

image-20210618084909657

httpd -t 檢查語法,重啟httpd服務。

image-20210618084929193

192.168.34.101主機訪問正常

image-20210618084956494

192.168.34.102訪問被拒絕:

image-20210618085020430

演示:也可以針對特定的文件夾進行訪問控制

[[email protected]]#cd /data/www/
[root@centos7www]#mkdir news
[root@centos7data]#echo /data/www/index.html > www/news/index.html

修改新建test.conf配置文件資訊

vim /etc/httpd/conf.d/test.conf
<directory /data/www>   允許訪問/data/www目錄下的文件
Require  all granted
</directory>                                          <directory /data/www/news>  不允許訪問/data/www/news目錄下的資訊
Require  all denied
</directory>

查看結果,此時可以訪問到/data/www目錄下的index.html文件,不能訪問到news目錄下的文件

image-20210618085140678

日誌設定

日誌類型:

訪問日誌
錯誤日誌

錯誤日誌

ErrorLog logs/error_log
LogLevel warn
LogLevel 可選值: debug, info, notice, warn,error, crit, alert, emergmo

httpd伺服器默認的錯誤日誌路徑:/etc/httpd/logs/error_log

用戶訪問網頁的日誌默認存放路徑在/var/log/httpd/目錄下

image-20210621075836902

訪問日誌:
定義日誌格式:LogFormat format strings

LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" testlog

使用日誌格式:

CustomLog logs``/access_log` `testlog

參考幫助://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

%h 客戶端IP地址
%l 遠程用戶,啟用mod_ident才有效,通常為減號「-」
%u 驗證(basic,digest)遠程用戶,非登錄訪問時,為一個減號「-」
%t 伺服器收到請求時的時間
%r First line of request,即表示請求報文的首行;記錄了此次請求的「方法」,「URL」以及協議版本
%>s 響應狀態碼
%b 響應報文的大小,單位是位元組;不包括響應報文http首部
%{Referer}i 請求報文中首部「referer」的值;即從哪個頁面中的超鏈接跳轉至當前頁面的
%{User-Agent}i 請求報文中首部「User-Agent」的值;即發出請求的應用程式

在配置文件中/etc/httpd/conf/httpd.conf搜索/combined能具體看到日誌格式和定義,如下圖:

可以在此配置文件中定義名稱和格式:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined # 兩個combined需要對應才能使用``CustomLog "logs/access_log" combined

image-20210621080151338

查詢成功與錯誤日誌:

image-20210621080258257

幫助文檔中可以查詢具體含義:

image-20210621080350339

設定默認字符集

AddDefaultCharset UTF-8 此為默認值
中文字符集:GBK, GB2312, GB18030

可以新建一個配置文件/etc/httpd/conf.d/test.conf中修改字符集:

image-20210621080456348

定義路徑別名

格式:Alias /URL/ “/PATH/” 有沒有都無所謂,虛擬的目錄

DocumentRoot "/www/htdocs"
      //www.magedu.com/download/bash.rpm
              ==>/www/htdocs/download/bash.rpm
Alias /download/ "/rpms/pub/"
    //www.magedu.com/download/bash.rpm
             ==>/rpms/pub/bash.rpm
    //www.magedu.com/images/logo.png
             ==>/www/htdocs/images/logo.png

演示:

新建一個sports目錄,將index.html文件放到sports目錄下

[root@centos7data]#mkdir sports
[root@centos7data]#ls
sports  www
[root@centos7data]#cp www/index.html  sports/

在新建的配置文件中/etc/httpd/conf.d/test.conf中添加別名配置文件,定義別名為sports

vim /etc/httpd/conf.conf/test.conf

image-20210621080757247

重啟httpd服務:systemctl restart httpd

查看網頁顯示結果:

image-20210621080835846

基於用戶的訪問控制

1)認證質詢:WWW-Authenticate:響應碼為401,拒絕客戶端請求,並說明要求客戶端提供帳號和密碼

2)認證:Authorization:客戶端用戶填入帳號和密碼後再次發送請求報文;認證通過時,則伺服器發送響應的資源

3)認證方式兩種:

basic:明文
digest:消息摘要認證,兼容性差

4)安全域:需要用戶認證後方能訪問的路徑;應該通過名稱對其進行標識,以便於告知用戶認證的原因

5)用戶的帳號和密碼

虛擬帳號:僅用於訪問某服務時用到的認證標識
存儲:文本文件,SQL資料庫,ldap目錄存儲,nis等

basic認證配置示例:
(1) 定義安全域

<Directory 「/path">
Options None
AllowOverride None
AuthType Basic
AuthName "String「
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
</Directory>

允許帳號文件中的所有用戶登錄訪問:

Require valid-user

提供帳號和密碼存儲(文本文件)

使用專用命令完成此類文件的創建及用戶管理

需要安裝httpd-tools包:

[root@centos7 httpd]# yum install httpd-tools -y

htpasswd [options] /PATH/HTTPD_PASSWD_FILE username

-c 自動創建文件,僅應該在文件不存在時使用
-p 明文密碼
-d CRYPT格式加密,默認
-m md5格式加密
-s sha格式加密
-D 刪除指定用戶

指定特定的用戶進行訪問網頁

新建一個admin目錄,並將文件的路徑指向admin目錄下的index.html下:

[root@centos7www]#pwd
/data/www
[root@centos7www]#mkdir admin
[root@centos7www]#echo /data/www/admin/index.html > /data/www/admin/index.html  將文件指向admin目錄下的index.html文件中

創建一個httpdpass文件、tom和jerry用戶

[root@centos7data]#htpasswd -c /etc/httpd/conf.d/httpdpass tom 創建tom用戶和httpdpass文件
New password:
Re-type new password:
Adding password for user tom
[root@centos7data]#htpasswd -s /etc/httpd/conf.d/httpdpass jerry  創建jerry用戶時,不要再創建文件,不然會覆蓋httpdpass文件,因此可以用默認的-s選項加密
New password:
Re-type new password:
Adding password for user jerry

修改新創建的文件許可權

[root@centos7data]#chmod 600 /etc/httpd/conf.d/httpdpass

只賦予apache帳號一個讀許可權即可:

[[email protected]]#setfacl -m u:apache:r /etc/httpd/conf.d/httpdpass

修改新建的配置文件:

vim /etc/httpd/conf.d/test.conf  修改此配置文件
<directory /data/www/admin>                                           
AuthType Basic
AuthName "welcome to login"
AuthUserFile "/etc/httpd/conf.d/httpdpass"
Require user tom  只允許tom訪問此文件
</directory>

image-20210621081321030

檢查httpd服務的配置文件資訊,並將httpd服務重啟

[root@centos7www]#httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe9d:204e. Set the 'ServerName' directive globally to suppress this message
Syntax OK
[root@centos7www]#systemctl restart httpd

image-20210621081648360

驗證網頁效果,並登陸

image-20210621082117327

image-20210621082128786

允許所有人登陸訪問網頁

第一種實現方法:

設置所有人都能登錄,需要加入valid-user選項即可,然後重啟httpd服務:

DocumentRoot "/data/www"
<directory /data/www/admin>
AuthType Basic
AuthName "welcome to login"
AuthUserFile "/etc/httpd/conf.d/httpdpass"
#Require user tom
Require valid-user  # 在上面的基礎上加入此選項,允許所有人登陸訪問
</directory>

image-20210621082408696

第二種實現方法:

vim /etc/httpd/conf.d/test.conf  # 在配置文件中修改
DocumentRoot "/data/www"
<directory /data/www/admin>
allowoverride  authconfig     # 允許在/data/www/admin/.htaccess文件基於驗證登陸訪問網頁
</directory>
 
vim  /data/www/admin/.htaccess  # 在.htaccess文件中配置允許所有人訪問
AuthType Basic
AuthName "welcome to login"
AuthUserFile "/etc/httpd/conf.d/httpdpass"
#Require user tom
Require valid-user  # 在上面的基礎上加入此選項,允許所有人登陸訪問

刪除用戶名:

[[email protected]]#htpasswd -D /etc/httpd/conf.d/httpdpass jerry
Deleting password for user jerry

基於組帳號進行認證

(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 ...

實現組認證登陸網頁

在httpdgroup文件中配置兩個用戶組帳號

[[email protected]]#vim /etc/httpd/conf.d/httpdgroup
testgroup:tom jerry  

在.htaccess中修改配置文件:

vim /data/www/.htaccess  # 在
AuthType Basic
AuthName "welcome to login"
AuthUserFile "/etc/httpd/conf.d/httpdpass"
AuthGroupFile "/etc/httpd/conf.d/httpdgroup"  # 只有此組裡邊的用戶名訪問httpdpass文件                     Require group testgroup  # 允許分組進行登陸網頁,與上面允許用戶訪問類似。

遠程客戶端和用戶驗證的控制

Satisfy ALL|Any

(1)ALL 客戶機IP和用戶驗證都需要通過才可以

(2)Any客戶機IP和用戶驗證,有一個滿足即可

實現用戶家目錄的http共享

基於模組mod_userdir.so實現

SELinux: http_enable_homedirs

相關設置:

vim /etc/httpd/conf/httpd.conf
<IfModule mod_userdir.c>
#UserDir disabled
UserDir public_html #指定共享目錄的名稱
</IfModule>

準備目錄

su - wang;mkdir ~/public_html
setfacl -m u:apache:x ~wang

訪問

//localhost/~wang/index.html

提問:我們如何將用戶帳號家目錄的指定目錄共享在網頁上?

下來我介紹一下:

先在/etc/httpd/conf.d/目錄下查看一個配置文件userdir.conf:

[root@centos7data]#ls /etc/httpd/conf.d
autoindex.conf  httpdgroup  httpdpass  manual.conf  README  test.conf  userdir.conf  welcome.conf

image-20210621082957764

配置userdir.conf文件裡邊的內容:

vim /etc/httpd/conf.d/userdir.conf

image-20210621083046562

重啟httpd服務:systemctl restart httpd

此時切換至wang用戶,然後創建一個public_html目錄:

[[email protected]]#su - wang
Last login: Sun Nov 24 22:07:47 CST 2019 on pts/0
[wang@centos7~]$pwd
/home/wang
[wang@centos7~]$mkdir public_html
[wang@centos7~]$echo wanghome_public_html > public_html/index.html

image-20210621083133359

給apache帳號一個執行許可權,可以切換到/home/wang目錄下,並能查看資訊:

[wang@centos7~]$setfacl -m u:apache:x /home/wang

查看此時的網頁頁面:

192.168.34.100/~wang

image-20210621083225889

如果想將wang家目錄加密讓指定的用戶訪問,對家目錄進行加密,怎麼辦?只需要修改配置文件,在最底部寫入內容:

vim /etc/httpd/conf.d/userdir.conf

<directory /home/wang/public_html>
authtype basic
authname "wang home"
authuserfile "/etc/httpd/conf.d/httpdpass"
require user tom
</directory>

image-20210621083304327

重啟httpd服務:systemctl restart httpd

查看網頁效果:

image-20210621083324132

登陸tom帳號才能看到家目錄wang帳號資訊:

image-20210621083348761

ServerSignature On | Off | EMail

(1)當客戶請求的網頁並不存在時,伺服器將產生錯誤文檔,預設情況下由於打開了 ServerSignature選項,錯誤文檔的最後一行將包含伺服器的名字、Apache的版本等資訊

(2)如果不對外顯示這些資訊,就可以將這個參數設置為Off,默認是關閉的。

(3)設置為Email,將顯示ServerAdmin 的Email提示

status頁面

這個功能需要status_module 模組

httpd -M | grep status 查詢這個模組有沒有被載入

image-20210621083436716

LoadModule status_module modules/mod_status.so 模組總配置文件已經載入

為了安全起見,只能允許部分IP地址訪問狀態頁:

<Location "/status">  此處status只是文件夾的名稱,訪問時使用此名稱訪問即可
SetHandler server-status   系統自帶的內部處理模組
<requireany>
require all denied   # 拒絕所有IP地址
require ip 192.168.7.0/24  # 允許IP地址段進行訪問
</requireany>
</Location>

ExtendedStatus On 顯示擴展資訊,默認是打開的

演示:我們可以查看apache是否有問題,可以將此配置寫入到配置文件中,查看網頁資訊,然後確定apache是否正常

在vim /etc/httpd/conf.d/test.conf

image-20210621083523517

重啟httpd服務:systemctl restart httpd

image-20210621083636681

image-20210621083659457

狀態的類型:

"-"等待連接 "S"啟動 "R"處於讀取狀態
 
"W"發送應答 "K"保持長連接 "D"dns查詢
 
"C"正處於關閉狀態 "L"記錄日誌 "G"優雅的終止,溫柔的斷開
 
"r"把空閑的worker進程清理 "."沒有正常的進程

虛擬主機

站點標識: socket

IP相同,但埠不同
IP不同,但埠均為默認埠,此方式用的不多
FQDN不同: 請求報文中首部 Host: www.magedu.com   用法最多

有三種實現方案:

基於ip:為每個虛擬主機準備至少一個ip地址
基於port:為每個虛擬主機使用至少一個獨立的port
基於FQDN:為每個虛擬主機使用至少一個FQDN

虛擬主機的配置方法:

<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot 「/path"
</VirtualHost>

建議:上述配置存放在獨立的配置文件中
其它可用指令:

ServerAlias:虛擬主機的別名;可多次使用
ErrorLog: 錯誤日誌
CustomLog:訪問日誌
<Directory 「/path"> </Directory>
Alias

實驗一:基於IP的多虛擬主機(不推薦)

(1)新建三個目錄和三個index.html文件

[[email protected]]#mkdir /data/{a,b,c}site
[[email protected]]#echo www.a.com > /data/asite/index.html
[[email protected]]#echo www.b.com > /data/bsite/index.html
[[email protected]]#echo www.c.com > /data/csite/index.html

(2)由於本機器只有兩個IP地址,此時再新加一個IP地址:

[[email protected]]#ip a a 192.168.34.100 dev ens33
[[email protected]]#ip a a 192.168.34.111 dev ens33
[[email protected]]#ip a a 192.168.34.112 dev ens33

(3)在/etc/httpd/conf.d/test.conf文件中修改配置:

<virtualhost 192.168.34.100:80>
documentroot  "/data/asite"
<directory /data/asite>
require all granted
</directory>
customlog /var/log/httpd/access_a.log  combined
</virtualhost>
 
<virtualhost 192.168.34.111:80>                                                                                                       
documentroot  "/data/bsite"
<directory /data/bsite>
require all granted
</directory>
customlog /var/log/httpd/access_b.log  combined
</virtualhost>
 
<virtualhost 192.168.34.112:80>                                                                                                       
documentroot  "/data/csite"
<directory /data/csite>
require all granted
</directory>
customlog /var/log/httpd/access_c.log  combined
</virtualhost>

image-20210621084129181

重啟httpd服務:systemctl restart httpd

配置DNS解析域名,此時我們不需要麻煩,直接將IP地址寫入到hosts文件中即可

[root@centos7 httpd]# cat  /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.34.100 www.a.com
192.168.34.111 www.b.com
192.168.34.112 www.c.com

查看當前IP地址分配的網址,此時都已經可以訪問,此做法缺點就是需要大量的IP地址進行做網站。

[root@centos7 httpd]# curl www.a.com
www.a.com
[root@centos7 httpd]# curl www.b.com
www.b.com
[root@centos7 httpd]# curl www.c.com
www.c.com

實驗二:基於埠的多虛擬主機(不推薦)

此方法在用戶輸入每個網頁的埠號,比較繁瑣,不建議使用

修改配置文件/etc/httpd/conf.d/test.conf

listen 81 監聽81埠
listen 82 監聽82埠
listen 83 監聽83埠
<virtualhost *:81>  將IP地址改為*,埠號改為81
documentroot  "/data/asite"
<directory /data/asite>
require all granted
</directory>
customlog /var/log/httpd/access_a.log  combined
</virtualhost>
 
<virtualhost *:82>    將IP地址改為*,埠號改為82                                                                                             
documentroot  "/data/bsite"
<directory /data/bsite>
require all granted
</directory>
customlog /var/log/httpd/access_b.log  combined
</virtualhost>
 
<virtualhost *:83>   將IP地址改為*,埠號改為83                                                                                                  
documentroot  "/data/csite"
<directory /data/csite>
require all granted
</directory>
customlog /var/log/httpd/access_c.log  combined
</virtualhost>  

image-20210621084511268

重啟httpd服務,systemctl restart httpd

修改/etc/hosts域名解析文件,將所有域名都指向本機的一個IP地址。

[root@centos7 conf.d]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.7.100  www.a.com www.b.com www.c.com

驗證結果,可以看出,只需要一個IP地址,指定埠就可以訪問網頁

[root@centos7www]#curl 192.168.34.100:81
www.a.com
[root@centos7www]#curl 192.168.34.100:82
www.b.com
[root@centos7www]#curl 192.168.34.100:83
www.c.com

實驗三:基於主機頭多虛擬主機(推薦)

A主機:192.168.34.100 提供網站

B主機:192.168.34.101 客戶端,訪問網頁

注意:任意目錄下的頁面只有顯式授權才能被訪問

基於FQDN實現的方式原理:用戶訪問網站,在http內就會攜帶主機頭,因此我們可以利用此特性,根據主機頭來判斷用戶訪問的是哪個網站,然後返回對應的頁面。

(1)在A主機(網站)和B主機上(客戶端)的/etc/hosts配置文件中寫入相關的IP地址和網址,指向A主機的IP地址,域名解析代替DNS解析

vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 centos7.localdomain
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.34.100 www.a.com www.b.net www.c.cn   # 其中192.168.34.100是A主機的IP地址

image-20210621084642995

(2)在A主機上修改/etc/httpd/conf.d/test.conf配置文件內容:

<virtualhost *:80>
servername "www.a.com"  # 將訪問的網址寫入到主機內
documentroot  "/data/asite"
<directory /data/asite>
require all granted
</directory>
customlog /var/log/httpd/access_a.log  testlog
</virtualhost>
 
<virtualhost *:80>
servername "www.b.net"  # 將訪問的網頁寫入到主機內
documentroot  "/data/bsite"
<directory /data/bsite>
require all granted
</directory>
customlog /var/log/httpd/access_b.log  testlog
</virtualhost>
 
<virtualhost *:80>
servername "www.c.cn"
documentroot  "/data/csite"
<directory /data/csite>
require all granted
</directory>
customlog /var/log/httpd/access_c.log  testlog
</virtualhost>

image-20210621084801319

(3)在B主機上測試實現訪問結果,此時三個網址都可以訪問

image-20210621084825289

mod_deflate壓縮模組(生產中很重要,網頁必須壓縮)

使用mod_deflate模組壓縮頁面優化傳輸速度

適用場景:

(1) 節約頻寬,額外消耗CPU;同時,可能有些較老瀏覽器不支援

[root@centos7 conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@centos7 conf.modules.d]# cat 00-base.conf |grep deflate  # 查看此模組是否載入,如果沒有載入,就需要啟動,此時我們看到此模組已經載入了。
LoadModule deflate_module modules/mod_deflate.so

(2) 壓縮適於壓縮的資源,例如文本文件

LoadModule deflate_module modules/mod_deflate.so SetOutputFilter DEFLATE
SetOutputFilter DEFLATE
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain  # 壓縮為純文本
AddOutputFilterByType DEFLATE text/html  # 壓縮html後綴的文件
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css

(3)Level of compression (Highest 9 – Lowest 1)

(4)DeflateCompressionLevel 9 壓縮比

(5)排除特定舊版本的瀏覽器,不支援壓縮

Netscape 4.x 只壓縮text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html
Netscape 4.06-08三個版本 不壓縮
BrowserMatch ^Mozilla/4\.0[678] no-gzip
Internet Explorer標識本身為「Mozilla / 4」,但實際上是能夠處理請求的壓縮。如果用戶代理首部匹配字元串「MSIE」(「B」為單詞邊界」),就關閉之前定義的限制
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html  

實驗:壓縮網站頁面

(1)在A主機上,將之前配置過的文件中進行修改,壓縮指定的虛擬機中的網頁

vim /etc/httpd/conf.d/test.conf

<virtualhost *:80>
documentroot  "/data/asite"
servername www.a.com
<directory /data/asite>
require all granted
</directory>
customlog /var/log/httpd/access_a.log combined
AddOutputFilterByType DEFLATE text/plain    # 將plain格式壓縮為text格式
AddOutputFilterByType DEFLATE text/html     # 將html壓縮為text格式
DeflateCompressionLevel 9     # 壓縮比,9為最高壓縮比
</virtualhost>

image-20210621085045073

(2)重啟服務:systemctl restart httpd

(3)將系統日誌傳到/data/asite目錄下

[root@centos7asite]#cp /var/log/messages /data/asite/m.txt
[root@centos7asite]#chmod +r /data/asite/m.txt

(4)在B主機上驗證壓縮後的網頁結果,此時是以gzip壓縮格式顯示。

curl -I –compressed www.a.com/m.txt

image-20210622075656620

(5)在網頁上訪問,查看頭報文,可以看到此時的網站已經被壓縮。

image-20210622075739988

image-20210622075858227