Linux下Apache(HTTP)基礎知識梳理-運維筆記
- 2021 年 7 月 27 日
- 筆記
- Linux Apache, Linux 實例
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>