一、Apache簡介
1.1 關于Apache
Apache HTTP Server(簡稱Apache)是Apache軟件基金會的一個開放源碼的Web服務器,可以在大多數計算機操作系統中運行,由于其跨平臺和安全性被廣泛使用,是最流行的Web服務器端軟件之一。它快速、可靠并且可通過簡單的API擴展,將Perl/Python等解釋器編譯到服務器中。
1.2 Apache 的特點
-
具有開放的源代碼。
-
跨平臺應用。Apache 服務器可以運行在絕大多數軟硬件平臺上,幾乎所有 UNIX 操作系統都可以運行,同時也可以在 Windows 系統平臺上良好的運行。
-
支持各種 Web 編程語言。
-
模塊化設計。Apache 不是將所有的功能集中在固定的服務程序內部,而是盡可能地通過標準的模塊實現特有的功能,因此 Apache 服務器具有良好的擴展性。
-
運行穩定。Apache 服務器可以用于構建具有大負載訪問量的 Web 站點。
-
良好的安全性。開源軟件共同具有的特性。
二、Apache服務器的安裝
本文基于CentOS 7.5系統安裝并配置Apache服務器,Apache的版本是2.4.6。
[root@apache ~]# uname -r
3.10.0-862.el7.x86_64
[root@apache ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
2.1 安裝Apache
Apache的主程序名稱是httpd,服務器配置好YUM源后,使用如下命令安裝httpd,并可同時安裝其依賴包。依賴包主要包括apr、apr-utils和httpd-tools。
[root@apache ~]# yum install httpd -y
2.2 啟動Apache
httpd安裝后,系統會生成一個名為httpd.service的服務,啟動此服務便可以啟動Apache。
[root@apache ~]# systemctl list-unit-files --type=service | grep httpd
httpd.service ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? disabled
[root@apache ~]# systemctl start httpd.service
[root@apache ~]# systemctl enable httpd.service
Apache服務器的守護進程為httpd,默認在TCP 80端口偵聽用戶請求。
[root@apache ~]# netstat -nptl | grep 80
tcp6 ? ? 0 ? ? ?0 :::80 ? ? ? ? ? :::* ? ? ? ? ? LISTEN ? ? ?70787/httpd
在瀏覽器中輸入服務器的http://IP地址可以瀏覽Apache的默認網站。
2.3 Apache相關目錄和文件
1、Apache主配置文件
/etc/httpd/conf/httpd.conf ,是Apache的主配置文件,幾乎包含了所有的配置。有的版本將主配置文件拆分成數個小配置文件,分別管理不同的參數。后面會詳細解釋Apache主配文件。
2、額外配置文件目錄
為了便于管理和維護,可以將一些配置參數從主配置文件分離出來,形成額外的配置文件,以.conf結尾,存放在/etc/httpd/conf.d/目錄中,在主配置文件中配置IncludeOptional conf.d/*.conf,從而當重啟Apache的時候,可以將它們讀入主配置文件。
3、默認網站主目錄
/var/www/html/這個目錄就是Apache默認的存放Web頁面的目錄、即默認網站主目錄。
4、模塊文件目錄
Apache采用了模塊化設計,Apache 的模塊分為靜態模塊和動態模塊兩種。Apache 最基本的模塊是靜態模塊,靜態模塊不能夠隨意的添加或卸載;而動態模塊則可以進行添加和刪除操作,因此使 Apache 具有很大的靈活性。Apache支持的外掛模塊的模塊文件默認是放置在/usr/lib64/httpd/modules目錄中。
使用命令httpd -M可以查看哪些是靜態模塊(static),哪些是動態模塊(shared)。
5、日志目錄
/var/log/httpd/是Apache日志文件默認的保存位置,對于流量比較大的網站來說,這個目錄要格外注意,這里的數據文件可能會非常大。
6、CGI程序目錄
/var/www/cgi-bin/是Apache保存可執行的CGI程序的默認位置。
三、Apache配置文件詳解
3.1 主站點的基本配置
ServerRoot "/etc/httpd"
# Apache軟件安裝的位置。若配置文件中其他目錄沒有指定絕對路徑,則目錄是相對于該目錄。
?
Listen 80
# 服務器監聽的端口號。
?
ServerName www.example.com:80
# 主站點名稱(網站的主機名)。
?
ServerAdmin root@localhost
# 管理員的郵件地址。
?
DocumentRoot "/var/www/html"
# 主站點的網頁存儲位置。
?
User apache
Group apache
# 運行httpd進程的用戶和組(都是apache)
3.2 對目錄的訪問控制
1、語法:
<Directory>和</Directory>用于封裝一組指令,使之僅對某個目錄及其子目錄生效。
<Directory “目錄路徑”> ... </Directory>
2、例如:
<Directory "/var/www/html">Options Indexes FollowSymLinksAllowOverride NoneRequire all granted
</Directory>
3、說明:
(1)Options:配置在特定目錄使用的特性,有以下8種選項
#1、All: 所有特性全部選擇,除了MultiViews
#2、None: 所有特性全部不選擇
#3、Indexes: 如果訪問網站的目錄中沒有DirectoryIndex (如index.html),則返回該目錄文件列表
#4、Includes: 允許服務端包含功能
#5、FollowSymLinks: 允許在目錄中使用符號鏈接引導到其他目錄
#6、SymLinksifOwnerMatch: 當符號鏈接和其指向的目錄的所有者是同一用戶時,才會使用符號鏈接
#7、ExecCGI: 允許使用CGI
#8、MultiViews: 允許使用內容協商的"多重視圖",如果請求的路徑可能對應多種類型的文件,那么服務器將根據請求的具體情況自動選擇最匹配項
# 例如在網站根目錄下有demo.jpg和demo.html的兩個文件,此訪問http://localhost/demo,如果根目錄中沒有demo子目錄,那么服務器將會繼續查找形如demo.*的文件,然后根據具體情況返回最匹配的demo.jpg或者demo.html
(2)AllowOverride:用于配置是否允許使用.htaccess文件中的配置覆蓋當前配置生效,有6種選項
#1、All: 允許使用
#2、None: 不允許使用,.htaccess文件配置將被忽略
#3、FileInfo: 允許使用文件控制類型的配置指令,包括:AddEncoding, AddLanguage, AddType等
#4、AuthConfig: 允許使用認證類型的配置指令,包括:AuthDBMGroupFile, AuthDBMUserFile等
#5、Indexes: 允許使用控制目錄索引的配置指令,包括:AddDescription, AddIcon等
#6、Limit: 允許使用權限控制類型的配置指令,包括:Allow, Deny和Order
(3)Require:用于配置訪問權限,常見的配置如下:
# Require all denied: 拒絕所有訪問請求,也是Require缺省配置
# Require all granted: 允許所有訪問請求
# Require ip 192.168 10.10.10: 允許特定IP段的訪問請求
# Require not ip 192.168 10.10.10: 不允許特定IP段的訪問請求
# Require命令缺省標簽為 <RequireAny>...</RequireAny>,表示任何一條規則滿足即可訪問
# 如果要表示所有規則同時滿足時才可訪問,需要使用標簽 <RequireAll>...</RequireAll>
3.3 文件訪問控制
1、語法
提供基于文件名的訪問控制,文件名也可以是一個包含通配符的字符串,其中"?"匹配任何單個字符,"*"匹配任何字符串序列。在"~"字符之后可以使用正則表達式。
<Files "文件名"> ... </Files>
2、例如
<Files ".ht*">Require all denied #禁止訪問.ht開頭的文件
</Files>
3.4 模塊配置
模塊文件位于/usr/lib64/httpd/modules目錄中,這些模塊是否被加載,可以參考配置/etc/httpd/conf.modules.d目錄中的配置文件。
在主配置文件中,使用<IfModule 模塊名>和</IfModule >用于封裝一組指令,使如果加載了對應的模塊,封裝的指令才有效。
3.5 默認訪問頁面
例如:
<IfModule dir_module>DirectoryIndex index.html#默認首頁文件
</IfModule>
3.6 日志配置
1、錯誤日志
ErrorLog "logs/error_log"
#日志的保存位置/etc/httpd/logs/error_log
LogLevel warn
#指定錯誤日志的級別,對應級別及該級別以上的錯誤日志信息才會記錄到錯誤日志中。
Apache的錯誤日志級別用于控制Apache服務器記錄錯誤信息的嚴重程度。Apache的錯誤日志級別包括:
-
emerg:緊急(會導致服務器不能正常工作)
-
alert:需要立即修復的問題
-
crit:嚴重錯誤
-
error:錯誤
-
warn:警告
-
notice:需要注意的信息
-
info:一般信息
-
debug:調試信息(可能包含大量信息)
2、日志格式
<IfModule log_config_module>LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" common
?<IfModule logio_module># You need to enable mod_logio.c to use %I and %OLogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio</IfModule>
?#定義訪問日志的保存位置和日志別名nicknameCustomLog "logs/access_log" combined
</IfModule>
格式中的各個參數,如:
-
%h:客戶端的ip地址或主機名
-
%l:這是由客戶端 identd 判斷的RFC 1413身份,輸出中的符號 "-" 表示此處信息無效。
-
%u:由HTTP認證系統得到的訪問該網頁的客戶名。有認證時才有效,輸出中的符號 "-" 表示此處信息無效。
-
%t:服務器完成對請求的處理時的時間。
-
%r:引號中是客戶發出的包含了許多有用信息的請求內容。
-
%>s:這個是服務器返回給客戶端的狀態碼。
-
%b:最后這項是返回給客戶端的不包括響應頭的字節數。
-
%{Referer}i:此項指明了該請求是從被哪個網頁提交過來的。
-
%{User-Agent}i:此項是客戶瀏覽器提供的瀏覽器識別信息。
3、例如
192.168.200.1 - - [29/Apr/2024:21:24:09 +0800] "GET /noindex/css/bootstrap.min.css HTTP/1.1" 200 19341 "http://192.168.200.100/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
3.7 網頁重定向和虛擬目錄配置
<IfModule alias_module># Redirect: 用于將訪問的文件重定向到新的目錄# Example:# Redirect permanent /foo http://www.example.com/barRedirect ? ?/mastc ? ? ? ? ?https://www.mastc.edu.cn/# Alias: 將網站路徑映射到文件系統路徑,用于訪問不在網站根目錄下的內容,即虛擬目錄# Example:# Alias /webpath /full/filesystem/pathAlias /images /var/images# ScriptAlias: 腳本映射,與Alias類似,只是目標文檔被視為腳本# 并在請求時由服務器運行,而不是作為發送到客戶端的文檔ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
例1:網頁跳轉
Redirect /mastc https://www.mastc.edu.cn/
例2:虛擬目錄
-
準備目錄和文件
[root@centos-teach ~]# mkdir /var/images
[root@centos-teach ~]# cp /usr/share/backgrounds/*.jpg /var/images/
-
配置主配置文件
Alias /images /var/images
<Directory "/var/images">AllowOverride NoneOptions ?Indexes FollowSymLinksRequire all granted
</Directory>
3.8 其他配置
# 響應內容的默認編碼格式
# 通常,文件的字符編碼和客戶端瀏覽器編碼相同時,頁面才會正常顯示,否則會亂碼。
# 可以通過meta標簽或header()函數可以設置客戶端瀏覽器的編碼。
# 優先級:header() >> AddDefaultCharset >> meta
AddDefaultCharset UTF-8
# 導入額外配置文件
IncludeOptional conf.d/*.conf
# 導入功能模塊配置文件
Include conf.modules.d/*.conf