Linux下Apache(HTTP)基礎知識梳理-運維筆記

上古南城發表於2021-07-27

HTTP介紹:

  • HTTP協議是Hyper Text Transfer Protocol(超文字傳輸協議)的縮寫,是用於從全球資訊網(WWW:World Wide Web )伺服器傳輸超文字到本地瀏覽器的傳送協議,是一個基於TCP/IP通訊協議來傳遞資料(HTML 檔案, 圖片檔案, 查詢結果等)。
  • HTTP是一個屬於應用層的物件導向的協議,由於其簡捷、快速的方式,適用於分散式超媒體資訊系統;HTTP協議工作於客戶端-服務端架構為上,瀏覽器作為HTTP客戶端通過URL向HTTP服務端即WEB伺服器傳送所有請求。Web伺服器根據接收到的請求後,向客戶端傳送響應資訊。

HTTP功能特性:

  • 支援B/S及C/S模式。
  • 靈活:HTTP允許傳輸任意型別的資料物件。正在傳輸的型別由Content-Type加以標記。
  • 無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。
  • 簡單快速:客戶向伺服器請求服務時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規定了客戶與伺服器聯絡的型別不同。由於HTTP協議簡單,使得HTTP伺服器的程式規模小,因而通訊速度很快。
  • 無狀態:HTTP協議是無狀態協議。無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

一次完整的http協議請求的工作流程如下:

(1) 終端客戶在Web瀏覽器位址列輸入訪問地址http://www.baidu.com
(2) Web瀏覽器請求DNS伺服器把域名www.baidu.com轉換成Web伺服器的IP地址,此處的解析過程就是DNS解析的原理流程。
(3) Web瀏覽器將埠號(預設80)從訪問地址(URL)中解析出來。
(4) Web瀏覽器通過解析後的IP地址及埠號於Web伺服器之間建立一條TCP連線。
(5) 建立TCP連線後,Web瀏覽器向Web伺服器傳送一條HTTP請求報文。
(6) Web伺服器響應並讀取瀏覽器的請求資訊,然後返回一條HTTP響應報文。
(7) Web伺服器關閉http連線,關閉TCP連線,Web瀏覽器顯示訪問的網站內容到螢幕。

 各個步驟具體細節

  • (1) 終端客戶在Web瀏覽器位址列輸入訪問地址http://www.baidu.com
  • (2) Web瀏覽器請求DNS伺服器把域名www.baidu.com轉換成Web伺服器的IP地址,此處的解析過程就是DNS解析的原理流程。
    • a. 在瀏覽器中輸入www.baidu.com域名,作業系統會先檢查自己本地的hosts檔案是否有這個網址對映關係,如果有,就先呼叫這個ip地址對映,完成域名解析。
    • b. 如果hosts裡沒有這個域名的對映,則會查詢本地DNS解析器快取,是否有這個網址對映關係,如果有,直接返回,完成域名解析。
    • c. 如果hosts與本地DNS解析器快取都沒有相應的網址對映關係,首先會找TCP/IP引數中設定的首選DNS伺服器,在此我們叫它本地DNS伺服器,此伺服器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析記過給客戶端,完成域名解析,此解析具有權威性。
    • d. 如果要查詢域名,不由本地DNS伺服器區域解析,但該伺服器已快取了此網址對映關係,則呼叫這個IP地址對映,完成域名解析,此解析不具有權威性。
    • e. 如果本地DNS伺服器本地區域檔案與快取解析都失效,則根據本地DNS伺服器的設定(是否設定轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS伺服器收到請求後會判斷這個域名(.com)是誰來授權管理,並會返回一個負責該頂級域名伺服器的一個IP。本地DNS伺服器收到IP資訊後,將會聯絡負責.com域的這臺伺服器。這臺負責.com域的伺服器收到請求後,如果自己無法解析,它就會找一個管理.com域的下一級DNS伺服器地址(baidu.com)給本地DNS伺服器。當本地DNS伺服器收到這個地址後,就會找baidu.com域伺服器,重複上面的動作,進行查詢,直至找到www.baidu.com主機。
    • f. 如果用的是轉發模式,此DNS伺服器就會把請求轉發至上一級DNS伺服器,由上一級伺服器進行解析,上一級伺服器如果不能解析,或找根DNS或把請求轉至上上級,以此迴圈。不管是本地DNS伺服器用是轉發,還是根提示,最後都是把結果返回給本地DNS伺服器,由此DNS伺服器再返回給客戶機。

      

  • (3) Web瀏覽器將埠號(預設80)從訪問地址(URL)中解析出來。
  • (4) Web瀏覽器通過解析後的IP地址及埠號於Web伺服器之間建立一條TCP連線。
    • 建立一個TCP連線時,需要客戶端和伺服器端總共傳送3個包。三次握手的目的是連線伺服器指定埠,建立TCP連線,並同步連線雙方的序列號和確認號,交換TCP視窗大小資訊。在socket程式設計中,客戶端執行connect()時將觸發三次握手。
    • 第一次握手(SYN=1,seq=x):客戶端傳送一個TCP的SYN標誌位置1的包,指明客戶端打算連線的伺服器的埠,以及初始序號X,儲存在包頭的序列號(Sequence Number)欄位裡。
    • 第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1):伺服器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均為1。伺服器端選擇自己的ISN序列號,放在seq域裡,同時將確認序號(Acknowledgement Number)設定為客戶的ISN加1,即X+1。傳送完畢後,伺服器端進入SYN_RCVD狀態。
    • 第三次握手(ACK=1,ACKnum=y+1):客戶端再次傳送確認包(ACK),SYN標誌位為0,ACK標誌位為1,並且把伺服器發來ACK的序號欄位+1,放在確定欄位中傳送給對方,並且在資料段放寫ISN的+1。傳送完畢後,客戶端進入ESTABLISHED狀態,當伺服器端收到這個包時,也進入ESTABLISHED狀態,TCP握手結束,TCP連線建立完成。

    

  • (5) 建立TCP連線後,Web瀏覽器向Web伺服器傳送一條HTTP請求報文。
    • HTTP請求報文由三部分組成:請求行,請求頭、空格、請求正文。
    • 請求行:用於描述客戶端的請求方式(GET/POST等),請求的資源名稱(URL)以及使用的HTTP協議的版本號。
    • 請求頭:用於描述客戶端請求哪臺主機及其埠,以及客戶端的一些環境資訊等。
    • 空行:空行就是\r\n (POST請求時候有)。
    • 請求正文:當使用POST等方法時,通常需要客戶端向伺服器傳遞資料。這些資料就儲存在請求正文中(GET方式是儲存在url地址後面,不會放到這裡)
      • 請求方法有哪些種呢?
          GET: 完整請求一個資源 (常用)
          HEAD: 僅請求響應首部
          POST:提交表單  (常用)
          PUT: (webdav) 上傳檔案(但是瀏覽器不支援該方法)
          DELETE:(webdav) 刪除
          OPTIONS:返回請求的資源所支援的方法的方法
          TRACE: 追求一個資源請求中間所經過的代理(該方法不能由瀏覽器發出)
  • (6) Web伺服器響應並讀取瀏覽器的請求資訊,然後返回一條HTTP響應報文。
    • HTTP響應也由三部分組成:狀態行,響應頭,空格,訊息體
    • 狀態行包括:協議版本、狀態碼、狀態碼描述
    • 響應頭:響應頭用於描述伺服器的基本資訊,以及客戶端如何處理資料
    • 空格:CRLF(即 \r\n)分割
    • 訊息體:伺服器返回給客戶端的資料
      • 狀態碼:狀態碼用於表示伺服器對請求的處理結果。
          1xx:指示資訊——表示請求已經接受,繼續處理
          2xx:成功——表示請求已經被成功接收、理解、接受。
          3xx:重定向——要完成請求必須進行更進一步的操作
          4xx:客戶端錯誤——請求有語法錯誤或請求無法實現
          5xx:伺服器端錯誤——伺服器未能實現合法的請求。
  • (7) Web伺服器關閉http連線,關閉TCP連線,Web瀏覽器顯示訪問的網站內容到螢幕。
    • 釋放一個TCP連線,需要客戶端和伺服器總共傳送4個包。客戶端和伺服器端均可主動發起揮手動作。在socket程式設計中,任何一方執行close()操作即可產生揮手操作。
    • 第一次揮手(FIN=1,seq=x):假設客戶端想要關閉連線,客戶端傳送一個FIN標誌位置為1的包,表示自己已經沒有資料可以傳送了,但是仍然可以接收資料。傳送完畢之後,客戶端進入FIN_WAIT_1狀態。
    • 第二次揮手(ACK=1,ACKnum=x+1):伺服器端確認客戶端的FIN包,傳送一個確認包,表明自己接收到了客戶端關閉連線的請求,但還沒有準備好關閉連線。傳送完畢後,伺服器端進入CLOSE_WAIT狀態,客戶端接收到這個確認包之後進入FIN_WAIT_2狀態,等待伺服器端關閉連線。
    • 第三次揮手(FIN=1,seq=y):伺服器端準備好關閉連線時,向客戶端傳送結束連線請求,FIN置為1。傳送完畢後,伺服器端進入LAST_ACK狀態,等待來自客戶端的最後一個ACK。
    • 第四次揮手(ACK=1,ACKnum=y+1):客戶端接收到來自伺服器的端的關閉請求,傳送一個確認包,並進入TIME_WAIT狀態,等待可能出現的要重傳的ACK包。伺服器端接收到這個確認包之後,關閉連線,進入CLOSED狀態。客戶端等待了某個固定時間(兩個最大段生命週期,2MSL,2Maximum Segment Lifetime)之後,沒有收到伺服器端的ACK,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入CLOSED狀態。

    

httpd介紹:

  • httpd早期叫做apache--a patchy server=apache,屬於Apache軟體基金會(ASF:apache software foundation)的一個專案,後來apache更名為httpd,因此這樣更符合http server這個含義了。httpd是Apache超文字傳輸協議(HTTP)伺服器的主程式。被設計為一個獨立執行的後臺程式,它會建立一個處理請求的子程式或執行緒的池。

httpd的特性:

  •  httpd有很多特性,下面就分別來說說httpd-2.2版本和httpd-2.4版本各自的特性。
版本特性
2.2 事先建立程式
按需維持適當的程式
模組化設計,核心比較小,各種功能通過模組新增(包括PHP),支援執行時配置,支援單獨編譯模組
支援多種方式的虛擬主機配置,如基於ip的虛擬主機,基於埠的虛擬主機,基於域名的虛擬主機等
支援https協議(通過mod_ssl模組實現)
支援使用者認證
支援基於IP或域名的ACL訪問控制機制
支援每目錄的訪問控制(使用者訪問預設主頁時不需要提供使用者名稱和密碼,但是使用者訪問某特定目錄時需要提供使用者名稱和密碼)
支援URL重寫
支援MPM(Multi Path Modules,多處理模組)。用於定義httpd的工作模型(單程式、單程式多執行緒、多程式、多程式單執行緒、多程式多執行緒)
2.4 httpd-2.4的新特性:
MPM支援執行DSO機制(Dynamic Share Object,模組的動態裝/解除安裝機制),以模組形式按需載入
支援event MPM,eventMPM模組生產環境可用
支援非同步讀寫
支援每個模組及每個目錄分別使用各自的日誌級別
每個請求相關的專業配置,使用<If>來配置
增強版的表示式分析器
支援毫秒級的keepalive timeout
基於FQDN的虛擬主機不再需要NameVirtualHost指令
支援使用者自定義變數
支援新的指令(AllowOverrideList)
降低對記憶體的消耗

 httpd的工作模式:

  • (1) prefork 工作模式

  httpd在啟動之初,就預先fork一些子程式,然後等待請求進來。之所以這樣做,是為了減少頻繁建立和銷燬程式的開銷。每個子程式只有一個執行緒,在一個時間點內,只能處理一個請求。
  優點:成熟穩定,相容所有新老模組。同時,不需要擔心執行緒安全的問題。
  缺點:一個程式相對佔用更多的系統資源,消耗更多的記憶體。而且,它並不擅長處理高併發請求。

  • (2) worker 工作模式

  使用了多程式和多執行緒的混合模式。它也預先fork了幾個子程式(數量比較少),然後每個子程式建立一些執行緒,同時包括一個監聽執行緒。每個請求過來,會被分配到1個執行緒來服務。執行緒比起程式會更輕量,因為執行緒通常會共享父程式的記憶體空間,因此,記憶體的佔用會減少一些。在高併發的場景下,因為比起prefork有更多的可用執行緒,表現會更優秀一些。
  優點:佔據更少的記憶體,高併發下表現更優秀。
  缺點:必須考慮執行緒安全的問題。

  • (3) event 工作模式

  它和worker模式很像,最大的區別在於,它解決了keep-alive場景下,長期被佔用的執行緒的資源浪費問題。event MPM中,會有一個專門的執行緒來管理這些keep-alive型別的執行緒,當有真實請求過來的時候,將請求傳遞給服務執行緒,執行完畢後,又允許它釋放。這樣增強了高併發場景下的請求處理能力。

  HTTP採用keepalive方式減少TCP連線數量,但是由於需要與伺服器執行緒或程式進行繫結,導致一個繁忙的伺服器會消耗完所有的執行緒。Event MPM是解決這個問題的一種新模型,它把服務程式從連線中分離出來。在伺服器處理速度很快,同時具有非常高的點選率時,可用的執行緒數量就是關鍵的資源限 制,此時Event MPM方式是最有效的,但不能在HTTPS訪問下工作。

Apache原始碼編譯安裝指定版本。

官方站點下載:http://archive.apache.org/dist/httpd/

sohu站點下載:http://mirrors.sohu.com/apache/

 第一部分:Centos7初始系統原始碼編譯安裝操作。

# 準備環境
[root@Server-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)    
[root@Server-01 ~]# uname -r
3.10.0-862.el7.x86_64
[root@Server-01 ~]# uname -a
Linux Server-01 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@Server-01 ~]# hostname -I
172.16.70.37

[root@Server-01 ~]# yum -y install apr apr-devel apr-util-devel gcc gcc-c++ pcre pcre-devel openssl-devel wget curl   # 安裝依賴及所需軟體
[root@Server-01 ~]# mkdir -p /data/apps /data/tmpdir
[root@Server-01 ~]# cd /data/tmpdir/
# 下載原始碼可用以下2種方式
[root@Server-01 tmpdir]# wget http://mirrors.sohu.com/apache/httpd-2.4.41.tar.gz
[root@Server-01 tmpdir]# curl -O http://mirrors.sohu.com/apache/httpd-2.4.41.tar.gz
[root@Server-01 tmpdir]# tar xf httpd-2.4.41.tar.gz
[root@Server-01 tmpdir]# ls
httpd-2.4.41  httpd-2.4.41.tar.gz

[root@Server-01 httpd-2.4.41]# cd /data/tmpdir/httpd-2.4.41
# 檢視並選擇適合的編譯引數
[root@Server-01 httpd-2.4.41]# ./configure -h | less
`configure' configures this package to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print `checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for `--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local/apache2]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]
.......此處省略無數.......

[root@Server-01 httpd-2.4.41]# ./configure --prefix=/data/apps/apache24/ --enable-so --enable-ssl \
--enable-cgi --enable-rewrite --with-zlib --with-pcre  --enable-mpms-shared=all --with-mpm=prefork
......
# 以下為正常編譯完成輸出
config.status: executing default commands
configure: summary of build options:

    Server Version: 2.4.41
    Install prefix: /usr/local/apache24
    C compiler:     gcc -std=gnu99
    CFLAGS:           -pthread
    CPPFLAGS:        -DLINUX -D_REENTRANT -D_GNU_SOURCE
    LDFLAGS:
    LIBS:
    C preprocessor: gcc -E

[root@Server-01 httpd-2.4.41]# echo $?    # 完成編譯後檢查是否有報錯
0

引數說明:
  --enable-so  啟動模組動態裝解除安裝
  --enable-ssl 編譯ssl模組
  --enable-cgi 支援cgi機制(能夠讓靜態web伺服器能夠解析動態請求的一個協議)
  --enable-rewrite  支援url重寫     
  --with-zlib  支援zlib壓縮     
  --with-pcre  支援正規表示式
  --enable-mpms-shared=all  以共享方式編譯的模組
  --with-mpm=prefork   指明httpd的工作方式為prefork
  
  附:
  --with-apr= 指明依賴的apr所在目錄
  --with-apr-util=  指明依賴的apr-util所在的目錄

# 檢視機器CPU核心數
[root@Server-01 httpd-2.4.41]# cat /proc/cpuinfo | grep "processor" | wc -l
4
[root@Server-01 httpd-2.4.41]# make -j 4 && make install
[root@Server-01 httpd-2.4.41]# cd /data/apps/apache24/
# apache目錄結構
[root@Server-01 apache24]# tree -d ./
./
├── bin        # 啟動檔案存放目錄
├── build       #  apache的安裝引數存放目錄,包括版本號等
├── cgi-bin      # 存放cgi的啟動檔案(cgi:連線資料庫API的介面)
├── conf        # 存放apache配置檔案
│   ├── extra      # 一些額外的配置檔案,虛擬主機等
│   └── original    # 原始配置檔案備份
│       └── extra
├── error        # 存放錯誤日誌
│   └── include
├── htdocs        # 預設站點跟目錄,存放主頁檔案
├── icons        # 圖示提示檔案
│   └── small
├── include       # include目錄
│   └── include
├── logs        # 存放日誌檔案
├── man         # 手冊
│   ├── man1
│   └── man8
├── manual        # 其他工具手冊
│   ├── developer
│   ├── faq
│   ├── howto
│   ├── images
│   ├── misc
│   ├── mod
│   ├── platform
│   ├── programs
│   ├── rewrite
│   ├── ssl
│   ├── style
│   │   ├── css
│   │   ├── lang
│   │   ├── latex
│   │   ├── scripts
│   │   └── xsl
│   │       └── util
│   └── vhosts
└── modules        # 模組存放目錄

說明:
bin目錄為二進位制程式存放位置,如啟動指令碼apachectl、httpd、htpasswd、ab(壓力測試工具)等;
conf目錄為配置檔案存放位置
htdocs目錄存放網頁檔案,預設裡面有index.html;
logs目錄存放了日誌檔案,除了日誌檔案,預設還有httpd執行的pid檔案httpd.pid,這個建議修改到/var/run目錄下(方便判斷);
man目錄為幫助文件路徑;
modules存放了編譯後的模組;

[root@Server-01 apache24]# bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe19:1ffb. Set the 'ServerName' directive globally to suppress this message

# 修改配置檔案
[root@Server-01 apache24]# vim conf/httpd.conf    
......
# 使用者和組修改為apache
User apache
Group apache
......
#ServerName www.example.com:80
ServerName localhost:80    # 新增此項,取消'ServerName'提示
......

# 檢測配置檔案語法
[root@Server-01 apache24]# apachectl -t
Syntax OK

# 設定環境變數
[root@Server-01 apache24]# echo 'PATH=/usr/local/src/apache24/bin:$PATH' > /etc/profile.d/apache24.sh
[root@Server-01 apache24]# source /etc/profile.d/apache24.sh
[root@Server-01 apache24]# echo $PATH
/data/apps/apache24/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@Server-01 apache24]# ln -s /usr/include /data/apps/apache24/include

# 新建使用者並設定目錄許可權
[root@Server-01 apache24]# useradd -r -M apache -s /sbin/nologin
[root@Server-01 apache24]# grep apache /etc/passwd
apache:x:997:996::/home/apache:/sbin/nologin
[root@Server-01 apache24]# chown -R apache:apache /data/apps/apache24
[root@Server-01 apache24]# ls -ld /data/apps/apache24
drwxr-xr-x. 14 apache apache 164 Jul  8 15:57 /data/apps/apache24

[root@Server-01 apache24]# apachectl restart
# 檢視程式及埠
[root@Server-01 apache24]# ps -ef | grep http
root       1423      1  0 11:21 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1453   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1454   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1455   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1456   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1457   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
root       1459    983  0 11:35 pts/0    00:00:00 grep --color=auto http
[root@Server-01 apache24]# netstat -nutpl | grep http
tcp6       0      0 :::80                   :::*                    LISTEN      1423/httpd

# 測試結果
[root@Server-01 apache24]# curl 172.16.70.37
<html><body><h1>It works!</h1></body></html>

注:或在瀏覽器輸入http服務所在的IP

 第二部分:設定虛擬主機。

在一個Apache伺服器上可以配置多個虛擬主機,實現一個伺服器提供多站點服務,其實就是訪問同一個伺服器上的不同目錄。Apache虛擬主機配置有3種方法:基於埠配置、基於域名配置和基於IP配置

[root@Server-01 apache24]# pwd
/data/apps/apache24
[root@Server-01 apache24]# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs  man  manual  modules

# 建立網站目錄內容
[root@Server-01 apache24]# for i in {1..3};do mkdir -pv /data/web/www$i; echo "www$i: Mysite $i" > /data/web/www$i/index.html;done
[root@Server-01 apache24]# tree /data/web/
/data/web/
├── www1
│   └── index.html
├── www2
│   └── index.html
└── www3
    └── index.html
[root@Server-01 apache24]# cat /data/web/www*/*
www1: Mysite 1
www2: Mysite 2
www3: Mysite 3

# 修改主配置檔案
[root@Server-01 apache24]# vim conf/httpd.conf
......
Listen 80
Listen 81    # 新增所需要的埠號
......
# Virtual hosts
Include conf/extra/httpd-vhosts.conf  # 去掉註釋'#'
....


[root@Server-01 apache24]# apachectl -t Syntax OK
[root@Server-01 apache24]# apachectl restart
[root@Server-01 apache24]# netstat -ntpul | grep http
tcp6       0      0 :::80                   :::*                    LISTEN      1423/httpd
tcp6       0      0 :::81                   :::*                    LISTEN      1423/httpd

# 檢視配置載入過程
[root@Server-01 apache24]# apachectl -S
VirtualHost configuration:
172.16.70.37:80        www1.wencheng.com (/data/apps/apache24/conf/extra/httpd-vhosts.conf:25)
172.16.70.37:81        www2.wencheng.com (/data/apps/apache24/conf/extra/httpd-vhosts.conf:34)
ServerRoot: "/data/apps/apache24/"
Main DocumentRoot: "/data/apps/apache24/htdocs"
Main ErrorLog: "/data/apps/apache24/logs/error_log"
Mutex default: dir="/data/apps/apache24/logs/" mechanism=default
Mutex mpm-accept: using_defaults
PidFile: "/data/apps/apache24/logs/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="apache" id=997
Group: name="apache" id=996
  • 基於埠(PORT)
# 修改虛擬主機配置檔案
[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
......
# 末行新增以下內容
# PORT
<VirtualHost 172.16.70.37:80>
    DocumentRoot "/data/web/www1"
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" common
  <Directory "/data/web/www1">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost 172.16.70.37:81>
    DocumentRoot "/data/web/www2"
    ErrorLog "logs/www2-error_log"
    CustomLog "logs/www2-access_log" common
  <Directory "/data/web/www2">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>


[root@Server-01 apache24]# apachectl -t 
Syntax OK 
[root@Server-01 apache24]# apachectl restart

# 檢測結果
[root@Server-01 apache24]# curl 172.16.70.37
www1: Mysite 1
[root@Server-01 apache24]# curl 172.16.70.37:80
www1: Mysite 1
[root@Server-01 apache24]# curl 172.16.70.37:81
www2: Mysite 2
  •  基於域名(FQDN)
[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
......
# 末行新增以下內容
# FQDN
<VirtualHost *:80>
    ServerName www1.wencheng.com
    DocumentRoot "/data/web/www1"
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" common
  <Directory "/data/web/www1">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName www3.wencheng.com
    DocumentRoot "/data/web/www3"
    ErrorLog "logs/www3-error_log"
    CustomLog "logs/www3-access_log" common
  <Directory "/data/web/www3">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

# 新增域名解析
[root@Server-01 apache24]# echo '172.16.70.37 www1.wencheng.com www3.wencheng.com' >> /etc/hosts

[root@Server-01 apache24]# apachectl -t
Syntax OK
[root@Server-01 apache24]# apachectl restart

# 檢測結果
[root@Server-01 apache24]# curl www1.wencheng.com
www1: Mysite 1
[root@Server-01 apache24]# curl www3.wencheng.com
www3: Mysite 3
  • 基於地址(IP)
# 新增另一個IP地址
[root@Server-01 apache24]# ip addr add 172.16.70.38/24 dev ens33
[root@Server-01 apache24]# ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 172.16.70.37/24 brd 172.16.70.255 scope global noprefixroute dynamic ens33
    inet 172.16.70.38/24 scope global secondary ens33    # 新增的IP

[root@Server-01 apache24]# ping 172.16.70.38 -c4    # 通訊正常
PING 172.16.70.38 (172.16.70.38) 56(84) bytes of data.
64 bytes from 172.16.70.38: icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from 172.16.70.38: icmp_seq=2 ttl=64 time=0.050 ms

[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
......
# 末行新增
# IP
<VirtualHost 172.16.70.37:80>
    ServerName www2.wencheng.com
    DocumentRoot "/data/web/www2"
    ErrorLog "logs/www2-error_log"
    CustomLog "logs/www2-access_log" common
  <Directory "/data/web/www2">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost 172.16.70.38:80>
    ServerName www3.wencheng.com
    DocumentRoot "/data/web/www3"
    ErrorLog "logs/www3-error_log"
    CustomLog "logs/www3-access_log" common
  <Directory "/data/web/www3">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>


[root@Server-01 apache24]# apachectl -t
Syntax OK
[root@Server-01 apache24]# apachectl restart

# 檢測結果
[root@Server-01 apache24]# curl 172.16.70.37
www2: Mysite 2
[root@Server-01 apache24]# curl 172.16.70.38
www3: Mysite 3

第三部分:Apache Web認證方式

  • 基於使用者認證。
[root@Server-01 apache24]# pwd
/data/apps/apache24

# 建立認證使用者賬號檔案,並新增使用者
[root@Server-01 apache24]# htpasswd -cb /data/apps/apache24/conf/.htpasswd user1 user1
Adding password for user user1
[root@Server-01 apache24]# htpasswd -b /data/apps/apache24/conf/.htpasswd user2 user2
Adding password for user user2
[root@Server-01 apache24]# cat /data/apps/apache24/conf/.htpasswd
user1:$apr1$670zn8qW$R6BsrSdUZGYIKzYRl2opd.
user2:$apr1$k3FCnqKK$qzm4fqkIXINWX43kKAToA/

# 建立測試網頁
[root@Server-01 apache24]# echo "<h1>User authentication</h1>" > /data/web/www1/admin.html

# 虛擬主機配置檔案
[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
......
# FQDN
<VirtualHost *:80>
    ServerName www1.wencheng.com
    DocumentRoot "/data/web/www1"
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" combined
  <Directory "/data/web/www1">
    Options None
    AllowOverride None
    Require all granted
  </Directory>
  <Directory "/data/web/www1">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "Please enter your name & passwd"
    AuthUserFile "/data/apps/apache24/conf/.htpasswd"
    Require valid-user
  </Directory>
</VirtualHost>


[root@Server-01 apache24]# apachectl -t
Syntax OK
[root@Server-01 apache24]# apachectl graceful
  • 檢測測試結果。

  WIN10的hosts檔案新增解析:將'172.16.70.37 www1.wencheng.com www2.wencheng.com www3.wencheng.com'新增到C:\Windows\System32\drivers\etc\hosts

 

  • 基於組認證
# 接使用者認證配置基礎,再新增user3,uer4使用者
[root@Server-01 apache24]# htpasswd -b /data/apps/apache24/conf/.htpasswd user3 user3
Adding password for user user3
[root@Server-01 apache24]# htpasswd -b /data/apps/apache24/conf/.htpasswd user4 user4
Adding password for user user4
[root@Server-01 apache24]#
[root@Server-01 apache24]# cat /data/apps/apache24/conf/.htpasswd
user1:$apr1$670zn8qW$R6BsrSdUZGYIKzYRl2opd.
user2:$apr1$k3FCnqKK$qzm4fqkIXINWX43kKAToA/
user3:$apr1$x6J3/DAj$XMP3eMjDC83Yk3aT4Yp.u0
user4:$apr1$CV4vuoTu$KN.Ha.IB41Aq0AGZVfw6E0

# 建立組檔案
[root@Server-01 apache24]# echo "admins:user3 user4" > /data/apps/apache24/conf/.htgroup
[root@Server-01 apache24]# cat /data/apps/apache24/conf/.htgroup
admins:user3 user4

# 建立測試網頁
[root@Server-01 apache24]# echo '<h1>Group user authentication</h1>' > /data/web/www1/admin.html

# 虛擬主機配置檔案
[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
# FQDN
<VirtualHost *:80>
    ServerName www1.wencheng.com
    DocumentRoot "/data/web/www1"
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" combined
  <Directory "/data/web/www1">
    Options None
    AllowOverride None
    Require all granted
  </Directory>
  <Directory "/data/web/www1">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "Please enter your name & passwd"
    AuthUserFile "/data/apps/apache24/conf/.htpasswd"
    AuthGroupFile "/data/apps/apache24/conf/.htgroup"
    Require valid-user
    Require group admins
  </Directory>
</VirtualHost>

[root@Server-01 apache24]# apachectl -t
Syntax OK
[root@Server-01 apache24]# apachectl graceful
  •  檢測測試結果。

:預設配置檔案解析。

[root@Server-01 apache24]# grep -Ev '#|^$' conf/httpd.conf
# 服務安裝路徑
ServerRoot "/data/apps/apache24/"

# 監聽埠
Listen 80

# 啟動的模組
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
<IfModule !mpm_prefork_module>
</IfModule>
<IfModule mpm_prefork_module>
</IfModule>
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so

# 執行httpd的使用者和組
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>

# 管理員郵箱(若服務出來問題,會給管理員發郵件,提前是服務能發郵件)
ServerAdmin you@example.com

# 根目錄許可權
<Directory />
    AllowOverride none
    Require all denied
</Directory>

# 網頁檔案存放目錄
DocumentRoot "/data/apps/apache24//htdocs" 

# 目錄許可權
<Directory "/data/apps/apache24//htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# 預設訪問主頁
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

# 控制不讓web使用者檢視.htpasswd和.haccess兩檔案訪問許可權
<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" common
</IfModule>

# CGI模組別名管理
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/data/apps/apache24//cgi-bin/"
</IfModule>

# CGI模組別名
<Directory "/data/apps/apache24//cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

# 取消舊代理模組
<IfModule headers_module>
    RequestHeader unset Proxy early
</IfModule>

# 支援的檔案
<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>

# 啟用的代理模組
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>

# ssl模組
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

 

相關文章