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

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瀏覽器地址欄輸入訪問地址//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瀏覽器地址欄輸入訪問地址//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源碼編譯安裝指定版本。

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

sohu站點下載://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 //mirrors.sohu.com/apache/httpd-2.4.41.tar.gz
[root@Server-01 tmpdir]# curl -O //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 [email protected]

# 根目錄權限
<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>