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