主要內容:
httpd相關包信息
httpd的安裝及主頁面
httpd的配置文件
httpd的全局配置
httpd的主服務器配置
一、httpd的RPM包介紹及其相關信息:
CentOS6上httpd的相關包信息:
CentOS7上的httpd的相關信息:
【httpd安裝後各文件的內容及存放位置】:
CentOS6:
服務腳本:/etc/rc.d/init.d/httpd
運行目錄:/etc/httpd
配置文件:/etc/httpd/conf/
主配置文件:httpd.conf
擴展配置文件:/etc/httpd/conf.d/*.conf
socket:
http:80/tcp
https:443/tcp
網頁文件目錄(DocumentRoot):
靜態頁面:/var/www/html
動態頁面(CGI):/var/www/cgi-bin/
默認主頁面:index.html index.php
【httpd的安裝】:
注意:httpd的默認安裝會試圖通過反解當前主機的IP地址來爲httpd服務器提供一個主機名稱,如果反解失敗會報錯,會提示主機名稱解析失敗並使用127.0.0.1作爲當前主機的主機名。所以在沒有配置DNS的情況下,建議首先配置/etc/hosts文件爲其提供一個主機名。
1、 編輯/etc/hosts文件,爲當前主機配置相應的主機名:
2、 通過yum來安裝httpd,如果需要手冊(httpd-manual:官方提供的httpd的配置手冊),也可以一併安裝;
3、 安裝完成後通過“chkconfig”命令來設置開機啓動:
[root@localhost ~]# chkconfig --list httpd httpd 0:off1:off2:off3:off4:off5:off6:off [root@localhost ~]# chkconfig httpd on [root@localhost ~]# chkconfig --list httpd httpd 0:off1:off2:on3:on4:on5:on6:off
4、 通過“service httpd start”或“/etc/rc.d/init.d/httpd”來啓動服務:
[root@localhost ~]# service httpd start Starting httpd: httpd: Could not reliablydetermine the server's fully qualified domain name, using localhost.localdomainfor ServerName #此處有點小問題; [ OK ] [root@localhost ~]# /etc/rc.d/init.d/httpdrestart Stopping httpd: [ OK ] Starting httpd: httpd: Could not reliablydetermine the server's fully qualified domain name, using localhost.localdomainfor ServerName [ OK ] 在/etc/httpd/conf/httpd.conf文件中將# ServerName www.example.com:80 的註釋符#號去掉即可;
5、 通過“netstat”或“ss”命令來查看80/tcp端口是否處於監聽狀態:
[root@localhost ~]# netstat -tan | grep 80 tcp 0 0 :::80 :::* LISTEN
[root@localhost ~]# ss -tnl | grep 80 LISTEN 0 128 :::80 :::*
6、 80/tcp端口被監聽說明服務已經啓動了,在客戶機的瀏覽器中輸入服務器地址驗證安裝。
看到上面的頁面表示httpd已經能夠正常工作了哈,上面的頁面是一個測試頁面,在我們提供默認主頁面後該頁面就會被替換。
7、 爲httpd提供默認主頁(在"/var/www/html"目錄下新建一個名爲index.html的文件),內容如下:
8、 再次通過瀏覽器訪問:
自定義主頁設置成功,能正常訪問;
二、配置httpd的工作屬性:
指令的說明:
/etc/httpd/conf/httpd.conf:
1、指令不區分字符大小寫,但約定俗成的習慣:單詞的首字母大寫;指令的值很有可能區分大小寫;有些指令可以重複使用多次;
2、所有以“#”號開頭的都爲註釋;
配置文件的構成:
整個配置文件由3段組成:
(1)全局配置:對主服務器或虛擬機都有效,且有些功能是服務器自身工作屬性;
(2)主服務器:主站屬性;
(3)虛擬主機:虛擬主機及屬性定義
注:第二段和第三段(即主機和虛擬主機)不能同時使用;
說明:大多數配置修改後,使用service httpd reload即能生效;而修改了監聽的地址和端口通常需要重啓服務;
第一段:全局配置:
1、配置監聽的地址和端口:
Listen [IP:]PORT //Listen可重複使用多次
#Listen 12.34.56.78:80 Listen 80
2、配置所選用的MPM的屬性:
MPM:意爲多路處理模塊,也就是我們所說的Apache的工作模式,共有3中模式:
prefork:一個主進程產生多個子進程,一個子進程響應一個請求;
worker:一個進程生成多個線程,一個線程響應一個請求;
event:基於事件驅動;
說明:
event在apache2.4版本之前是以測試狀態提供,網上並沒有太多的資料,在更新至2.4版本之後正式上線
prefork:當httpd啓動起來之後,會生成一個主進程,它負責監聽用戶的請求,一旦請求進來後,它不負責自己響應,而是讓其生成的子進程來響應,而主進程繼續監聽請求。
需要考慮的是:剛啓動服務的時候需要創建幾個空閒進程,太多不好太少也不好。最少保證有幾個空閒進程來響應請求進來,這是必須的。 最多設定多少個空閒進程,多餘的空閒進程需要回收回來。
所以Prefork有如下幾個關鍵作用:
(1)啓動服務時綁定特權端口:Linux系統中,只有管理員有權限使用小於1024的特權端口;但運行一些公共可用的服務,一定不能以管理員身份運行;
(2)派發或回收子進程
(3)讀取分析主配置文件
(4)監聽每個用戶請求並且派發子進程
httpd 命令的使用:
Usage: httpd [-D name] [-d directory] [-ffile] [-C "directive"] [-c "directive"] [-k start|restart|graceful|graceful-stop|stop] [-v] [-V] [-h] [-l] [-L] [-t] [-S] Options: -Dname : define a name for usein <IfDefine name> directives -ddirectory : specify an alternateinitial ServerRoot -ffile : specify an alternateServerConfigFile -C"directive" : processdirective before reading config files -c"directive" : processdirective after reading config files -elevel : show startup errors oflevel (see LogLevel) -Efile : log startup errors tofile -v : show versionnumber -V : show compilesettings -h : listavailable command line options (this page) -l : list compiledin modules -L : listavailable configuration directives -t-D DUMP_VHOSTS : show parsed settings(currently only vhost settings) -S : a synonym for-t -D DUMP_VHOSTS -t-D DUMP_MODULES : show all loaded modules -M : a synonym for-t -D DUMP_MODULES -t : run syntaxcheck for config files
參數說明:
httpd –l 用於查看核心模塊;
[root@localhost ~]# httpd -l Compiled in modules: core.c prefork.c #prefork被直接編譯進了核心模塊,所以默認使用的就是prefork模型; http_core.c mod_so.c [root@localhost ~]#
httpd–M 檢查DSO模塊加載情況(通過2種方式查詢已加載的模塊數量應該相等)
[root@localhost ~]# httpd -M | grep -v"static\|Loaded Modules" | wc -l Syntax OK 52 [root@localhost ~]# grep"^LoadModule" /etc/httpd/conf/httpd.conf | wc -l 52
【配置prefork模型】:
Apache服務默認就是以prefork模式啓動的,無須更改啓動模式,下面來看看如何更改其模型參數:
編輯主配置文件:vim /etc/httpd/conf/httpd.conf找到與模塊相關的參數:IfModule爲指令,意爲判斷模塊是否存在,如果存在那麼參數則生效,反之如果不存在此模塊,參數將不會生效。
<IfModule prefork.c> #如果存在這個模塊,那麼提供以下屬性; StartServers 8 #剛啓動Web服務時啓動幾個空閒子進程; MinSpareServers 5 #最少空閒進程數; MaxSpareServers 20 #最大空閒進程數; ServerLimit 256 #限定最多允許並發進來的活動用戶連接個數; MaxClients 256 #服務器所允許同時所連接進來的鏈接數,一般來說與上面保持一致,或者大於上面的數。 MaxRequestsPerChild 4000 #一個服務器進程最多可以處理多少個進程,一旦超出請求後無論如何將進程結束並新啓動新進程 </IfModule> #最後以IfModule結尾;
如果一個進程需要20M內存,那麼256*20=5G內存,通常說ServerLimit是相當消耗內存的,256已經足夠;
例:工作中,通過觀察發現服務器每個請求進來並處理結束之間的過程大概需要50毫秒,在一秒鐘之內一個進程可以處理20個請求,那麼一共開啓了256個那 麼即意味着256*20=每秒的併發數量,因此還需要再計算極端情況:對於一個站點來說一般都有高峯期,假如一次性進來的請求遠遠超於預想的閥值,該如何處理?
如果發現服務器滿負荷工作時,但服務器上仍然有空閒,可以將MaxClients、ServerLimit值調大。
【配置worker模型】;
當第一個用戶請求到達的時候線程發現需要複製文件,通過內核將文件複製給其進程,所以第二個用戶請求同一個文件,對於第二個線程來說這個文件已存在,因爲線程是共享同一個進程空間,所以速度得到提升;
缺點:共享意味着爭用,共享資源被稱作臨界資源,線程共享進程空間就可能產生資源爭用,並不是全狀態並行。所以一個進程裏不能啓用太多線程;可啓用多個進程然後由每個進程再啓用多個線程,但無論如何每個線程也都是一個獨立的執行實體(線程要能運行必須給其cpu資源)。
更改apache當前工作模式爲worker模式:
編輯文件/etc/sysconfig/httpd,將以下參數的註釋信息去掉:
HTTPD=/usr/sbin/httpd.worker
更改模式後必須重新啓動服務:
[root@localhost ~]# service httpd restart Stopping httpd: [ OK ] Starting httpd: [ OK ]
啓動完畢後,查看其進程狀態:
[root@localhost ~]# ps -ef | grep httpd root 34786 1 0 22:24 ? 00:00:00 /usr/sbin/httpd.worker #以root用戶身份生成的父進程(用於派發工作進程) apache 34788 34786 0 22:24 ? 00:00:00 /usr/sbin/httpd.worker #以apache用戶身份運行的工作進程(該工作進程派發線程) apache 34789 34786 0 22:24 ? 00:00:00 /usr/sbin/httpd.worker apache 34791 34786 0 22:24 ? 00:00:00 /usr/sbin/httpd.worker root 34907 1947 0 22:26 pts/0 00:00:00 grep httpd
【worker屬性配置】:
<IfModule worker.c> StartServers 4 #配置啓動多少個用於監聽的服務,注意:這裏並不是服務器進程,而是線程; MaxClients 300 #最大支持的用戶連接數; MinSpareThreads 25 #最小的空閒線程數; MaxSpareThreads 75 #對大的空閒線程數 ; ThreadsPerChild 25 #允許每個進程最多生成多少個線程; MaxRequestsPerChild 0 #設置一個獨立的子進程將能處理的請求數量; </IfModule>
3、配置服務器支持keep-alived:
KeepAlive {On | Off } #啓用之後支持一次連接可以發送多個請求(對於非常繁忙的服務器建議Off) KeepAliveTimeout 15 #15秒之後斷開長連接; MaxKeepAliveRequests 100 #一次長連接之內最多允許50個請求;
4、配置加載的模塊:
# Example: # LoadModule foo_module modules/mod_foo.so #LoadModule指令模塊名稱 模塊所在的路徑(相對於ServerRoot而言) LoadModule auth_basic_modulemodules/mod_auth_basic.so LoadModule auth_digest_modulemodules/mod_auth_digest.so LoadModule authn_file_modulemodules/mod_authn_file.so LoadModule authn_alias_modulemodules/mod_authn_alias.so
第二段:主服務器配置:
5、配置站點根目錄(網頁存放目錄)
DocumentRoot "" #與之配對使用兩個容器類指令:Directory指令限定的是文件系統上站點目錄的路徑(/var/www/html);Location指令限定的是URL路徑 <Directory "FS_PATH"> </Directory> <Location "URL"> </Location> #兩種路徑定義方法 /var/www/html/images/logo.jpg => <Directory "/var/www/html" ></Directory> http://www.magedu.com/images/logo.jpg => <Location "/"></Location> #這裏的“/”==/var/www/html
6、配置頁面文件屬性:
<Directory "FS_PATH"> Options Indexes: 是否允許索引頁面文件(不安全,建議關閉); FollowSynLinks: 是否跟隨軟鏈接文件(不安全,建議關閉); SymLinksifOwnerMatch:相對安全的跟隨軟鏈接指令(如果軟鏈接文件的屬主與網頁訪問用戶匹配則允許) ExecCGI:是否允許執行CGI腳本; All 允許上述所有; None 不允許上述所有; </Directory>
Example:是否允許索引?
首先刪除歡迎頁面文件和默認主頁面文件,或者將二者改名:
[root@localhost ~]# cd /etc/httpd/conf.d/ [root@localhost conf.d]# mvwelcome.conf{,.bak} [root@localhost conf.d]# cd /var/www/html/ [root@localhost html]# mv index.html{,.bak} [root@localhost html]# service httpd reload Reloading httpd: [root@localhost html]#
此時是能正常索引的,現在來禁止索引功能: