HTTPD之二————HTTPD服務詳解————httpd的配置檔案常見設定

上善若水~小輝發表於2021-07-05

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 為路徑時,是否區分大小寫,取決於檔案系統

官方幫助

http://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 http://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
[root@centos7conf.modules.d]#ls
00-base.conf  00-dav.conf  00-lua.conf  00-mpm.conf  00-proxy.conf  00-systemd.conf  01-cgi.conf
[root@centos7conf.modules.d]#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“
http://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/目錄,預設會優先訪問新建立的目錄路徑

[root@centos7conf.modules.d]#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

分析:

查詢http://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

[root@centos7conf.d]#mv welcome.conf  welcome.conf.bak  將配置檔案改名
[root@centos7conf.d]#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
[root@centos7conf.d]#ls
autoindex.conf  manual.conf  README  test.conf  userdir.conf  welcome.conf
[root@centos7conf.d]#mv welcome.conf  welcome.conf.bak
[root@centos7conf.d]#systemctl restart httpd

顯示效果:

image-20210618083943615

(2)FollowSymLinks:允許訪問符號連結檔案所指向的原始檔

[root@centos7conf.d]#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

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

[root@centos7conf.d]#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

參考幫助:http://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"
      http://www.magedu.com/download/bash.rpm
              ==>/www/htdocs/download/bash.rpm
Alias /download/ "/rpms/pub/"
    http://www.magedu.com/download/bash.rpm
             ==>/rpms/pub/bash.rpm
    http://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賬號一個讀許可權即可:

[root@centos7conf.d]#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  # 在上面的基礎上加入此選項,允許所有人登陸訪問

刪除使用者名稱:

[root@centos7conf.d]#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檔案中配置兩個使用者組賬號

[root@centos7conf.d]#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

訪問

http://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目錄:

[root@centos7conf.d]#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檔案

[root@centos7conf.d]#mkdir /data/{a,b,c}site
[root@centos7conf.d]#echo www.a.com > /data/asite/index.html
[root@centos7conf.d]#echo www.b.com > /data/bsite/index.html
[root@centos7conf.d]#echo www.c.com > /data/csite/index.html

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

[root@centos7conf.d]#ip a a 192.168.34.100 dev ens33
[root@centos7conf.d]#ip a a 192.168.34.111 dev ens33
[root@centos7conf.d]#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

相關文章