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