apache2.4

第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

make && make install

apr-util安裝

arp-utils-1.5.3

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr  #with的意思是針對於apr來安裝apr-utill

make && make install

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

image.png

裏面提供了有各種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>

在物理機的結果是這樣的,如下:

image.png

這個結果說明我們的上面的實驗是成功的。我們再進一步,還是用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沒有被拒絕,實驗結果截圖如下:

image.png

image.png

那麼通過這個實驗學習了什麼呢?

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>

實驗結果:

image.png

image.png

當我們把 <RequireAll> 標籤當中的拒絕項給刪除之後,如下,實驗結果又是這樣的, 

<RequireAll>                  

    Require all granted

</RequireAll>

image.png

image.png

那麼我們通過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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章