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>
