Apache的配置詳解

FuShudi發表於2024-07-01

目錄
  • 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 基於域名的虛擬主機

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的配置大概就這麼多,篇幅有點長,可以根據自己想看的內容直接跳轉

相關文章