- httpd配置
- 1. 工作模式
- 1.1 Prefork 模式
- 1.2 Worker 模式
- 1.3. Event 模式
- 總結
- 1.4 調整工作模式
- 2. httpd配置檔案解析
- 2.1 ServerRoot
- 2.2 Listen
- 2.3 Include
- 2.4 User & Group
- 2.5 ServerAdmin
- 2.6 <Directory>
- 2.7 File
- 2.8 DocumentRoot
- 3. 高階配置
- 3.1 httpd的長連線
- 3.2 配置資源訪問策略
- 3.2.1 策略的配置
- 3.2.2 訪問控制
- 4. 配置https
- 4.1 安裝 ssl模組
- 4.2 配置證書
- 4.3 http重定向到https
- 4. 虛擬主機
- 4.1 基於埠的虛擬主機
- 4.2 基於IP的虛擬主機
- 4.3 基於域名的虛擬主機
- 1. 工作模式
httpd配置
1. 工作模式
httpd的工作模式模式有3種
1.1 Prefork 模式
-
特點:
-
每個請求由一個單獨的子程序處理。
-
每個子程序只處理一個請求。
-
不使用多執行緒,因此每個子程序相對獨立。
-
-
優點:
- 由於程序是獨立的,一個子程序崩潰不會影響其他子程序,因此更加穩定和可靠。
- 對於那些不支援執行緒的第三方模組或庫,這種模式更相容。
-
缺點:
- 記憶體使用量較大,因為每個子程序都要分配獨立的記憶體空間。
- 併發處理能力較低,不適合高併發場景。
1.2 Worker 模式
-
特點:
-
使用多執行緒,每個子程序可以處理多個執行緒。
-
每個執行緒處理一個請求。
-
-
優點:
- 記憶體使用效率高,因為執行緒共享程序的記憶體空間。
- 併發處理能力較強,適合高併發場景。
-
缺點:
-
如果執行緒崩潰,可能會影響整個程序,從而影響多個請求的處理。
-
需要注意執行緒安全問題,某些不支援執行緒的第三方模組或庫可能不相容。
-
1.3. Event 模式
-
特點:
-
類似於Worker模式,但更進一步最佳化了連線處理。
-
採用事件驅動機制,主執行緒負責接受請求,工作執行緒負責處理請求。
-
-
優點:
-
更高效的資源利用率,適合處理大量的長連線請求,如WebSocket。
-
可以更好地應對高併發場景,特別是在Keep-Alive連線多的情況下效能更佳。
-
-
缺點:
-
和Worker模式類似,執行緒安全問題依然需要注意。
-
對一些特殊模組的相容性可能不如Prefork模式。
-
總結
- Prefork模式適用於對穩定性要求高且不需要處理大量併發連線的場景。
- Worker模式適用於需要處理高併發連線,但對記憶體使用效率有要求的場景。
- Event模式適用於高併發和長連線的場景,提供了更好的效能和資源利用率。
1.4 調整工作模式
httpd服務預設工作在event模式下,可以使用httpd -V
來檢視
[root@euler conf.modules.d]# httpd -V
Server version: Apache/2.4.37 (centos)
Server built: Nov 12 2021 04:57:27
Server's Module Magic Number: 20120211:83
Server loaded: APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: event
threaded: yes (fixed thread count)
forked: yes (variable process count)
- Server MPM: event 這裡就顯示了他當前的工作模式
修改工作模式為perfork
# 修改這個檔案
[root@euler ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
這個檔案裡面會有LoadModule開頭的行,預設第三個是開啟的,對應的是event模式,你想開啟哪個就將哪個模式的註釋取消,現在我們將prefork的註釋取消,將event註釋掉
只能夠放開一個註釋,如果開啟多個會報錯
[root@euler ~]# systemctl restart httpd && httpd -V
Server version: Apache/2.4.37 (centos)
Server built: Nov 12 2021 04:57:27
Server's Module Magic Number: 20120211:83
Server loaded: APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture: 64-bit
Server MPM: prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
現在httpd的工作模式就變成了prefork
2. httpd配置檔案解析
httpd的主配置檔案在/etc/httpd/conf/httpd.conf
,這個檔案裡的內容非常多,但同時也有非常多的行是被註釋掉的,現在我們將沒有被註釋的行給取出來
[root@ceph conf]# grep -Ev "#|^$" httpd.conf
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
AllowOverride None
Require all granted
</Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%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
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
這裡面有用的配置一共就這麼些,我們來逐行分析
2.1 ServerRoot
這個配置項指的是httpd服務的根目錄,並不是使用者訪問時的根目錄,這個較好理解,不過多闡述
2.2 Listen
這個指的是httpd監聽哪個埠,預設監聽在80上,我們將其修改
[root@ceph conf]# grep ^Listen httpd.conf
Listen 9876
[root@ceph conf]# systemctl restart httpd
[root@ceph conf]# ss -ntpl |grep 9876
LISTEN 0 511 *:9876 *:* users:(("httpd",pid=6584,fd=4),("httpd",pid=6583,fd=4),("httpd",pid=6582,fd=4),("httpd",pid=6580,fd=4))
現在他就監聽在9876上了,可以嘗試訪問一下這個埠
[root@ceph conf]# echo hello > /var/www/html/index.html
[root@ceph conf]# curl localhost:9876
hello
可以訪問到,如果你的回顯不是hello的話,排查一下selinux的狀態,如果selinux處於enforcing的模式,使用命令semanage port -a -t http_port_t 9876 -p tcp
執行完這個命令之後就應該可以正常訪問了
2.3 Include
這個配置項就是說要去載入conf.modules.d/*.conf
,那這個conf.modules.d這個目錄在哪?他寫的並不是絕對路徑,httpd服務怎麼知道去哪找這個目錄呢?這個時候就需要第一個配置項了ServerRoot,他會從ServerRoot指定的目錄去找這個conf.modules.d目錄,然後載入這個目錄下的所有以.conf結尾的配置
2.4 User & Group
這個是指定httpd使用哪個使用者去啟動worker程序,主程序只能是root啟動,因為預設情況下httpd監聽80埠,而普通使用者只能監聽1024以上的埠,所以就只能使用root來啟動主程序
修改user和group
# 修改前查一下
[root@ceph conf]# ps -aux |grep httpd
root 6580 0.0 0.3 17464 11012 ? Ss 14:34 0:00 /usr/sbin/httpd -DFOREGROUND
apache 6581 0.0 0.1 17428 6672 ? S 14:34 0:00 /usr/sbin/httpd -DFOREGROUND
apache 6582 0.0 0.4 2418692 16080 ? Sl 14:34 0:00 /usr/sbin/httpd -DFOREGROUND
apache 6583 0.0 0.3 2156484 11984 ? Sl 14:34 0:00 /usr/sbin/httpd -DFOREGROUND
apache 6584 0.0 0.4 2222020 14096 ? Sl 14:34 0:00 /usr/sbin/httpd -DFOREGROUND
可以看到,除了第一個是root之外,其他程序都是以apache的使用者身份去啟動的
# 修改user & group為test使用者
[root@ceph conf]# useradd test
[root@ceph conf]# grep -A 1 ^User httpd.conf
User test
Group test
[root@ceph conf]# systemctl reload httpd
[root@ceph conf]# ps -aux |grep httpd
root 6580 0.0 0.3 17464 11028 ? Ss 14:34 0:00 /usr/sbin/httpd -DFOREGROUND
test 7652 0.0 0.1 17768 6692 ? S 14:50 0:00 /usr/sbin/httpd -DFOREGROUND
test 7653 0.0 0.4 2156496 14288 ? Sl 14:50 0:00 /usr/sbin/httpd -DFOREGROUND
test 7654 0.0 0.4 2353168 16324 ? Sl 14:50 0:00 /usr/sbin/httpd -DFOREGROUND
test 7655 0.0 0.4 2156496 14280 ? Sl 14:50 0:00 /usr/sbin/httpd -DFOREGROUND
這裡我們可以看見,使用者從apache變成了test
2.5 ServerAdmin
這個配置項用來指定管理員的郵箱,正常情況下是看不見的,如果服務區遇到了500的狀態碼,這個郵箱就會被顯示在瀏覽器上
我們先將郵箱修改掉
[root@ceph conf]# grep ^ServerAdmin httpd.conf
ServerAdmin openEuler@example.com
還需要在配置檔案裡面修改一行內容
153 AllowOverride All
應該在153行附近,將預設的AllowOverride None 改為 AllowOverride All
然後來到/var/www/html
我們瞎寫一段配置
# 我們在/var/www/html建立一個隱藏檔案
[root@ceph html]# vim .htaccess
<directory "/var/www/html">
adfasdfaadfa
</directory>
現在我們重啟服務
[root@ceph conf]# systemctl restart httpd
來到瀏覽器訪問
這裡就會顯示管理員的郵箱
2.6 <Directory>
這種配置都是給一個目錄指定一個訪問策略,需要看裡面具體寫了什麼內容
<Directory />
AllowOverride none
Require all denied
</Directory>
他是這樣寫的,給定的目錄是/,Require 就是你可以寫的策略,他這裡是拒絕所有,也就是不讓你訪問網站的根目錄
AllowOverride none 這個用來控制 .htaccess
這樣的檔案,配置為none則忽略這些檔案裡面寫的策略,配置為All則是不忽略
這一整段的意思是:忽略網站根目錄下的.htaccess
這樣的檔案,並且不允許訪問根目錄
2.7 File
可以對目錄授權,相對應的,當然也可以對檔案進行授權,這樣做的意思就是,我有個檔案需要放在網站的目錄下,但是我並不想讓這個檔案被網頁所訪問到,這樣的場景我們就可以使用file進行對檔案授權
<Files ".ht*">
Require all denied
</Files>
它預設的這一段配置寫的是拒絕訪問以.ht開頭的所有檔案
2.8 DocumentRoot
這個用來指定網頁的根目錄,也就是網頁檔案放在哪裡,預設是/var/www/html
如果你要將這個目錄給改到其他地方去,改了這一個地方之後你依然是訪問不到的,你去訪問會顯示403(許可權拒絕),產生這個錯誤的原因是你沒有對新更改的目錄進行授權
# 我們將DocumentRoot改到/www,則最少需要寫這些內容
[root@ceph conf]# vim httpd.conf
DocumentRoot "/www"
<Directory "/www">
Require all granted
</Directory>
[root@ceph conf]# mkdir /www
[root@ceph conf]# cd /www
[root@ceph www]# echo "DocumentRoot is /www" > index.html
[root@ceph www]# systemctl restart httpd
[root@ceph www]# curl localhost
DocumentRoot is /www
現在網站的根目錄就被改到了/www下了,如果還是訪問不到的話去關閉selinux
這些就是httpd常用的基礎配置了
3. 高階配置
3.1 httpd的長連線
httpd的長連線預設是開啟的,需要配置開啟/關閉的話
[root@ceph httpd]# vim /usr/share/doc/httpd/httpd-default.conf
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On
這裡面這個引數改為off就是關閉,預設就是on
3.2 配置資源訪問策略
在上面我們看到了目錄和檔案的訪問策略,但是沒有具體的去寫配置,在這裡我們會寫一些配置
3.2.1 策略的配置
配置的選項:
- Options: 配置目錄的選項
- Indexes:如果在目錄中找不到預設的首頁檔案(index.html),則索引當前的目錄
-
FollowSymLinks:允許httpd訪問目錄中軟連結的原始檔
-
ALL:啟用所有選項
-
None:禁用所有的配置選項
-
AllowOverride:是否允許
.htaccess
這個檔案中的策略生效,預設值為None- All:全部都生效
- None:全部都不生效
- AutoConfig:預設配置生效,其他指令都不生效
3.2.2 訪問控制
1. 基於客戶端的IP進行訪問控制
需求,允許所有人訪問,唯獨不允許192.168.200.1這個IP訪問
[root@ceph conf]# vim httpd.conf
DocumentRoot "/www"
<Directory "/www">
<RequireAll>
Require all granted
Require not ip 192.168.200.1
</RequireAll>
</Directory>
這裡的策略就是對於網站根目錄/www,允許所有人訪問,但是192.168.200.1這個IP不能訪問
如果是指定白名單的話配置就是這樣的
DocumentRoot "/www"
<Directory "/www">
<RequireAny>
Require ip 192.168.200.1
</RequireAny>
</Directory>
直接指定ip就可以了,因為httpd預設策略就是拒絕,然後我們只需要告訴他一個允許訪問的ip也就是白名單了
測試
# 在本地測試
[root@ceph conf]# curl localhost
DocumentRoot is /www
# 在192.168.200.1訪問
C:\Users\86156>curl 192.168.200.210
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access this resource.</p>
</body></html>
可以看到,在192.168.200.1這個機器上訪問就會顯示403,也就是許可權拒絕
引數解析:
- <RequireAll>:表示所有的指令都要滿足,邏輯與
- <RequireAny>:表示這裡面的指令只需要滿足一個就可以了,邏輯或的關係
- Require all granted:表示允許所有的訪問
- Require not ip 192.168.200.1 表示排除192.168.200.1這個IP
2. 基於主機名的訪問控制
剛剛的一個小的示例是依據客戶端的IP進行訪問控制,現在這種是依據於客戶端的主機名進行訪問控制
前提:httpd所在的主機需要有對應的解析
echo "192.168.200.210 ceph" >> /etc/hosts
192.168.200.210 ceph
DocumentRoot "/www"
<Directory "/www">
<RequireAll>
Require all granted
Require not host ceph.example.com
</RequireAll>
</Directory>
不推薦這樣的配置,做了這個配置之後每次訪問httpd服務他都會嘗試去解析你的主機名,如果沒有對應的解析他就會等到解析超時,然後他認為你不是被拒絕掉的那個主機,這時候才會讓你訪問到,這個過程很慢,瞭解就行
3. 基於使用者的認證
httpd服務預設是誰都可以去檢視網頁的,但是當我們開啟了使用者認證之後,你不驗證透過的話網頁都是不會展示的
使用者認證有2種方式,一種是明文認證(基礎認證),另一種就是密文
基礎認證配置
選項:
- AuthType Basic
- AuthName 認證的提示資訊
- AuthUserFile 認證的使用者和密碼儲存的檔案
- require user 使用者名稱 : 表示可以認證的使用者
DocumentRoot "/www"
<Directory "/www">
<RequireAll>
Require all granted
AuthType Basic
AuthName openEuler
AuthUserFile /opt/pass1
require user zhangsan
</RequireAll>
</Directory>
最終的配置就是這樣,但是有一個/opt/pass1這個檔案如何去生成呢?可以使用一個命令htpasswd
[root@ceph conf]# htpasswd -c /opt/pass1 zhangsan
New password:
Re-type new password:
Adding password for user zhangsan
[root@ceph conf]# cat /opt/pass1
zhangsan:$apr1$oNNigZ1D$K8hUhfxhw.dCVDY6UK8q71
注意:第一次建立是htpasswd -c
,這是建立這個檔案並寫入使用者名稱和密碼,如果後續想要增加使用者的話,應該使用htpasswd -a
,如果繼續使用-c選項的話,那麼之前的檔案會被覆蓋掉
這種方式的使用者名稱和密碼在傳輸過程中是明文的,我們可以抓包來檢視
密文認證(摘要認證)
這種方式的配置方法與明文認證差異不大,區別只是AuthType不一樣
DocumentRoot "/www"
<Directory "/www">
<RequireAll>
Require all granted
AuthType Digest
AuthName openEuler
AuthUserFile /opt/pass2
require user test
</RequireAll>
</Directory>
這種方式生成密碼檔案的方式就換成htdigest
[root@ceph conf]# htdigest -c /opt/pass2 openEuler test
Adding password for test in realm openEuler.
New password:
Re-type new password:
這裡的openEuler要與配置檔案裡面的AuthName一致
[root@ceph conf]# cat /opt/pass2
test:openEuler:540b8edab57ce9f3e1acaf99e40dac02
你再去登入,嘗試抓到就是看不到帳號密碼的
4. 配置https
預設的http協議是不安全的,都是明文傳輸,所以我們需要配置https來讓網站加密一下使用者資訊,不至於賬號密碼啥的直接就能被抓包給看見
總共分3步:
- 安裝模組
- 申請證書
- 配置證書
4.1 安裝 ssl模組
[root@ceph ~]# yum install mod_ssl -y
安裝好之後申請一個ssl證書
我這裡使用的自簽證書
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
4.2 配置證書
[root@ceph ~]# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /opt/server.crt
SSLCertificateKeyFile /opt/server.key
- SSLCertificateFile: 改為你自己申請的證書存在的路徑
- SSLCertificateKeyFile:改為私鑰的存放路徑
配置好之後重啟服務
[root@ceph opt]# systemctl restart httpd
這樣就可以使用https訪問了,如果的證書是用你的域名申請來的話,這裡就不會顯示不安全
這樣配置好之後我們的web服務就可以透過http和https兩種協議訪問了,我們如果想強制使用者使用https訪問的話,可以給http做一個重定向,儘管你是從http訪問的,我依然給你重定向到https
4.3 http重定向到https
在httpd.conf中寫重定向規則,因為目前沒有配置虛擬主機,httpd只有80埠,所以我們可以直接在httpd.conf中配置
Listen 80
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]
- RewriteEngine on :開啟重寫引擎
- RewriteRule:重定向規則
配置好之後重啟httpd服務
[root@ceph ~]# systemctl restart httpd
現在無論是你是在瀏覽器輸入http://IP
還是https://ip
,他最終都是走的https
4. 虛擬主機
虛擬主機有3類:
- 基於埠的虛擬主機
- 可以監聽在多個埠,比如80,81,82當我訪問80埠會顯示port is 80,當我訪問81埠會顯示port is 81 以此類推,可以給不同的埠定義不同的網站根目錄
- 基於IP的虛擬主機
- 基於域名的虛擬主機
4.1 基於埠的虛擬主機
虛擬主機的配置檔案放在/etc/httpd/conf.d
下,但是預設是不存在的,我們需要複製一個過來
[root@ceph ~]# cd /etc/httpd/conf.d/
[root@ceph conf.d]# cp /usr/share/doc/httpd/httpd-vhosts.conf .
[root@ceph conf.d]# vim httpd-vhosts.conf
<VirtualHost *:81>
ServerAdmin admin@81.com
DocumentRoot "/var/www/81/"
<Directory "/var/www/81">
Require all granted
</Directory>
</VirtualHost>
刪掉裡面預設的配置,只保留這一段
這一段的意思是,虛擬主機監聽在81埠,管理員郵箱是admin@81.com,網站根目錄是/var/www/81
並且給這個目錄配置了允許所有人訪問
現在我們還需要在主配置檔案裡面增加配置監聽81埠
[root@ceph conf.d]# vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 81
[root@ceph conf.d]# mkdir /var/www/81
[root@ceph conf.d]# systemctl restart httpd
[root@ceph conf.d]# ss -ntpl |grep 81
LISTEN 0 511 *:81 *:* users:(("httpd",pid=41313,fd=6),("httpd",pid=41312,fd=6),("httpd",pid=41311,fd=6),("httpd",pid=41309,fd=6))
可以看到81埠被監聽了,我們來給81埠的網站目錄建立一個index.html
[root@ceph conf.d]# echo "port is 81" > /var/www/81/index.html
訪問81埠
[root@ceph conf.d]# curl localhost:81
port is 81
這就是基於埠的訪問,你如果想給他加上使用者認證啊,或者其他的,參考前面的配置就可以完成,也可以一次性監聽多個埠,只需要在httpd-vhosts.conf
裡面多寫幾個虛擬主機,然後在主配置檔案裡面開啟對應的埠就好了
4.2 基於IP的虛擬主機
這個需要保證你的機器上有多個IP才可以,我們這裡配置一個臨時的IP地址
[root@ceph conf.d]# ip addr add 192.168.1.100/24 dev ens33
[root@ceph conf.d]# ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:2c:0d:98 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.210/24 brd 192.168.200.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.1.100/24 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe2c:d98/64 scope link noprefixroute
valid_lft forever preferred_lft forever
現在可以看到ens33上有2個地址,一個是192.168.200.210,另一個是192.168.1.100
IP已經配好了,現在開幹
直接在之前的虛擬主機的配置檔案上修改
<VirtualHost *:81>
ServerAdmin admin@81.com
DocumentRoot "/var/www/81/"
<Directory "/var/www/81">
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.1.100:82>
ServerAdmin admin@82.com
DocumentRoot "/var/www/82/"
<Directory "/var/www/82">
Require all granted
</Directory>
</VirtualHost>
現在有2個虛擬主機,一個是監聽在所有地址上的81埠,另一個是監聽在192.168.1.100上的82埠
# 修改主配置檔案
[root@ceph conf.d]# vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 81
Listen 82
[root@ceph conf.d]# mkdir /var/www/82
[root@ceph conf.d]# echo port is 82 > /var/www/82/index.html
[root@ceph conf.d]# systemctl restart httpd
然後我們來訪問這個虛擬主機
[root@ceph conf.d]# curl 192.168.200.210:81
port is 81
[root@ceph conf.d]# curl 192.168.200.210:82
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://192.168.200.210:82/">here</a>.</p>
</body></html>
看到了嗎,我們是無法透過192.168.200.210這個IP來訪問82埠的,那我們來透過192.168.1.100這個IP訪問
[root@ceph conf.d]# curl 192.168.1.100:82
port is 82
這個就被成功訪問到了
4.3 基於域名的虛擬主機
這個可以透過監聽在同一個地址的同一個埠,但是我根據你訪問的域名來給你不同的內容
<VirtualHost *:80>
ServerName web1.example.com
DocumentRoot "/var/www/web1/"
<Directory "/var/www/web1/">
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName web2.example.com
DocumentRoot "/var/www/web2/"
<Directory "/var/www/web2/">
Require all granted
</Directory>
</VirtualHost>
這裡的配置都是監聽在80,但是2個網站的根目錄不一樣
[root@ceph conf.d]# mkdir /var/www/web{1,2}
[root@ceph conf.d]# echo web1 > /var/www/web1/index.html
[root@ceph conf.d]# echo web2 > /var/www/web2/index.html
[root@ceph conf.d]# systemctl restart httpd
服務重啟好了之後我們的客戶端需要做一個hosts解析,或者在DNS上配置解析,我們這裡是測試,直接使用hosts更方便
[root@ceph conf.d]# vim /etc/hosts
192.168.200.210 web1.example.com
192.168.200.210 web2.example.com
新增這2行內容,然後我們來嘗試訪問
[root@ceph conf.d]# curl web1.example.com
web1
[root@ceph conf.d]# curl web2.example.com
web2
看到了吧,同一個地址的同一個埠,可以根據我們訪問的域名不同而返回不同的內容,這既是基於域名的虛擬主機
httpd的配置大概就這麼多,篇幅有點長,可以根據自己想看的內容直接跳轉