Linux 中httpd服務
httpd是Apache超文字傳輸協議(HTTP)伺服器的主程式,直接執行程式即可啟動該服務。
命令引數
httpd
-h可檢視命令選項
-M檢視靜態編譯及動態裝載的模組(動態模組載入:不需重啟即生效)
-c<httpd指令> 在讀取配置檔案前,先執行選項中的指令。
-C<httpd指令> 在讀取配置檔案後,再執行選項中的指令。
-d<伺服器根目錄> 指定伺服器的根目錄。
-D<設定檔案引數> 指定要傳入配置檔案的引數。
-f<設定檔案> 指定配置檔案。
-l 顯示伺服器編譯時所包含的模組。
-L 顯示httpd指令的說明。
-S 顯示配置檔案中的設定。
-t 測試配置檔案的語法是否正確。
-v 顯示版本資訊。
-V 顯示版本資訊以及建立環境。
-X 以單一程式的方式來啟動伺服器
配置檔案
httpd服務配置檔案模組化,以便於管理
主配置檔案 /etc/httpd/conf/httpd.conf
其他配置檔案 /etc/httpd/conf.d/*.conf
檢測配置檔案語法:
httpd -t
service httpd configtest
主配置檔案
/etc/httpd/conf/httpd.conf為httpd服務的主配置檔案,其配置內容如下
serverroot “/etc/httpd” //相對路徑的根,指定apache的執行目錄 listen 80 //套接字,預設省略ip,表示監聽本機所有ip的80埠(新增套接字只需重新再寫一行) user apache //以Apache使用者(普通使用者)執行httpd的工作程序(降低許可權增加安全性) group apache //Apache子程序執行時的使用者組 ServerName www.example.com:80 //指定主機名(dns解析的主機名,一個標識,沒有特殊意義) Include conf.modules.d/ *.conf //包含conf.modules.d/ *.conf為子配置檔案 DocumentRoot "/var/www/html" //網頁檔案存放的目錄,同時也是URL路徑的起始位置 <Directory [目錄]> //對目錄的具體許可權設定,對目錄進行的配置,對當前目錄及其子目錄生效 AllowOverride none Require all de1nied //控制訪問,通過網頁對所有人拒絕訪問此目錄 /*關於Require Require是對訪問使用者進行限制的引數,Require 可以指定ip,host,若有使用者也可以指定可訪問的使用者 Require all denied 所有人不可訪問 Require all granted 所有人可訪問 Require ip [ip] 可以指定可訪問的ip(172.20) Require not ip [ip] 可指定不可訪問的ip 當有多個require時需要用黑名單或白名單 白名單: <RequireAny> //標籤內為可訪問的ip Require all denied Require ip [ip1] Require ip [ip2] </RequireAny> 黑名單: <RequireAll> //標籤內為不可訪問的ip Require all granted Require not ip 192.168.1.1 </RequireAll> */ Options Indexes FollowSymLinks /*關於Options Options為是否開啟額外特性,不開啟任何特性為None,在新增屬性時若直接加屬性名則為只使用該屬性,屬性之間使用空格符隔開,若寫為“+Indexes”這樣的格式,則為在其父目錄的屬性基礎上再加上此屬性 ALL 開啟MultiViews之外的所有特性,預設屬性 Indexes 開啟後訪問的目錄下如果沒有index.html,index.php,則會將目錄下的檔名列出,非下載站點不建議開啟 FollowSymLinks 開啟後可訪問目錄下軟連線,不安全不建議開啟 ExecCGI 開啟後允許使用mod_cgi執行CGI指令碼 Includes 開啟後允許使用mod_include提供的伺服器端包含 MultiViews 開啟後允許使用多重檢視,但影響伺服器效能不建議開啟 */ ErrorLog "logs/error_log" //定義錯誤日誌路徑 LogLevel warn //定義錯誤日誌等級 LogFormat “...” //定義日誌格式 CustomLog "logs/access_log" combined //定義訪問日誌路徑和日誌格式,combined為一種日誌格式 DirectoryIndex index.html //預設主頁 </Directory>
多路處理模組配置檔案
/etc/httpd/conf.modules.d/為其模組配置檔案
/etc/httpd/conf.modules.d/00-mpm.conf //為多路處理模組配置,檔案改動後,重啟服務生效,對模組中引數的改動直接寫在對應模組下即可
prefork模組
指定載入模組 模組名稱 模組路徑
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
//prefork模組 事先生成多個空閒程序以等待處理使用者請求,一個程序響應一個請求(提前生成空閒程序以使使用者請求時無需現生成程序,減少使用者等待時間)系統的預設模組,也是最穩定的模組
配置引數直接寫在對應模組下即可(以下是預設引數)
StartServers 5 //啟動服務時開啟子程序數
MinSpareServers 5 //最小空閒程序數
MaxSpareServers 10 //最大空閒程序數
MaxRequestWorkers 256 //最多的併發請求數
worker模組
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
//worker模組 一個主程序生成m個子程序,然後每個子程序生成n個執行緒,所以可以有m*n個併發執行緒,一個執行緒響應一個請求
配置引數直接寫在對應模組下即可(以下是預設引數)
ServerLimit 16 //最大的程序數
StartServers 3 //啟動服務時開啟子程序數
MaxRequestWorkers 150 //最多的併發請求數
MinSpareThreads 25 //最少空閒的執行緒數
MaxSpareThreads 75 //最多空閒的執行緒數
ThreadsPerChild 25 //每個子程序的執行緒數
event模組
#LoadModule mpm_event_module modules/mod_mpm_event.so
//event模組,同worker模組類似,生成m個子程序,每個程序直接響應n個請求,併發響應請求m*n,有專門的執行緒來管理這些keep-alive型別的執行緒,當有真實請求時,將請求傳遞給服務執行緒,執行完畢後,又允許釋放。這樣增強了高併發場景下的請求處理能力
httpd服務的進階配置
basic認證配置
有一些網頁在訪問時需要進行使用者的認證,通過輸入使用者名稱和密碼來訪問httpd服務
<Directory "/var/www/html"> Options Indexes AllowOverride None //利用Apache的rewrite模組對 URL 進行重寫的時候, rewrite規則會寫在 .htaccess 檔案裡,而此處的設定就是是否允許.htaccess檔案覆蓋我們的配置,一般從安全性考慮不允許,所以此處為none,開啟為all AuthType Basic //認證型別為basic AuthName “Some Private Area...” //認證名稱 AuthUserFile “/etc/httpd/conf/.htpasswd” //使用者和密碼檔案的存放路徑 #AuthGroupFile “/etc/httpd/conf/.htgroup” //組檔案存放路徑,檔案中只存放組名和組內成員,密碼讀取使用者密碼檔案 Require user tom //對tom可以訪問 #Require group groupname //允許指定組訪問 #Require valid-user //允許所有合法賬號訪問,只要存在於.htpasswd中即為合法賬號 </Diretory>
生成使用者和密碼檔案:
htpasswd -c -b -m /etc/httpd/conf/.htpasswd tom abc.com
htpasswd
-h 檢視選項
-c 建立一個新檔案
-m MD5加密(預設)
-b 直接指定密碼(非互動式)
在執行完以上操作之後就算配置完成了
httpd配置虛擬主機
正常情況下一臺伺服器應該只能配置一個站點,如果我們希望在一臺主機上配置多個站點則需要使用httpd的虛擬主機功能,httpd虛擬主機配置分別可以基於ip,基於埠,基於域名。在三種虛擬主機中,推薦使用基於域名的虛擬主機。另外當我們配置了虛擬主機後就不會再讀取主配置檔案中的主機配置了。
基於ip時需要伺服器對於每一個站點都有自己的ip,需要伺服器有多個網絡卡或者啟用網絡卡的別名。
基於埠需要開啟額外的埠分配給站點,而使用者在訪問時則需要註明訪問的端口才可以訪問,由於額外開啟的埠不是預設埠,所以需要使用者自己記住這些埠,所以不建議使用這種方式。
基於域名時則可以直接通過使用者要訪問的域名而連結到對應的站點,不需要額外的ip和埠,雖然在使用者要訪問一個站點時是dns先將使用者輸入的域名解析為ip(此時伺服器只有一個ip,其上的所有站點都會解析為一個ip)然後在訪問到伺服器,再通過資料包中的埠找到httpd服務,但是由於在傳輸的資料包中包含有域名的資料,所以在通過ip+埠找到伺服器和httpd服務後,httpd通過分析資料包中的域名資訊即可知道使用者要訪問的是哪一個站點了。但是如果使用者通過ip訪問則會預設訪問到第一個站點。
下面是三種虛擬主機的配置方式:
基於埠
[[email protected](nanyibo) ~]# vim /etc/httpd/conf.d/vhost.conf Listen 8080 //開啟額外的監聽埠 Listen 9090 <VirtualHost *:8080> //虛擬主機的開始標籤<VirtualHost ip:port> *表示任意 DocumentRoot "/app/website1" //網頁檔案存放的目錄,同時也是URL路徑的起始位置 <Directory "/app/website1"> //虛擬主機的檔案目錄標籤 Require all granted //允許所有人訪問 </Directory> </VirtualHost> //虛擬主機的結束標籤 <VirtualHost *:9090> DocumentRoot "/app/website2" <Directory "/app/website2"> Require all granted </Directory> </VirtualHost>
基於ip
[[email protected](nanyibo) ~]# vim /etc/httpd/conf.d/vhost.conf <VirtualHost 192.168.153.17:80> DocumentRoot "/app/website1" <Directory "/app/website1"> Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.153.27:80> DocumentRoot "/app/website2" <Directory "/app/website2"> Require all granted </Directory> </VirtualHost> [[email protected](nanyibo) ~]# ifconfig ens34:0 192.168.*.1/24 //通過別名對一個網絡卡配置多個ip [[email protected](nanyibo) ~]# ifconfig ens34:1 192.168.*.2/24
基於域名的虛擬主機
<VirtualHost *:80> ServerName www.baidu.com //指定域名 DocumentRoot "/app/website1" CustomLog "logs/www.baidu.com_access_log" combined //日誌檔案存放目錄和日誌格式 <Directory "/app/website1"> Require all granted </Directory> </VirtualHost> <VirtualHost *:80> ServerName bbs.baidu.com DocumentRoot "/app/website2" CustomLog "logs/bbs.baidu.com_access_log" combined <Directory "/app/website2"> Require all granted </Directory> </VirtualHost>