apache http server,俗稱apache,程序名httpd,默認配置文件/etc/httpd/conf/httpd.conf;該文件通過其中的Include conf.d/*.conf指示包含/etc/httpd/conf.d目錄下的所有.conf文件。
逐項解析就沒必要了,httpd.conf中對各項配置的作用說明已經是比較清楚的了,或者直接看逼逼怪鳥哥的解釋,只說自己以前感到不解的幾個問題。
1.httpd.conf添加配置時一定要找到指定的位置添加才能生效嗎?
答:修改某項配置原已有配置現要修改,那要找到其位置;但如是是添加新配置那不需要到特定位置,只要不在其他標簽內部(<Directory></Directory>)皆可。
按httpd.conf自己的划分其配置分全局環境變量(Global Environment)、主服務器配置('Main' server configuration)、虛擬主機(Virtual Hosts)三大節區
但就實際配置來看,配置是作用於全局還是主服務器還是虛擬機,並不取決於其位置,而只是取決於屬性名。
比如ServerTokens這一全局屬性,不管你把他移到httpd.conf中的主服務節區,或者虛擬機節區,甚至是conf.d目錄下的任意.conf文件,其都是作用於全局(當然不能將其置於其他標簽內部,那樣是非法配置了)。
所以最常見的配置php支持時,總說“找到LoadModule xxx處在其后邊添加LoadModule php5_module modules/libphp5.so”,事實是你隨便找個位置加上去一樣生效的(比如文件尾,當然還一樣不能在其他標簽內部)。
2.httpd.conf中的目錄為什么總沒頭沒腦的,比如“Include conf.d/*.conf”這項,目錄全路徑是什么?
答:想明白httpd.conf中的目錄,要搞清ServerRoot、DocumentRoot、Alias三項。
ServerRoot--httpd進程默認所處的目錄,明白些就是其他Include等目錄配置項的前輟。“Include conf.d/*.conf”全路徑就是$ServerRoot/conf.d/*.conf(默認/etc/httpd/conf.d/*.conf)。
DocumentRoot--網站根目錄,瀏覽器僅以http://ip:port訪問時訪問的目錄。
Alias--別名功能,可將任意物理路徑映射為DocumentRoot下的目錄。比如Alias /error/ "/var/www/error/",就是物理路徑/var/www/error/被映射為了$DocumentRoot/error,當訪問http://ip:port/error時就是訪問/var/www/error/目錄。
3.apache如何修改網站根目錄?
答:如2中所述網站根目錄由DocumentRoot指定。
但是由於apache需要對目錄權限進行配置,所以在修改根目錄后要增加對新根目錄的權限限制,一般的做法是直接將<Directory "/var/www/html"><Directory />標簽中的默認路徑"/var/www/html"改為新的根目錄。
各<Directory><Directory />標簽就是用來配置各相關目錄的訪問權限的。
4.apache如何使用php?
答:apache以模塊方式將php引入,做為apache的一部份。
php與http服務器的結合,一般有cgi、fastcgi和模塊三種形式;fastcgi是cgi的進程重用改進版。nginx使用php一般用fastcgi模式,apache使用php一般使用模塊模式(當然其實fastcgi模式也是支持的)。
模塊方式就類似動態鏈接庫模式,動態鏈接庫有一個dll文件,LoadModule php5_module modules/libphp5.so”就是加載$ServerRoot/modules/libphp5.so文件。
升級apache的php要使用--with-apxs2編譯出新的libphp5.so文件然后復制到$ServerRoot/modules/目錄將舊的替換。
5.<IfModule prefork.c></IfModule>等標簽的作用是什么?
答:LoadModule加載的是動態加載庫,prefork.c等是靜態編譯到httpd的功能模塊。<IfModule>就是如果httpd中有靜態編入了該模塊,則對該模塊使用以下限制。
可以使用httpd -l查看httpd靜態編入了哪些模塊。另外可以使用ldd /usr/sbin/httpd查看httpd運行依賴哪些動態庫(注意不是LoadModule那些,httpd運行不用LoadModule那些也可以運行的,那些只是為了擴展httpd的功能才加進來的)。