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>