第1章 apache2.4
1.1 基礎
1.1.1 2.4版本的新特性
新特性
l MPM支持運行DSO機制,在編譯時可將三個模塊都編譯進去,可按需加載
l 支持event MPM
l 支持異步讀寫
l 支持每個模塊及每個目錄分別使用各自的日誌級別
l 基於FQDN的虛擬主機不再需要NameVirtuaHost指令
l 支持用戶自定義變量
新模塊
mod_proxy_fcgi #fast cgi快速cgi機制,cgi的全稱是“通用網關接口”,apache與php交互有三種方式,其中一種方式就是通過cgi進行交互,如果php與apache分離成兩臺主機,那麼它們之間的交互不得不依賴於tcp/ip或者“套接字”進行交互,這種分離的方式又被稱之爲fast cgi。
mod_ratelimit,作用是可以進行限速
mod_remoteip ,做遠端IP地址的控制
修改了一些配置機制:
不再支持使用Order,Deny,Allow來做基於IP的訪問控制。
注意:
目前centos6上的apache都是2.2版本的,想要升級爲2.4版本有些麻煩,建議不要在centos6上面使用2.4版本,原因如下:
apache程序的運行需要依賴一種叫做apr的東西,那麼這個apr是什麼東西呢?apr是apache portable runtime的縮寫,其實就是apache運行時所依賴的環境,在centos6當中這個環境的版本是1.3.9,如下:
[root@www ~]# rpm -qa | grep apr
apr-1.3.9-5.el6_2.x86_64
apr-util-ldap-1.3.9-3.el6_0.1.x86_64 #除了上面apr的主要程序,下面這兩個程序也是非常重要的哦!
apr-util-1.3.9-3.el6_0.1.x86_64 #這三個加起來就是apache在安裝時的基本環境
而2.4版本的apache所依賴的環境並不是1.3.9了,而是1.4以上,你可能會說了,把apr升級成1.4之後再安裝2.4版本的apache不就行了嗎?這樣做太冒險,因爲apr這個環境不僅僅是apache所依賴,可能別的軟件也會依賴,所以還是儘量不要升級,所以在centos6上安裝apache2.4只有一種辦法了就是編譯安裝,下面就演示一下在centos6上進行apache2.4的編譯安裝。
1.1.2 在6上編譯安裝apache2.4
安裝前的準備:
yum groupinstall “Development tools” “Server Platform Development” –y
yum –y install pcre pcre-devel
groupadd –r apache
useradd –r –g apache apache
apr安裝:
apr-1.5.2
./configure --prefix=/usr/local/apr
apr-util安裝:
arp-utils-1.5.3
./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr #with的意思是針對於apr來安裝apr-utill
httpd2.4的安裝:
wget http://mirrors.tuna.tsinghua.edu.cn/apache//httpd/httpd-2.4.33.tar.gz #下載
yum -y install pcre pcre-devel #這兩個包是開發包,必須要安裝
yum –y install openssl-devel
./configure --prefix=/usr/local/apache --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm-prefork
make
make install
--prefix是指明路徑,不必多說
--sysconfig=/etc/httpd24這裏是指明存放配置文件的目錄爲/etc/httpd24,因爲使用rpm包安裝的httpd的配置文件在/etc/httpd,這裏的24主要用來區別。
--enabled-so 支持動態模塊加載機制
--enable-cgi 激活CGI後面會講cgi
--enable-rewrite作用是URL重寫
--with-zlib 作用是壓縮
--with-pcre #pcre兼容正則表達式庫(Perl Compatible Regular Expressions),在URL重寫時會用到,在安裝它之前要先安裝pcre-devel包
--with-apr-/usr/local/apr #指明2.4的依賴的apr
--with-apr-util=/usr/local/apr-util/ #指明2.4所依賴的util
--enable-modules=most #要編譯進去哪些模塊呢?most代表大多數模塊,而all代表全部模塊,後面跟上—help可以查看
--enable-mpms-shared=all #把所支持mpm模塊都編譯進來
--with-mpm-prefork #把所有的mpm模塊都編譯進來之後,默認使用prefork
啓動服務:
apache自帶了一個服務啓動腳本apachectl
apachectl start #編譯安裝的httpd不可能有服務腳本的,所以也只能通過這種方式啓動
1.1.3 在6上編譯安裝2.4之後的善後
apachectl用於控制httpd的開啓和關閉
[root@www ~]# ls /usr/local/apache/bin/apachectl #兩個命令是不一樣的。
/usr/local/apache/bin/apachectl
[root@www ~]# which apachectl
/usr/sbin/apachectl
我們首先要明白一點,apachectl這個命令無論是rpm包安裝還是使用編譯安裝都會生成此命令,不過此命令所在的路徑是不同的。以上一小節的編譯安裝路徑的來講,編譯安裝之後的apache的路徑在/usr/local/apache/bin/目錄下,而使用rpm安裝的apachectl在/usr/sbin/apachectl目錄下,所以我們在使用的時候要當心,在使用此命令的時候最好使用全路徑。
在同一時刻,我們只能啓動一個http服務,假設我只想啓動編譯安裝的,但是寫絕對路徑又太麻煩了,我們可以把絕對路徑寫入到PATH裏面,怎樣寫入呢?我們之前學過的,每啓動一個新的shell或者使用su-切換到某一個用戶都會讀取/etc/profile文件和/etc/profile.d/*.conf文件,我們在/etc/profile.d/裏面新建一個腳本文件,然後將/usr/local/apache/bin/優先於/usr/sbin,這樣的話我們直接在命令行當中定apachectl的時候,優先調用的就是編譯安裝好的那個apachectl,下面我們就來做一下:
[root@www ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@www ~]# cd /etc/profile.d #進入到/etc/profile.d目錄下
[root@www profile.d]# vim httpd.sh #寫一個全局變量賦值命令,一定要是.sh結尾
export PATH=/usr/local/apache/bin/:$PATH
[root@www profile.d]# . ./httpd.sh #重讀
[root@www profile.d]# echo $PATH #檢查
/usr/local/apache/bin/:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
好,這樣我們再使用apachectl時再調用時就是編譯好的apachectl而不是使用rpm安裝的那個了。
比如我們想要開機立馬就啓動編譯安裝好httpd,而不是rpm安裝好的,怎麼做呢?
兩種方法:
第一種非常的簡單,就是把apachectl start這種命令直接寫入到/etc/rc.d/rc.local這個文件裏面,開機自動就會執行了。
第二種就是把自己寫一個腳本加入到/etc/init目錄下,使之能夠被service命令和chkconfig命令進行調用,其實這個腳本並不難寫,我們只要仿照rpm包安裝的httpd修改一下就好,過程如下:
apachectl=/usr/local/apache/bin/apachectl #apachectl命令的路徑修改一下
httpd=/usr/local/apache/bin/httpd #httpd二進制的文件
prog=httpd #不動
pidfile=${PIDFILE-/var/run/httpd/httpd24.pid} #把httpdPID更改成httpd24
lockfile=${LOCKFILE-/var/lock/subsys/httpd24} #這個也更改成http24
[root@www init.d]# chkconfig --add httpd24
[root@www init.d]# chkconfig --list httpd24
httpd24 0:關閉 1:關閉 2:關閉 3:關閉 4:關閉 5:關閉 6:關閉
[root@www init.d]# chkconfig httpd24 on
[root@www init.d]# chkconfig --list httpd24
httpd24 0:關閉 1:關閉 2:啓用 3:啓用 4:啓用 5:啓用 6:關閉
[root@www init.d]# service httpd24 start
1.1.4 centos7上httpd
裏面提供了有各種modules,如果想改過模塊裝載與否的話只需要更改配置文件 。
而配置文件前面的序號是在glob匹配的時候有次序匹配的含義
查看模塊裝載到了什麼地方:
[root@localhost ~]# rpm -ql httpd
/usr/lib64/httpd/modules/mod_mpm_event.so
/usr/lib64/httpd/modules/mod_mpm_prefork.so
/usr/lib64/httpd/modules/mod_mpm_worker.so …………… #都裝載到了/usr/lib64/httpd/modules/下了
/etc/httpd/conf.modules.d
[root@localhost conf.modules.d]# less 00-mpm.conf #從此文件當中就可以看到用的使用mpm模塊
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #我們可以看到默認使用的還是prefork,我們可以在裏面更改……,如果我們要使用別的模型把對應行前面的註釋然後重啓即可。
systemctl restart httpd.service #重啓httpd
[root@localhost ~]# httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
[root@localhost ~]# httpd –M
[root@localhost ~]# httpd -M | grep mpm #驗證當前使用的使用mpm模塊
mpm_prefork_module (shared)
centos7:
配置文件:
l 主配置文件:/etc/httpd/conf/httpd.conf
l 模塊配置文件:/etc/httpd/conf/conf.modules.d/*.conf
l 輔助配置文件:/etc/httpd/conf.d/*.conf
l Mpm:以DSO機制提供,配置文件00-mpm.conf
服務控制:
Systemctl {start|stop|restartstatus|reload} httpd.service
如果直接使用apachectl是rpm生成的命令,如果想使用編譯安裝的話就得使用全路徑,/usr/local/apache/bin/apachectl,如果你想方便一些,不想寫這麼長的名字,您可以將共寫入到PATH變量裏面,只要在/etc/profile.d/httpd.sh:
export PATH =/usr/local/apache/bin:PATH #把sysctl寫入到前面
./etc/profile.d/httpd.sh
echo $PATH
[root@localhost ~]# setenforce 0
[root@localhost ~]# iptables -F
[root@localhost ~]# systemctl start httpd
/etc/profile.d文件
1.1 配置
1.1.1 切換使用MPM
[root@www ~]# httpd -M | grep mpm #查看當前使用的MPM模塊,在2.4當中httpd –l不會顯示使用的mpm模塊。
mpm_prefork_module (shared)
還可以像下面這樣,直接去配置文件裏面查看:
[root@localhost conf.modules.d]# cat 00-mpm.conf | egrep -v "^$|#"
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
怎樣切換MPM模塊呢?如下
[root@localhost ~]# cd /etc/httpd/conf.modules.d/ #這個目錄是專門放置模塊用的,而2.2是沒有這個目錄的
[root@localhost conf.modules.d]# vim 00-mpm.conf #把想要開啓的mpm模塊前的#去掉檢查語法後然後重啓服務即可,假設我們在這裏把prefork更改成了event。
[root@localhost conf.modules.d]# httpd –t
Syntax OK
[root@localhost conf.modules.d]# systemctl restart httpd.service
[root@localhost ~]# httpd -M | grep mpm #event模塊生效
mpm_event_module (shared)
1.1.2 虛擬主機
虛擬主機的配置內容與6是一樣的,不過centos7我們可以把虛擬主機的配置內容專門拿出來生成一個配置文件以.conf結尾的文件放置到/etc/httpd/conf.d目錄下,注意,要把中心主機給註釋掉。
編譯安裝的2.4版本也是被拆分成一個又一個小片段放置在/etc/httpd24/extra/這個輔助配置文件裏面了。
1.1.3 訪問控制
2.4的根目錄與2.2的根目錄配置雖然差不多,但是其運行機制變了,比如我們在2.2當中使用DocumentRoot定義了主目錄之後,下文當中的Directory所對應的目錄如果與DocumentRoot對應的目錄不同,那麼Directory裏面的限制只會限定在Directory對應的目錄當中,而DocumentRoot所有人是照常可以訪問的。
我們先用2.2來舉例子:
DocumentRoot "/www/html" #由原來的/var/www/html更改成了/www/html/,當然前是得有這個目錄
<Directory /> #此標籤下面的內容都沒動
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory "/www/html"> #這裏也更改成了與DocumentRoot對應的目錄一致,並做了限制
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Deny from 192.168.80.100/32 #拒絕了物理機
Allow from all
</Directory>
在物理機的結果是這樣的,如下:
這個結果說明我們的上面的實驗是成功的。我們再進一步,還是用2.2版本,如果Directory與DocumentRoot所對應的目錄不一樣,測試語法時會不會報錯?如果不報錯的話,假如DocumentRoot是/www/html/,與Directory寫的是/www/html/htdocs,然後在/www/html/htdocs限制了物理機的訪問,物理機肯定不能訪問/www/html/htdocs下的index.html,但是它可不可以訪問/www/html/下的index.html呢?下面我們就來試一試
DocumentRoot "/www/html" #由原來的/var/www/html更改成了/www/html/,當然前是得有這個目錄
<Directory /> #此標籤下面的內容都沒動
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory "/www/html/htdocs"> #這裏也更改成了與DocumentRoot對應的目錄不一致,並做了限制
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Deny from 192.168.80.100/32 #拒絕了物理機
Allow from all
</Directory>
實驗結果是,當物理機訪問/www/html/htdocs被拒絕,但是訪問/www/html沒有被拒絕,實驗結果截圖如下:
那麼通過這個實驗學習了什麼呢?
DocumentRoot對應的目錄可以與Directory對應的目錄不一致,在請求檢測時不會出錯,不過前提是要有這些目錄。
如果Directory標籤裏面做了限制,那麼此限制就僅僅對此標籤對應的目錄起作用,如果此標籤Directory與DocumentRoot對應的目錄一致,那麼限制自然就一致,如果不一致,就僅對Directory做限制,而DocumentRoot那裏對應的目錄因爲沒有限制,默認誰都可以進行訪問,那麼以上就是apache2.2版本DocumentRoot和Directory的關係。
下面我們再看一下2.4版本關於DocumentRoot和Directory的關係,在centos7上做,當然了還是用實驗說話:
DocumentRoot "/www/html" #由原來的/var/www/html更改成了/www/html/,當然前是得有這個目錄
<Directory "/var/www"> #沒做更改
AllowOverride None
Require all granted
</Directory>
<Directory "/www/html/htdocs"> #與DocumentRoot不一致
Options Indexes FollowSymLinks
AllowOverride None
<RequireAll> #與2.2不同的是,這時要專門制定一個標籤
Require not ip 192.168.80.100/32
Require all granted
</RequireAll>
實驗結果:
當我們把 <RequireAll> 標籤當中的拒絕項給刪除之後,如下,實驗結果又是這樣的,
<RequireAll>
Require all granted
</RequireAll>
那麼我們通過2.2與2.4的配置文件的對比,我們最應該明白的一點就是:
2.2版本的DocumentRoot對應的目錄,在沒做Directory限制時,默認允許所有人訪問
2.4版本的DocumentRoot對應的目錄,在沒做Directory限制時,默認拒絕所有人訪問
2.4的版本的配置文件有所變量,虛擬主機可自定義到目錄當中,刪除和更改都非常的方便,由其是自動化運維的時候。
編譯後的centos6服務腳本
在cetos6當中編譯安裝2.4之後默認是沒有服務腳本,沒有服務就沒有辦法使用service命令進行程序的控制,我們可以利用rpm默認安裝的服務腳本,把腳本里面的程序的路徑改成使用編譯安裝的程序的路徑就可以了,非常的簡單。
[root@www init.d]# cp httpd httpd24
apachectl=/usr/local/apache/bin/apachectl #改
httpd=/usr/local/apache/bin/apachectl #改
prog=httpd #沒有更改
pidfile=${PIDFILE-/var/run/httpd/httpd24.pid} #改
lockfile=${LOCKFILE-/var/lock/subsys/httpd24} #改
[root@www init.d]# chkconfig --add httpd24
[root@www init.d]# chkconfig --list httpd24
httpd24 0:關閉 1:關閉 2:關閉 3:關閉 4:關閉 5:關閉 6:關閉
[root@www init.d]# chkconfig httpd24 on