httpd-2.4的編譯安裝


httpd-2.4的編譯安裝

 

httpd-2.4與2.2版比新特性

1、MPM支持運行爲DSO機制,以模塊西施按需加載

2、event模塊生產環境中使用

3、異步讀寫機制

4、支持每日誌每模塊的單獨日誌級別定義

5、每請求相關的專用配置

6、增強版的表達式分析

7、毫秒級持久連接時長定義

8、基於FQDN的虛擬主機配置不需要NameVirtualHost指令

9、新指令AllowOverrideList

10、用戶可以自定義變量

11、更低的內存消耗

 

新模塊

1、mod_proxy_fcgi

2、mod_proxy_scgi

3、mod_remoteip

 

安裝http-2.4

依賴於apr-1.4以上的版本和apr-util-1.4及以上的版本。也依賴apr-icon不過不是必須的。

apr:apache portable runtime

apache是一個跨平臺的web服務器程序,在linux,Unix,windows,mac等操作系統都有其版本。由於操作系統的不同,需要在各個操作系統各寫一個版本非常麻煩,於是就有了apr;開發者只需寫一個httpd的源碼,通過apr編譯成在各個操作系統能運行的版本。可見apache對apr的依賴性。通常習慣把httpd成爲apache。

 

 

在CentOS 6上編譯安裝

由於在centos6上默認apr,和apr-util都是1.3.9版本,依賴程序不夠,很悲劇,我們只能手動編譯安裝httpd-2.4.

任何時候編譯安裝都要有開發環境:

開發環境包組:Development Tools, Server Platform Development

開發程序包:pcre-devel

先配置好yum源,然後安裝:

[root@yph6 yum.repos.d]# yum groupinstall Development Tools Server Platform Development

用網上的yum源安裝的非常慢,用教室yum源第一次查找成功但安裝失敗,又試一次居然成功了,不知道什麼原因。

[root@yph6 ~]# yum install -y pcre-devel

 

編譯安裝步驟:

 事先下載好源碼包:apr-1.5.0.tar.bz2 ,apr-util-1.5.2.tar.bz2 ,httpd-2.4.10.tar.bz2

 

(1)安裝apr-1.5.0

[root@yph6 ~]# tar xf apr-1.5.0.tar.bz2 

[root@yph6 ~]# cd apr-1.5.0

[root@yph6 apr-1.5.0]# ./configure --help | less  ----可以用less查看幫助,而且支持/parrten查找

[root@yph6 apr-1.5.0]# ./configure --prefix=/usr/local/apr  

rpm命令默認安裝目錄爲/usr,爲了便於以後卸載,我們安裝到另一個目錄/usr/local/apr

[root@yph6 apr-1.5.0]# make && make install

[root@yph6 apr-1.5.0]# ls /usr/local/apr

bin  build-1  include  lib  -----------------看到這些說明已經安裝成功了

 

(2)安裝apr-util-1.5.2

[root@yph6 ~]# tar -xf apr-util-1.5.2.tar.bz2 

[root@yph6 ~]# cd apr-util-1.5.2

[root@yph6 apr-util-1.5.2]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr

apr-util安裝時會默認去/,/usr,/usr/local下找依賴包apr,找不到會報錯,所以要告訴它依賴包安裝載哪

[root@yph6 apr-util-1.5.2]# make -j 2 && make install ----make -j 2表示用兩個進程安裝,如果你cpu夠的話

[root@yph6 apr-util-1.5.2]# ls /usr/local/apr-util

bin  include  lib

 

(3)安裝httpd-2.4.10

[root@yph6 ~]# tar xf httpd-2.4.10.tar.bz2 

[root@yph6 ~]# cd httpd-2.4.10

[root@yph6 httpd-2.4.10]# ./configure --help | less  -----有非常多的命令,可見功能的強大

[root@yph6 httpd-2.4.10]# ./configure --prefix=/usr/local/httpd24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-arp=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork

[root@yph6 httpd-2.4.10]# make -j 2 && make install

 

enable表示啓用哪些

with表示依賴的程序,或者依賴包的安裝路徑

--sysconfdir=/etc/httpd24:指明conf配置文件放到哪----但好像不起作用,因爲前面少寫了“--”

enable-so:動態so機制,dso

enable-rewrite:支持URL重寫

--with-zlib:提供壓縮庫,能壓縮文件

--with-pcre:支持更強大的擴展正則表達式

--enable-modules=most:啓用哪些模塊,most表示大多數,all表示所有,也可以把模塊列在後面

--enable-mpms-shared=all:所有共享模塊

 

[root@yph6 httpd24]# /usr/local/httpd24/bin/apachectl start

自帶的服務控制腳本:apachectl,默認不在PATH路徑中,所以啓動時要用絕對路徑

剛纔保存說找不到域名,在/usr/local/httpd24/conf/httpd.conf查找到/ServerName,在下面複製出來一行,取消註釋,隨便給個名字,如localhost,www.a.com等都行,不讓它反解析。

 

[root@yph6 httpd24]# netstat -tunl  ---會看到80端口被監聽

[root@yph6 ~]# ss -tnl

瀏覽器訪問172.16.59.10會看到“It works”,說明啓動成功

 

[root@yph6 httpd24]# ls /usr/local/httpd24

bin  :二進制程序路徑

build  :編譯安裝的相關文件,

[root@yph6 httpd24]# less build/config.nice 可以看到咱們編譯安裝時執行了哪些命令

cgi-bin  :CGI格式的頁面程序存放的位置

conf  :配置文件,由於編譯安裝時指定配置文件時把路徑寫錯了,所以默認安裝到這裏了。

--sysconfdir=/etc/httpd24 編譯安裝時指定配置文件安裝位置

error  :錯誤頁面,比如404頁面就在這裏存放

htdocs  :網頁文件存放位置

icons  :各種圖標

include  :頭文件,

logs  :日誌

man  :幫助手冊

manual  :官方文檔

modules:模塊

 

PATH黃金變量的修改

PATH黃金變量定義的是去哪些地方找程序,不同位置用冒號隔開。默認先找左邊的位置,找不到再去第一個冒號後的位置去找,一次類推。因爲我們安裝了兩個版本的httpd,所以我們要把路徑寫在最左邊,否則第一次找到了可能是我們上一次安裝版本的apachectl,而不是,這一次安裝的。

[root@yph6 httpd24]# echo $PATH

/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@yph6 httpd24]# export PATH=/usr/local/httpd24/bin:$PATH ---在原有位置前面加一個位置。

[root@yph6 httpd24]# echo $PATH

/usr/local/httpd24/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

 

但是這種定義不能永久生效,修改配置文件永久生效。

[root@yph6 httpd24]# vim /etc/profile.d/httpd.sh ----改配置文件僅對新登錄的用戶有效

export PATH=/usr/local/httpd24/bin:$PATH


[root@yph6 ~]# httpd -t-----測語法

Syntax OK

[root@yph6 ~]# hash-------查看你最近執行過的命令的絕對路徑

hits  command

1/usr/local/httpd24/bin/httpd ------發現httpd命令的路徑也連帶着被改了。

2/usr/local/httpd24/bin/apachectl

5/usr/sbin/ss

 

導出頭文件

[root@yph6 ~]# ln -sv /usr/local/httpd24/include /usr/include/httpd

`/usr/include/httpd' -> `/usr/local/httpd24/include'

 

導出庫文件

正常情況下

[root@yph6 ~]# ldconfig -p ---------查看系統加載了哪些庫文件,這些庫文件的路徑

但我們的httpd庫文件路徑不對,告訴系統我們的庫文件在哪

[root@yph6 ~]# vim /etc/ld.so.conf.d/httpd.conf

/usr/local/apr/lib

/usr/local/apr-util/lib

/usr/local/httpd24/lib  ----------不過httpd-2.4.10庫文件好像不在這,這個可暫時不寫

[root@yph6 ~]# ldconfig -v | grep httpd ----重新加載一次庫文件,並查看加載哪些httpd的庫

 

卸載的話,執行如下操作,配置文件安裝在別處時也要手動刪除。

[root@yph6 httpd-2.4.10]# make clean  -----在源碼包裏執行,沒包的話跳過這步

rm -rf /usr/local/httpd24/

 

導出man手冊

[root@yph6 ~]# vim /etc/man.config  ----添加下面一行

MANPATH /usr/local/httpd24/man

 

利用服務腳本啓動apache:

 

[root@yph6 ~]# cd /etc/rc.d/init.d

[root@yph6 init.d]# cp httpd httpd24  -----複製2.2版本的文件

[root@yph6 init.d]# vim httpd24

註釋掉下面三行

if [ -f /etc/sysconfig/httpd ]; then

        . /etc/sysconfig/httpd

fi

 

仍需修改的如下:

apachectl=/usr/local/httpd24/bin/apachectl

httpd=${HTTPD-/usr/local/httpd24/bin/httpd}

pidfile=${PIDFILE-/usr/local/httpd24/logs/httpd.pid}

lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

 

[root@yph6 init.d]# chkconfig --add httpd24 -----把文件加進來

[root@yph6 init.d]# chkconfig --list httpd24 --------查看httpd24服務在哪個啓動級別下是開啓的

httpd24        0:off1:off2:off3:off4:off5:off6:off

 

測試下下面的執行是否有問題,結果是沒問題的。

[root@yph6 init.d]# service httpd24 status -----這個httpd24可能指腳本,反正不在這個目錄下也可以執行。不太懂。

[root@yph6 init.d]# service httpd24 stop

[root@yph6 init.d]# service httpd24 start

 

MPM模塊更換

[root@yph6 init.d]# httpd -l  ---這是剛纔安裝的httpd-2.4,沒有prefork.c或另外兩個,因爲在2.4版本上變成了共享模塊了,不在是靜態模塊了。

Compiled in modules:

  core.c

  mod_so.c

  http_core.c

[root@yph6 init.d]# /usr/sbin/httpd -l  ------這是之前安裝的httpd-2.2,有prefork.c

Compiled in modules:

  core.c

  prefork.c

  http_core.c

  mod_so.c

 

切換MPM:

由於編譯安裝時沒配置好配置文件路徑,本來要把配置文件安裝到/etc/httpd24下,結果在/usr/local/httpd24/conf/目錄下

httpd.conf爲主配置文件,額外配置文件在extra目錄下。

 

[root@yph6 conf]# vim /usr/local/httpd24/conf/httpd.conf

#Include conf/extra/httpd-mpm.conf -----去掉註釋,這樣才能啓用extra目錄下的相關配置文件

把LoadModule mpm_prefork_module modules/mod_mpm_prefork.so改爲

LoadModule mpm_event_module modules/mod_mpm_event.so

或者這是掉寫到..../extra/httpd-mpm.conf裏去

 

[root@yph6 conf]# service httpd24 restart ----重啓服務,或用apachectl 

[root@yph6 extra]# httpd -M | grep mpm

 mpm_event_module (shared)    ----------------模塊切換成功

 

 

在CentOS 7上安裝

# yum install  httpd


 [root@yph7s ~]# apachectl start

[root@yph7s ~]# ss -tnl

LISTEN      0              128         :::80        :::*   80端口被監聽

開啓服務時,之前用systemctl start httpd.service試了好多遍都報錯,不知道爲何。

 

 無法啓動服務的一種情況解決辦法:

[root@yph7s conf.d]# systemctl reload httpd.service 

Job for httpd.service failed. See 'systemctl status httpd.service' and 'journalctl -xn' for details.

[root@yph7s conf.d]# vim /etc/httpd/conf.modules.d/00-mpm.conf 

註釋掉event模塊,啓用prefork模塊

[root@yph7s conf.d]# systemctl restart httpd.service 


配置文件

/etc/httpd/conf/httpd.conf

/etc/httpd/conf.modules.d/*.conf

/etc/httpd/conf.d/*.conf

 

配置應用

(1) 切換使用的MPM

 

[root@yph7s ~]# ls /etc/httpd/modules/

mod_mpm_prefork.so

mod_mpm_worker.so

mod_mpm_event.so

 

[root@yph7s ~]# httpd -M | grep mpm 

 mpm_prefork_module (shared) --------也變成了共享模塊,動態模塊了,不在是靜態模塊,用httpd -l查不出來

 

[root@yph7s ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

#LoadModule mpm_worker_module modules/mod_mpm_worker.so

#LoadModule mpm_event_module modules/mod_mpm_event.so

這三行哪行沒被註釋就啓用哪個

 

[root@yph7s ~]# systemctl restart httpd.service ----重啓服務

 

(2) 基於IP的訪問控制

 

[root@yph7s ~]# mkdir -pv /web/htdocs

[root@yph7s ~]# vim /web/htdocs/index.html

 

[root@yph7s ~]# cp /etc/httpd/conf/httpd.conf{,.bak} ---備份配置文件

[root@yph7s ~]# vim /etc/httpd/conf/httpd.conf 

DocumentRoot "/web/htdocs" ---------更改web服務器的根

把<Directory "/var/www/html">改成

<Directory "/web/htdocs">

Require  all  granted  ----------允許所有主機訪問,默認是禁止所有主機訪問的,不加這句就不能訪問。

Options -Indexes FollowSymLinks,如果父目錄定義了Indexes,此目錄只想留FollowSymLinks,最好在寫上-Indexes,否則不寫Indexes時可能會從上面繼承這個屬性。用減號減去就一定能去掉了。不過測試好像有點問題。

[root@yph7s conf.d]# mv /etc/httpd/conf.d/welcome.conf{,.bak} -----關掉歡迎頁面

 

[root@yph7s ~]# httpd -t

Syntax OK

[root@yph7s ~]# systemctl start httpd.service

 

然後用瀏覽器訪問,第一次不能訪問,把SElinux關閉重啓後居然可以了,不知道是因爲重啓還是因爲關掉SElinux。

 

只有一句限制時寫一句就行了如上,如果多於一句的話就要封裝起來,如下:

<RequireAll>

Require all granted

Require not ip 172.16.59.10

</RequireAll>

 

Require的格式:

允許所有主機訪問:Require  all  granted

拒絕所有主機訪問:Require  all  deny

 

控制特定的IP訪問:

Require  ip  IPADDR:允許指定來源的IP訪問;

Require  not  ip  IPADDR:拒絕定來源的IP訪問

 

控制特定的主機訪問: 不常用,還要反解析

Require  host  HOSTNAME:授權指定來源的主機訪問;

Require  not  host  HOSTNAME:拒絕指定來源的主機訪問

 

HOSTNAME的類型:

FQDN:特定主機

domin.tld:指定域名下的所有主機

 

(3) 虛擬主機

基於FQDN的虛擬主機也不再需要NameVirutalHost指令;

 

在/etc/httpd/conf/httpd.conf中註釋掉web服務器的根

#DocumentRoot "/web/htdocs"

 

[root@yph7s conf.d]# vim /etc/httpd/conf.d/virhtdocs.conf 

<VirtualHost *:80>  ------------表示監聽本機所有可用ip的80端口        

 ServerName www.a.com

        DocumentRoot /web/a.com

        <Directory "/web/a.com">

                Options None

                AllowOverride None

                Require all granted

        </Directory>

</VirtualHost>

<VirtualHost *:80>

        ServerName www.b.com

        DocumentRoot /web/b.com

        <Directory "/web/b.com">

                Options None

                AllowOverride None

                Require all granted

         </Directory>

</VirtualHost>

 

創建web服務器主頁:

mkdir /web/{a,b}.com

vim /web/a.com/index.html

vim /web/b.com/index.html

 

語法檢測和重載

httpd -t

systemctl reload httpd.service

 

修改hosts文件並測試

172.16.59.3 www.a.com  www.b.com www.c.com

[root@yph6 conf]# curl http://www.a.com

a.com

[root@yph6 conf]# curl http://www.b.com

b.com

 

注意:任意目錄下的頁面只有在<Directory>顯式授權才能被訪問;

 

(4) 持久連接時長定義

KeepAliveTimeout  可以毫秒級,ms,一般只能用到2s

[root@yph7s conf.d]# vim /etc/httpd/conf/httpd.conf

有系統默認未定義KeepAlive,所有需手動添加:

KeepAlive on

KeepAliveTimeout 30ms

MaxKeepAliveRequests 20

 

語法檢測和重載:

httpd -t

systemctl reload httpd.service

 

 

 


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