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訪問則會默認訪問到第一個站點。
下面是三種虛擬主機的配置方式:
基於端口
[root@centos7(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
[root@centos7(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> [root@centos7(nanyibo) ~]# ifconfig ens34:0 192.168.*.1/24 //通過別名對一個網卡配置多個ip [root@centos7(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>