1.apache HTTP server介紹
httpd項目地址:
https://httpd.apache.org/
在Apache2中有三種工作模式,使用者可以根據不同的業務場景來進行選擇
(1)prefork模式
prefork模式是一種老而穩的模式:
一個主進程管理者多個子進程,每個子進程單獨處理用戶請求,它比較占內存,但穩定,能夠設置進程數量上下限,適合訪問量不大的場景(Liunx下最多同時處理1024個連接)
優點:工作穩定
缺點:每個用戶請求需要對應開啟一個線程,占用資源較多,并發性差,不適用于高并發場景
(2)worker模式
一種多進程和多線程混合的模型,有一個控制進程,啟動多個子進程,每個子進程里面包含固定的線程,使用線程來處理請求,當線程不夠用的時候會再啟動一個新的子進程,然后在進程里面再啟動線程處理請求,由于其使用了線程處理請求,因此可以承受更高的并發
優點:相比prefork模型,其占用的內存較少,可以同時處理更多的請求
缺點:使用keepalive的長連接方式,某個線程會一直被占據,即使沒有傳輸數據,也需要一直等待到超時才會被釋放,如果過多的線程被這樣占據,也會導致再高并發場景下的無服務線程可用
(3)event模型
Apache2的event模型是2012年2.4.x版本新增的穩定模式,基于事件驅動(epoll),每個進程響應多個請求,類似于worker模式,但解決了keepalive時線程空掛浪費資源的問題,用專門線程管理這類線程,高并發下處理能力更強
優點:單線程響應多請求,占據更少的內存,高并發下表現更優秀,會有一個專門的線程來管理keepalive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢后,又允許它釋放
缺點:沒有線程完全控制
查看使用的哪種模式
[root@apache ~]# httpd -M | grep mpmmpm_event_module (shared)
2.apache的安裝和使用
2.1apache配置文件注意事項
a.Apache2的配置主要分為三部分,分別是全局配置,虛擬主機配置,模塊配置,這些配置項目分散在不同的目錄和文件中,在主配置文件中以文件包含的形式引用它們
b.配置文件中的每一行包含一個配置指令,并指定值,配置指令不區分大小寫,但值區分大小寫
c.以#開頭的行是注釋行,注釋不能出現在指令的后邊,空白行和指令前的空白字符將被忽略,因此可用采用縮進以保持配置層次的清晰
2.2安裝apache及用法
2.2.1安裝apache
[root@apache ~]# yum install httpd -y
2.2.2查看版本
[root@apache ~]# httpd -v
Server version: Apache/2.4.53 (Red Hat Enterprise Linux)
Server built: Jul 20 2022 00:00:00
2.2.3檢測配置文件語法,是否正確
[root@apache ~]# httpd -t
Syntax OK
2.2.4查看apache的web服務配置文件
[root@apache ~]# tree -L 1 /etc/httpd/
/etc/httpd/
├── conf #主配置文件所在目錄
├── conf.d #子配置文件所在目錄
├── conf.modules.d
├── logs -> ../../var/log/httpd #日志文件所在目錄
├── modules -> ../../usr/lib64/httpd/modules
├── run -> /run/httpd
└── state -> ../../var/lib/httpd# ../表示上一級目錄的位置
比如說../../var/log/httpd
第一層表示在httpd上一級目錄
第二層表示在etc上一級目錄
所以httpd的日志文件所在目錄為/var/log/httpd
2.2.5主配置文件說明
#過濾掉所有以#開頭的注釋行好所有空白行
[root@apache ~]# grep -Ev "^.*#|^$" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd" # http服務的頂級目錄為/etc/httpd
Listen 80 #監聽80
Include conf.modules.d/*.conf #包括/etc/httpd/conf.modules.d/*.conf的所有文件
User apache #服務的用戶
Group apache #服務的組
ServerAdmin root@localhost #當前服務的管理員
<Directory /> #目錄權限設置AllowOverride none #此處權限不可被.htaccess文件權限參數覆蓋Require all denied #拒絕訪問根目錄
</Directory>
DocumentRoot "/var/www/html" #網頁文件存放的目錄
<Directory "/var/www"> #目錄權限限定AllowOverride NoneRequire all granted
</Directory>
<Directory "/var/www/html">Options Indexes FollowSymLinks #索引,跟蹤軟鏈接AllowOverride NoneRequire all granted
</Directory>
<IfModule dir_module> #全局默認提供的頁面文件為index.htmlDirectoryIndex index.html
</IfModule>
<Files ".ht*"> #禁止訪問所有以 .ht開頭的文件Require all denied
</Files>
ErrorLog "logs/error_log" #錯誤日志
LogLevel warn #只記錄警告(warn)及以上級別的日志信息
<IfModule log_config_module> #定義日志格式LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" common<IfModule logio_module>LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio</IfModule>CustomLog "logs/access_log" combined #使用combined的日志格式記錄日志
</IfModule>
<IfModule alias_module> #早期的動態網站文件路徑ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin"> #權限設定AllowOverride NoneOptions NoneRequire all granted
</Directory>
<IfModule mime_module> #MIME類型配置TypesConfig /etc/mime.typesAddType application/x-compress .ZAddType application/x-gzip .gz .tgzAddType text/html .shtmlAddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8 #Apache 默認的響應字符編碼為UTF-8
<IfModule mime_magic_module> #定義使用通過文件內容識別文件mime類型MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on #啟用sendfile系統調用,實現零拷貝文件傳輸
IncludeOptional conf.d/*.conf #加載 conf.d/目錄下所有 .conf結尾的文件作為額外配置
2.2.6啟動服務并訪問默認頁面
a.關閉防火墻和SELinux
[root@apache ~]# systemctl disable --now firewalld
[root@apache ~]# setenforce 0
setenforce: SELinux is disabled
b.修改默認index.html頁面文件
[root@apache ~]# echo jeams > /var/www/html/index.html
c.重啟httpd并查看端口號
[root@apache ~]# systemctl restart httpd
[root@apache ~]# ss -lntup | grep httpd
tcp LISTEN 0 511 *:80 *:* users:(("httpd",pid=32197,fd=4),("httpd",pid=32196,fd=4),("httpd",pid=32195,fd=4),("httpd",pid=32193,fd=4))
d.訪問網站
第一種:直接查看網站內容
[root@apache ~]# curl 192.168.75.184
jeams
第二種:僅返回服務器的響應頭
[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 07:06:39 GMT
Server: Apache/2.4.53 (Red Hat Enterprise Linux)
Last-Modified: Tue, 09 Sep 2025 07:03:22 GMT
ETag: "c-63e58e64fab29"
Accept-Ranges: bytes
Content-Length: 6
Content-Type: text/html; charset=UTF-8
2.2.7響應時不顯示版本號
a.向apache服務器的主配置文件的末尾添加一行內容ServerTokens Prod(隱藏服務器的詳細信息)
[root@apache ~]# echo "ServerTokens Prod" >> /etc/httpd/conf/httpd.conf
b.檢測語法并重啟httpd
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
c.查看
[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 07:16:26 GMT
Server: Apache #此處不顯示服務端apache具體版本號信息
Last-Modified: Tue, 09 Sep 2025 07:03:22 GMT
ETag: "c-63e58e64fab29"
Accept-Ranges: bytes
Content-Length: 6
Content-Type: text/html; charset=UTF-8
注意: 添加下面一條命令到配置文件,重啟速度會特別快
[root@apache ~]# echo "ServerName 0.0.0.0" >> /etc/httpd/conf/httpd.conf
3.apache配置和使用
3.1常用全局配置
3.1.1修改全局默認頁面所在目錄和文件名
a.編輯apache主配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www"
<directory /www>allowoverride nonerequire all granted
</directory>
<IfModule dir_module>DirectoryIndex index.html index default.html
</IfModule>#<directory /www> 設置 /www 目錄的訪問權限
#allowoverride none 禁止該目錄下的.htaccess文件覆蓋主配置
#require all granted 允許所有客戶端訪問該目錄下的內容
#<IfModule dir_module> 當啟用目錄模塊時,定義訪問目錄時默認加載的頁面順序:
優先加載index.html,如果沒有則找index,再沒有就用default.html
注意:測試時,我們要從下往上去測試,否則會測試失敗,只能看到index.html里面的內容
b.創建/www目錄
[root@apache ~]# mkdir /www
c.檢測并重啟httpd
[root@apache www]# httpd -t
Syntax OK
[root@apache www]# systemctl restart httpd
d.測試
default.html
[root@apache www]# echo "jeams" > /www/default.html
[root@apache ~]# curl 192.168.75.184
jeams
index
[root@apache www]# echo "jeam" > /www/index
[root@apache ~]# curl 192.168.75.184
jeam
index.html
[root@apache www]# echo "jeams6" > /www/index.html
[root@apache ~]# curl 192.168.75.184
jeams6
3.1.2配置監聽端口和IP
a.添加監聽端口81
[root@apache ~]# echo "listen 0.0.0.0:81" >> /etc/httpd/conf/httpd.conf
b.檢測并重啟httpd
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
c.查看端口號
[root@apache ~]# ss -lntup | grep httpd
tcp LISTEN 0 511 0.0.0.0:81 0.0.0.0:* users:(("httpd",pid=34228,fd=5),("httpd",pid=34227,fd=5),("httpd",pid=34226,fd=5),("httpd",pid=34223,fd=5))
tcp LISTEN 0 511 *:80 *:* users:(("httpd",pid=34228,fd=4),("httpd",pid=34227,fd=4),("httpd",pid=34226,fd=4),("httpd",pid=34223,fd=4))
d.測試
[root@apache ~]# curl 192.168.75.184:81
jeams6
e.添加IP地址
[root@apache ~]# ip addr add 192.168.75.185/24 dev eth0
f.檢測并重啟httpd
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
g.查看IP
[root@apache ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:b7:fa:01 brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.75.184/24 brd 192.168.75.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet 192.168.75.185/24 scope global secondary eth0valid_lft forever preferred_lft foreverinet6 fe80::c80e:1840:7e94:5d13/64 scope link noprefixroute valid_lft forever preferred_lft forever
h.測試
[root@apache ~]# curl 192.168.75.185:81
jeams
3.1.3配置文件壓縮
啟用數據壓縮功能能夠減少網絡IO的數據量,提高服務器的網絡吞吐能力,配置文件默認已開啟數據壓縮
a.查看壓縮模塊是否已經加載
[root@apache ~]# httpd -M | grep deflatedeflate_module (shared)
b.配置壓縮規則
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
<IfModule mod_deflate.c>DeflateCompressionLevel 6AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
</IfModule>#<IfModule mod_deflate.c> 檢查服務器是否加載了mod_deflate壓縮模塊
#DeflateCompressionLevel 6設置壓縮級別為6(范圍1-9,級別越高壓縮率越高,但消耗服務器資源也越多,6是比較平衡的選擇)
#AddOutputFilterByType DEFLATE text/html text/plain text/css application/json 指定對哪些類型的文件進行壓縮,這里包含了 HTML、純文本、CSS、JSON 等常見文本類資源
c.檢測并重啟httpd
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
d.測試
查看被壓縮前的大小
[root@apache ~]# ll /www/
總用量 2958
-rw-r--r-- 1 root root 389 9月 9 04:06 china
-rw-r--r-- 1 root root 1658 9月 9 04:06 jeams
-rw-r--r-- 1 root root 456 9月 9 04:50 jeams.html
-rw-r--r-- 1 root root 455 9月 9 04:50 ok.html
壓縮后的大小
[root@apache ~]# curl --compressed -I 192.168.75.184/jeams.html
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 09:05:07 GMT
Server: Apache
Last-Modified: Tue, 09 Sep 2025 08:50:38 GMT
ETag: "4-63e5a65ef230e"
Accept-Ranges: bytes
Content-Length: 350 #被壓縮的大小
Content-Type: text/html; charset=UTF-8
3.1.4配置持久連接
持久連接指的是建立連接后,每個資源獲取完后不會立即斷開連接,而是保持一段時間后斷開
a.編輯配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
KeepAlive on #開啟持久連接
MaxKeepAliveRequests 100 #在一個持久連接內,最多可以累計處理100次請求
KeepAliveTimeout 10 #持久連接保持時間
b.檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
c.安裝測試軟件
[root@apache ~]# yum install telnet -y#telnet是一個用于遠程登錄和測試網絡連接的工具,安裝后可以用它測試服務器的端口是否開放
d.測試
輸入測試內容
[root@apache ~]# echo 666 > /www/jeams.html
[root@apache ~]# echo 888 > /www/ok.html
開始測試
[root@apache ~]# telnet 192.168.75.184 80
Trying 192.168.75.184...
Connected to 192.168.75.184.
Escape character is '^]'.
GET /jeams.html HTTP/1.1 #輸入請求行信息
host: 192.168.75.184 #輸入請求頭信息#這個空格是結束行,必須要敲!!!
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 08:58:24 GMT
Server: Apache
Last-Modified: Tue, 09 Sep 2025 08:50:38 GMT
ETag: "4-63e5a65ef230e"
Accept-Ranges: bytes
Content-Length: 4
Content-Type: text/html; charset=UTF-8666
GET /ok.html HTTP/1.1 #在持久連接時間內繼續請求
host: 192.168.75.184 #第一個資源請求完成,不會斷開,可以繼續請求第二個資源#這個空格是結束行,必須要敲!!!
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 08:58:29 GMT
Server: Apache
Last-Modified: Tue, 09 Sep 2025 08:50:49 GMT
ETag: "4-63e5a6696acd7"
Accept-Ranges: bytes
Content-Length: 4
Content-Type: text/html; charset=UTF-8888
Connection closed by foreign host. #時間到達后自動斷開
3.1.5定義路徑別名
alias指令用于在URL和文件系統之間實現映射,使不在DocumentRoot目錄下的內容也能成為項目的一部分
a.編輯配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
alias /test /alias/alias-test
<directory /alias/alias-test>allowoverride nonerequire all granted
</directory> #alias /test /alias/alias-test 定義一個別名,當訪問http://服務器地址/test時,Apache會轉到/alias/alias-test目錄下查找資源
#allowoverride none 禁用該目錄的.htaccess文件
#require all granted 允許所有客戶端訪問該目錄下的內容
b.創建目錄并輸入內容
[root@apache ~]# mkdir -p /alias/alias-test
[root@apache ~]# echo "hello,jeams" > /alias/alias-test/index.html
c.檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
d.測試
[root@apache ~]# curl 192.168.75.184/test/
hello,jeams
3.2訪問資源控制
3.2.1編輯配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www"
<directory /www>DirectoryIndex disabled #禁用默認的索引文件index.htmloptions indexes followsymlinks #indexes表示顯示目錄內容列表,followsymlinks表示追蹤軟鏈接allowoverride none #none表示不允許讀取.htaccess文件中設置的options值,實踐中不要使用.htaccess文件,會降低性能require all granted
</directory>
3.2.2將默認的配置文件不生效并創建軟鏈接
#禁用Apache默認歡迎頁面的配置文件
[root@apache ~]# mv /etc/httpd/conf.d/welcome.conf {,.bak}
#創建軟鏈接
[root@apache ~]# ln -s /var/www/html/index.html /www/link.html
3.2.3檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
3.2.4測試
a.Linux上測試
[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 200 OK
Date: Wed, 10 Sep 2025 02:13:21 GMT
Server: Apache
Content-Type: text/html;charset=ISO-8859-1
b.Windows上測試
3.2.5控制特定主機訪問
a.不允許192.168.75.1主機訪問
編輯配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www" #指定Apache的網站根目錄為/www
<directory /www> DirectoryIndex disabled #禁用默認首頁文件options indexes followsymlinks #在目錄下沒有默認首頁且沒有禁用目錄索引時會顯示目錄內文件列表allowoverride none #禁用該目錄下的 .htaccess 文件<requireall>require all granted #允許所有require not ip 192.168.75.1 #拒絕該主機</requireall>
</directory>
檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
測試
Linux端:
[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 200 OK
Date: Wed, 10 Sep 2025 02:14:14 GMT
Server: Apache
Content-Type: text/html;charset=ISO-8859-1
Windows端:
b.允許192.168.75.1主機訪問
編輯配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www" #指定Apache網站根目錄為/www
<directory /www>DirectoryIndex disabled #禁用默認首頁文件options indexes followsymlinks #在目錄下沒有默認首頁且沒有禁用目錄索引時會顯示目錄內文件列表allowoverride none #禁用該目錄下的 .htaccess 文件<requireany>require all denied #拒絕所有require ip 192.168.75.1 #允許該主機訪問</requireany>
</directory>
測試重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
測試
Liunx端:
[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 403 Forbidden
Date: Wed, 10 Sep 2025 02:15:18 GMT
Server: Apache
Content-Type: text/html; charset=iso-8859-1
Windows端:
3.3訪問日志配置
3.3.1編輯配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www"
<directory /www>DirectoryIndex disabled #禁用默認首頁文件options indexes followsymlinks #在目錄下沒有默認首頁且沒有禁用目錄索引時會顯示目錄內文件列表allowoverride none #禁用該目錄下的 .htaccess 文件require all granted #允許所有客戶端登錄
</directory>
LogFormat "%h %l %u test-format %{user-agent}i" test-format #配置自定義日志格式
customlog /http-log/access.log test-format #使用自定義日志
3.3.2創建目錄
[root@apache ~]# mkdir /http-log/
3.3.3檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
3.3.4測試
[root@apache ~]# cat /http-log/access.log
192.168.75.184 - - test-format curl/7.76.1
3.4虛擬主機配置
apache服務支持在一臺物理服務器上配置多個網站,我們可以通過虛擬主機配置來實現該功能
apache服務中配置了虛擬主機,還需要在DNS解析中添加域名解析,將域名指向apache服務器所在的IP地址
DNS解析負責將域名解析到apache服務器上,虛擬主機配置負責區分不同的網站,將不同點分域名與內容分別對應起來
多虛擬主機的實現方式:
基于端口實現:用不同的端口標識不同的虛擬主機
基于IP實現:用不同的IP地址標識不同的虛擬主機
基于域名實現:用不同的域名標識不同的虛擬主機
3.4.1基于端口實現
a.編輯配置文件
[root@apache ~]# vim /etc/httpd/conf.d/port.conf
<Directory /virtualhost>
Allowoverride none #禁用該目錄下.htaccess文件的作用
Require all granted #允許所有客戶端訪問該目錄
</Directory>
<VirtualHost 192.168.75.185:80>
DocumentRoot /virtualhost/port/80 #存放網頁文件的路徑
ServerName 192.168.75.185 #綁定的IP
</VirtualHost>
Listen 888
<VirtualHost 192.168.75.185:888>
DocumentRoot /virtualhost/port/888 #存放網頁文件的路徑
ServerName 192.168.75.185 #綁定的IP
</VirtualHost>
b.創建目錄并往不同端口里面寫內容
[root@apache ~]# mkdir -p /virtualhost/port/{80,888}
[root@apache ~]# echo "I like you" > /virtualhost/port/80/index.html
[root@apache ~]# echo "you is my girl" > /virtualhost/port/888/index.html
c.創建臨時IP
[root@apache ~]# ip addr add 192.168.75.185/24 dev eth0
[root@apache ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:b7:fa:01 brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.75.184/24 brd 192.168.75.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet 192.168.75.185/24 scope global secondary eth0valid_lft forever preferred_lft foreverinet6 fe80::c80e:1840:7e94:5d13/64 scope link noprefixroute valid_lft forever preferred_lft forever
d.檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
e.測試
80端口
888端口
3.4.2基于IP實現
a.編輯配置文件
[root@apache ~]# vim /etc/httpd/conf.d/ip.conf
<Directory /virtualhost>Allowoverride none #禁用該目錄下.htaccess文件的作用Require all granted #允許所有客戶端訪問該目錄
</Directory>
<VirtualHost 192.168.75.186:80>
DocumentRoot /virtualhost/ip/186 #存放該IP對應的網頁文件
ServerName 192.168.75.186 #綁定的IP
</VirtualHost>
<VirtualHost 192.168.75.187:80>
DocumentRoot /virtualhost/ip/187 #存放該IP對應的網頁文件
ServerName 192.168.75.187 #綁定的IP
</VirtualHost>
b.創建目錄并編寫內容到文件里
[root@apache ~]# mkdir -p /virtualhost/ip/{186,187}
[root@apache ~]# echo "jeams 192.168.75.186" > /virtualhost/ip/186/index.html
[root@apache ~]# echo "jeams 192.168.75.187" > /virtualhost/ip/187/index.html
c.添加臨時IP
[root@apache ~]# ip addr add 192.168.75.186/24 dev eth0
[root@apache ~]# ip addr add 192.168.75.187/24 dev eth0
[root@apache ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:b7:fa:01 brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.75.184/24 brd 192.168.75.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet 192.168.75.185/24 scope global secondary eth0valid_lft forever preferred_lft foreverinet 192.168.75.186/24 scope global secondary eth0valid_lft forever preferred_lft foreverinet 192.168.75.187/24 scope global secondary eth0valid_lft forever preferred_lft foreverinet6 fe80::c80e:1840:7e94:5d13/64 scope link noprefixroute valid_lft forever preferred_lft forever
d.檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
e.測試
Linux端:
192.168.75.186
[root@apache ~]# curl 192.168.75.186
jeams 192.168.75.186
192.168.75.187
[root@apache ~]# curl 192.168.75.187
jeams 192.168.75.187
Windows端:
192.168.75.186
192.168.75.187:
3.4.3基于域名實現
a.編輯配置文件
[root@apache ~]# vim /etc/httpd/conf.d/name.conf
<Directory /virtualhost>Allowoverride none #禁用該目錄下.htaccess文件的作用Require all granted #允許所有客戶端訪問該目錄
</Directory>
<VirtualHost 192.168.75.184:80>
DocumentRoot /virtualhost/king #存放該域名對應的網頁文件
ServerName www.king.com #域名為www.king.com
</VirtualHost>
<VirtualHost 192.168.75.184:80>
DocumentRoot /virtualhost/jeams#存放該域名對應的網頁文件
ServerName www.jeams.org #域名為www.jeams.org
ServerAlias haha.jeams.org #別名為haha.jeams.org
</VirtualHost>
b.創建目錄并寫入文本
[root@apache ~]# mkdir -p /virtualhost/{king,jeams}
[root@apache ~]# echo www.king.com > /virtualhost/king/index.html
[root@apache ~]# echo www.jeams.org > /virtualhost/jeams/index.html
c.檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
d.域名解析
[root@apache ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.75.184 apache www.king.com www.jeams.org haha.jeams.org
e.測試
Linux端
www.king.com
[root@apache ~]# curl www.king.com
www.king.com
www.jeams.org
[root@apache ~]# curl www.jeams.org
www.jeams.org
haha.jeams.org
[root@apache ~]# curl haha.jeams.org
www.jeams.org
Windows端
編輯Windows域名解析本地配置文件路徑
C:\Windows\System32\drivers\etc\hosts
添加以下內容到hosts文件
192.168.75.184 www.king.com www.jeams.org haha.jeams.org
www.king.com
www.jeams.org
haha.jeams.org
3.5錯誤頁面配置
3.5.1編輯配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
errordocument 403 "<h1>sorry!</h1>permission denied\n"
errordocument 404 "<h1>sorry!</h1>your page not found\n"
3.5.2檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
3.5.3測試(本次測試基于域名實現的配置文件上改)
a.出現403(設置黑名單,開啟SELinux,將數據給備份或者改名)
設置黑名單
[root@apache ~]# vim /etc/httpd/conf.d/name.conf
<Directory /virtualhost/king>Allowoverride none<requireall>require all granted #允許所有require not ip 192.168.75.1 #拒絕該主機</requireall>
</Directory>
<VirtualHost 192.168.75.184:80>
DocumentRoot /virtualhost/king
ServerName www.king.com
</VirtualHost>
<VirtualHost 192.168.75.184:80>
DocumentRoot /virtualhost/jeams
ServerName www.jeams.org
ServerAlias haha.jeams.org
</VirtualHost>
檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
Windows上查看結果
win+r:運行對話框
瀏覽器查看
開啟SELinux
[root@apache ~]# vim /etc/selinux/config
SELINUX=enforcing
Windows端瀏覽器查看
將數據給備份或改名
[root@apache ~]# mv /etc/httpd/conf.d/name.conf /etc/httpd/conf.d/name
Windows端瀏覽器查看
b.出現404(沒有這個文件)
[root@apache ~]# curl 192.168.75.184/jeams6
<h1>sorry!</h1>your page not found
3.6訪問驗證配置
3.6.1編輯配置文件
[root@apache ~]# vim /etc/httpd/conf.d/auth.conf
<VirtualHost 192.168.75.188:80>
servername 192.168.75.188 #綁定的IP
documentroot /virtualhost/auth #網站的根目錄
errordocument 401 /noauth.html #當出現401未授權錯誤時,轉到/noauth.html
</VirtualHost>
<Directory /virtualhost/auth>
authtype basic #使用HTTP基本認證
authname "please login:" #認證信息彈出
authuserfile /etc/httpd/auth-password #引用之前創建的密碼文件
require user jeams xiaoming #僅允許指定用戶(jeams和xiaoming)訪問
</Directory>
alias /noauth.html /virtualhost/auth/prompt.html #當出現401自動調轉到prompt.html[root@apache ~]# vim /virtualhost/auth/prompt.html
please enter passwd!!!
3.6.2添加臨時IP
[root@apache ~]# ip a a 192.168.75.188/24 dev eth0
3.6.3創建目錄并寫入內容
[root@apache ~]# mkdir /virtualhost/auth
[root@apache ~]# echo jeams > /virtualhost/auth/index.html
3.6.4設置密碼
#-c表示創建新的密碼文件(如果該文件已經存在,會被覆蓋,所以第二次執行的時候不用加-c)
[root@apache ~]# htpasswd -c /etc/httpd/auth-password jeams
New password:
Re-type new password:
Adding password for user jeams
[root@apache ~]# htpasswd /etc/httpd/auth-password xiaoming
New password:
Re-type new password:
Adding password for user xiaoming
3.6.5查看密碼文件
[root@apache ~]# cat /etc/httpd/auth-password
jeams:$apr1$695OAFmJ$iQ3m4RpvxwvD3UmzpBFlM/
xiaoming:$apr1$q0X9wH09$jtfTvyWCTDeyNp.VcZRG90
3.6.6檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
3.6.7測試
a.無指定用戶直接測試
[root@apache ~]# curl 192.168.75.188
please enter passwd ! ! ![root@apache ~]# curl -I 192.168.75.188
HTTP/1.1 401 Unauthorized
Date: Wed, 10 Sep 2025 10:26:34 GMT
Server: Apache
WWW-Authenticate: Basic realm="please login:"
Last-Modified: Wed, 10 Sep 2025 07:37:33 GMT
ETag: "1a-63e6d7e6391fd"
Accept-Ranges: bytes
Content-Length: 26
Content-Type: text/html; charset=UTF-8
b.指定用戶測試
第一種方法
#-u 指定用戶登錄
[root@apache ~]# curl -u jeams 192.168.75.188
Enter host password for user 'jeams':
jeams
第二種方法
#自動將認證信息以HTTP基本認證的方式發送給服務器,無需手動輸入
[root@apache ~]# curl http://xiaoming:123@192.168.75.188
jeams#xiaoming:123 表示使用用戶名xiaoming和密碼123進行身份驗證
#@192.168.75.188 表示要訪問的服務器地址(即你配置了身份驗證的虛擬主機)
c.Windows端(輸入http://xiaoming:123@192.168.75.188)
4.apache實現https網站
4.1安裝軟件
#安裝Apache的SSL模塊
[root@apache ~]# yum install mod_ssl -y
#檢測Apache是否加載了SSL模塊
[root@apache ~]# httpd -M | grep sslssl_module (shared)
4.2編輯文件
[root@apache ~]# vim /etc/httpd/conf.d/https.conf
<virtualhost 192.168.75.189:443>
SSLEngine on #啟用SSL加密功能
#指定SSL證書和私鑰文件(之前生成的自簽名證書)
SSLCertificateFile /etc/httpd/certs/https.crt #公鑰證書
SSLCertificateKeyFile /etc/httpd/certs/https.key #私鑰證書
DocumentRoot /virtualhost/https
ServerName 192.168.75.189 #網站根目錄
<directory /virtualhost/https> #綁定的IP
DirectoryIndex index.html #默認首頁文件
allowoverride none #禁用.htaccess
require all granted #允許所有客戶端訪問
</directory>
</virtualhost>
4.3添加臨時IP
[root@apache ~]# ip addr add 192.168.75.189/24 dev eth0
4.4創建目錄用于存放SSL證書
[root@apache ~]# mkdir /etc/httpd/certs
4.5生成SSL證書
4.5.1生成一個RSA私鑰文件,用于加密和解密SSL通信
[root@apache ~]# openssl genrsa > /etc/httpd/certs/https.key
4.5.2基于RSA私鑰文件創建一個自簽名SSL證書
[root@apache ~]# openssl req -utf8 -new -key /etc/httpd/certs/https.key -x509 -days 365 -out /etc/httpd/certs/https.crt-utf8:支持UTF-8字符輸入(如中文單位/地區信息)
-new:生成新的證書請求
-x509:直接生成自簽名證書(而非證書請求文件)
-days 365:證書有效期為365天
-out:指定輸出的證書文件路徑
注意:輸入這條命令會叫你填寫國家代碼,省份,地區,公司,部門,域名,郵箱
4.5.3創建目錄并編寫內容
[root@apache ~]# mkdir /virtualhost/https/ -p
[root@apache ~]# echo "jeams,this is for you" > /virtualhost/https/index.html
4.5.4檢測并重啟
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
4.5.5測試
Linux測試
#-k 標識忽略SSL證書驗證(因為你使用的是自簽名證書,不被系統默認信任)
[root@apache ~]# curl -k https://192.168.75.189/index.html
jeams,this is for you
Windows測試
注意:因為是自己做的證書,瀏覽器會提醒你不安全,你點擊高級并繼續訪問即可看到測試內容