安装
yum安装
yum install -y httpd
直接安装即可,共计安装5个rpm包;
systemctl enable httpd; systemctl start httpd
启动,开机自启动
编译安装
官方文档:http://httpd.apache.org/docs/2.4/install.html
- 安装依赖包,编译工具
- configure、make、make install 三步走
- 安装后配置
- PATH变量、
- man文件、头文件、库文件、[可选]
- 单独的网页文件存放目录,(一般单独挂载高可用的存储设备,或nfs共享)
- 添加apache用户
- 服务脚本、配置文件准备
1,安装依赖包,编译安装apr和apr-utils
# 安装依赖包,编译工具
# 包含pcre正则,expat和xml相关的包,会被httpd应用到
[root@host2 ~]# yum install -y pcre-devel expat-devel pcre gcc gcc++
# 编译安装apr
[root@host2 apr-1.6.2]# ./configure --prefix=/usr/local/apr
[root@host2 apr-1.6.2]# make && make install
[root@host2 apr-1.6.2]# ll /usr/local/apr/
total 0
drwxr-xr-x 2 root root 26 Aug 31 19:40 bin
drwxr-xr-x 2 root root 148 Aug 31 19:40 build-1
drwxr-xr-x 3 root root 19 Aug 31 19:40 include
drwxr-xr-x 3 root root 140 Aug 31 19:40 lib
# 编译安装apr-utils,需要在apr之后!
configure: error: APR could not be located. Please use the --with-apr option.
[root@host2 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
[root@host2 apr-util-1.6.1]# make && make install
[root@host2 apr-util-1.6.1]# ll /usr/local/apr-util/
total 0
drwxr-xr-x 2 root root 26 Aug 31 19:42 bin
drwxr-xr-x 3 root root 19 Aug 31 19:42 include
drwxr-xr-x 3 root root 164 Aug 31 19:42 lib
2,三步走
常见编译选项
./configure -h
...
# 查看选项,编译时应该根据实际需求选择
prefix
程序安装路径
sysconfdir
配置文件路径,非必须,不指定默认是prefix目录下的conf目录
#
--enable-mpms-shared=MPM-LIST
--with-mpm=MPM Choose the process model for Apache to use by
unless --enable-mpms-shared is also specified.
单独此项,为静态编译一个mpm模型,这样mpm就选死了;
#
--with-mpm=MPM
mpm模型三选一,如果选择是只静态编译一种mpm模型,则需要更换其他模型时,必须重新编译!
较好方式:3个都动态编译,指定一个为默认,其他2个还可以随时切换;
示例如下:意思是3种动态模型都动态编译,默认为event,安装后还可以用LoadModule指令可以切换其他2种模型
--with-mpm=event --enable-mpms-shared=all
with-z zlib
压缩启用
with-pcre
正则启用
with-apr
with-apr-utils
启用Apache Portable Runtime:为应用提供通用运行时环境
# 编译时,动态编译了3种mpm模型后,可以在模块目录看到对应的3种动态模块
[root@host2 httpd-2.4.27]# ll /usr/local/apache/modules/ |grep mpm
-rwxr-xr-x 1 apache apache 191360 Aug 18 19:35 mod_mpm_event.so
-rwxr-xr-x 1 apache apache 88720 Aug 18 19:35 mod_mpm_prefork.so
-rwxr-xr-x 1 apache apache 137424 Aug 18 19:35 mod_mpm_worker.so
configure选项中:
--disable-xx默认是开启的模块
--enable-xx默认是关闭的模块
动态/静态编译的区别
- 静态static编译:编译时,把模块编译到核心模块里面,随着核心模块启动而启动,也就是说和httpd进程的生命周期一致
- 静态shared编译:把模块编译为二进制文件,但是不随着核心模块启动而启动,而是需要的时候,用LoadModule指令引用;所谓动态,即需要增减的时候,用LoadMoudule加载或注释掉需要的模块,然后发送HUP信号,重读配置文件即实现模块的动态装载或卸载
--enable-so:启用so模块,默认启用,默认静态编译,指定为动态选择不生效
[root@host2 httpd-2.4.27]# httpd -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
一定静态编译的模块so_module,这个模块才使得httpd有了动态装载、卸载模块的能力;
DSO:dymanic shared object 动态共享模块对象;
3,开始编译
# 进入解压后目录,三步走;
# 三种mpm都动态编译,默认用event;启用pcre正则、apr跨平台、启用zlib压缩
[root@host2 httpd-2.4.27]# ./configure --prefix=/usr/local/apache --with-z --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --with-mpm=event --enable-mpms-shared=all
[root@host2 httpd-2.4.27]# make && make install
# 安装后测试
[root@host2 httpd-2.4.27]# /usr/local/apache/bin/httpd -t
Syntax OK
[root@host2 httpd-2.4.27]# /usr/local/apache/bin/httpd -k start
[root@host2 httpd-2.4.27]# curl localhost
<html><body><h1>It works!</h1></body></html>
4,编译安装后配置
# path变量配置
[root@host2 httpd-2.4.27]# cat /etc/profile.d/httpd.sh
export PATH=/usr/local/apache/bin:$PATH
[root@host2 httpd-2.4.27]# source !$
source /etc/profile.d/httpd.sh
# 改httpd的进程启动用户,默认为nobody
[root@host2 httpd-2.4.27]# useradd apache
[root@host2 httpd-2.4.27]# id apache
uid=1000(apache) gid=1000(apache) groups=1000(apache)
[root@host2 apache]# vim conf/httpd.conf
...
User apache
Group apche
...
[root@host2 apache]# apachectl -k restart
# 服务脚本准备
实验时,从yum安装中复制过来,然后修改的服务脚本有点问题,无法关闭进程
# 解决方法:命令行方式管理httpd进程,
apachectl脚本,或httpd即可完成程序的启停;
# 再结合利用/etc/rc.local可以实现开机自启动
以下:非必须配置,但path变量一般都需要配置
--
manpath配置
echo "MANPATH /usr/local/apache/man" >> /etc/man.config
--
path配置
echo "PATH=/usr/local/apache/bin:$PATH" >> /etc/profile.d/apache.sh
source /etc/profile.d/apache.sh
--
头文件引用?
ln -s /usr/include /usr/local/apache/include
service编写,用yum安装的修改即可;
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/local/apache/bin/httpd $OPTIONS -k start -DFOREGROUND
ExecReload=/usr/local/apache/bin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
主要改了httpd进程的路径;
能启动,能访问,但是启动、关闭,都卡住?如果是命令正常,应该是service文件问题;编译没问题;
httpd编译第三方模块
下载httpd-devel包,依赖apxs命令
# apxs命令可以帮助编译httpd模块,编译安装时自带该命令;yum安装时,属于httpd-devel包命令
详细看man手册
[root@host2 modules]# apxs
Usage: apxs -g [-S <var>=<val>] -n <modname>
apxs -q [-v] [-S <var>=<val>] [<query> ...]
apxs -c [-S <var>=<val>] [-o <dsofile>] [-D <name>[=<value>]]
[-I <incdir>] [-L <libdir>] [-l <libname>] [-Wc,<flags>]
[-Wl,<flags>] [-p] <files> ...
apxs -i [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
apxs -e [-S <var>=<val>] [-a] [-A] [-n <modname>] <dsofile> ...
示例:开始编译proxy代理模块
apxs -c -i -A /usr/local/src/httpd-2.4.7/modules/proxy/mod_proxy.c /usr/local/src/httpd-2.4.7/modules/proxy/proxy_util.c
...
[root@host2 apache]# ll modules/ |grep proxy.so
-rwxr-xr-x 1 root root 373872 Aug 31 19:47 mod_proxy.so
# 查看现有proxy模块;
[root@host2 apache]# mv modules/mod_proxy.so /root/
[root@host2 apache]# ll modules/ |grep proxy.so
# 将proxy模块移走;
[root@host2 apache]# apxs -c -i -A /root/httpd-2.4.27/modules/proxy/mod_proxy.c /root/httpd-2.4.27/modules/proxy/proxy_util.c
/usr/local/apr/build-1/libtool --silent --mode=compile gcc -std=gnu99 -prefer-pic -DLINUX -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread -I/usr/local/apache/include -I/usr/local/apr/include/apr-1 -I/usr/local/apr-util/include/apr-1 -c -o /root/httpd-2.4.27/modules/proxy/mod_proxy.lo /root/httpd-2.4.27/modules/proxy/mod_proxy.c && touch /root/httpd-2.4.27/modules/proxy/mod_proxy.slo
...
# 开始编译
[root@host2 apache]# ll modules/ |grep mod_proxy.so
-rwxr-xr-x 1 root root 373920 Sep 1 10:22 mod_proxy.so #新模块
[root@host2 apache]# ll /root/mod_proxy.so
-rwxr-xr-x 1 root root 373872 Aug 31 19:47 /root/mod_proxy.so #原有模块
# 编译后发现,已经有了新编译的proxy模块;和移走的老模块大小不完成一致,但不影响httpd运行;
安装后目录结构
编译安装目录结构
# 安装后目录结构
[root@host2 httpd-2.4.27]# ll /usr/local/apache/
total 36
drwxr-xr-x 2 root root 262 Aug 31 19:47 bin # 程序目录
drwxr-xr-x 2 root root 167 Aug 31 19:47 build
drwxr-xr-x 2 root root 78 Aug 31 19:47 cgi-bin
drwxr-xr-x 4 root root 84 Aug 31 19:47 conf # 配置文件
drwxr-xr-x 3 root root 4096 Aug 31 19:47 error # http的多种语言支持的错误网页,400,500状态码时返回的页面
drwxr-xr-x 2 root root 24 Aug 31 19:47 htdocs # 网页文件根目录
drwxr-xr-x 3 root root 8192 Aug 31 19:47 icons # 图标
drwxr-xr-x 2 root root 4096 Aug 31 19:47 include # 头文件
drwxr-xr-x 2 root root 6 Aug 31 19:47 logs # 日志:包含access.log error.log httpd.pid,和nginx类似;
drwxr-xr-x 4 root root 30 Aug 31 19:47 man # man手册
drwxr-xr-x 14 root root 8192 Aug 31 19:47 manual
drwxr-xr-x 2 root root 4096 Aug 31 19:47 modules # 动态模块文件
# 程序目录
# 有httpd主程序;apachectl调用主程序脚本;ab压测工具,htpasswd密码文件创建工具;rotatelogs日志轮替工具;apxs为perl语言的脚本,可以帮助编译第三方模块;
[root@host2 httpd-2.4.27]# ll /usr/local/apache/bin/
total 2576
-rwxr-xr-x 1 root root 98608 Aug 31 19:47 ab
-rwxr-xr-x 1 root root 3434 Aug 31 19:45 apachectl
-rwxr-xr-x 1 root root 23514 Aug 31 19:45 apxs
-rwxr-xr-x 1 root root 13144 Aug 31 19:47 checkgid
-rwxr-xr-x 1 root root 8925 Aug 31 19:45 dbmmanage
-rw-r--r-- 1 root root 1071 Aug 31 19:45 envvars
-rw-r--r-- 1 root root 1071 Aug 31 19:45 envvars-std
-rwxr-xr-x 1 root root 23864 Aug 31 19:47 fcgistarter
-rwxr-xr-x 1 root root 79816 Aug 31 19:47 htcacheclean
-rwxr-xr-x 1 root root 47352 Aug 31 19:47 htdbm
-rwxr-xr-x 1 root root 25112 Aug 31 19:47 htdigest
-rwxr-xr-x 1 root root 49064 Aug 31 19:47 htpasswd
-rwxr-xr-x 1 root root 2134840 Aug 31 19:47 httpd
-rwxr-xr-x 1 root root 22024 Aug 31 19:47 httxt2dbm
-rwxr-xr-x 1 root root 25128 Aug 31 19:47 logresolve
-rwxr-xr-x 1 root root 41240 Aug 31 19:47 rotatelogs
yum安装目录结构
[root@host2 apache]# ll /etc/httpd/
total 0
drwxr-xr-x 2 root root 37 Sep 1 10:37 conf # 内有主配置文件的目录
drwxr-xr-x 2 root root 82 Sep 1 10:37 conf.d # 默认欢迎页面配置文件的目录
drwxr-xr-x 2 root root 146 Sep 1 10:37 conf.modules.d # 配置引用哪些动态模块的配置文件的目录
lrwxrwxrwx 1 root root 19 Sep 1 10:37 logs -> ../../var/log/httpd # 日志文件
lrwxrwxrwx 1 root root 29 Sep 1 10:37 modules -> ../../usr/lib64/httpd/modules # 模块文件目录
lrwxrwxrwx 1 root root 10 Sep 1 10:37 run -> /run/httpd # pid文件目录
[root@host2 apache]#
# yum安装时几个重要文件
/usr/sbin/httpd 主程序
/etc/httpd/conf/httpd.conf 主配置
/usr/lib/systemd/system/httpd.service 服务脚本
/var/www/html 网站文件根目录
/usr/lib64/httpd/modules/ 目录下的模块文件
编译模块查看
[root@host2 apache]# httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
[root@host2 apache]# httpd -M
Loaded Modules:
core_module (static)
so_module (static)
http_module (static)
authn_file_module (shared)
authn_core_module (shared)
...
#看出静态编译的有core,http_core,mod_so,其余为动态模块,通过LoadModule指令动态装载;可以在<prefix>/modules目录下找到;
httpd/apachectl管理命令
[root@localhost ~]# httpd -h
Usage: httpd [-D name] [-d directory] [-f file]
[-C "directive"] [-c "directive"]
[-k start|restart|graceful|graceful-stop|stop]
[-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
root@localhost ~]# apachectl -h
Usage: /usr/sbin/httpd [-D name] [-d directory] [-f file]
[-C "directive"] [-c "directive"]
[-k start|restart|graceful|graceful-stop|stop]
[-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
此2个命令,可以管理httpd进程的启停,查看状态,程序版本,编译选项等;
apachectl是脚本,调用httpd,httpd是二进制程序
配置文件与指令
2.4版本文档 http://httpd.apache.org/docs/2.4/
指令介绍文档 http://httpd.apache.org/docs/2.4/mod/directives.html
httpd.conf
此为yum安装httpd配置文件
目录权限的放行,2个方面:
- directory指令内要放行
- httpd进程用户如apache对目录有相应权限,一般改为属主即可
[root@host2 ~]# grep -vE "^(.*#|^$)" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"
程序根目录;
Listen 80
监听端口,可以写多行,多个端口;不写ip就是本机所有ip
Include conf.modules.d/*.conf
导入模块配置文件
User apache
Group apache
进程用户身份
ServerAdmin root@localhost
管理员邮箱
<Directory />
AllowOverride none
Require all denied
</Directory>
先把主机文件系统的根都禁止了,再根据需要放开小范围的子目录;
DocumentRoot "/var/www/html"
默认站点的网站文件根目录
<Directory "/var/www">
AllowOverride None
Require all granted
</Directory>
放开httpd进程对/var/www目录的访问;
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
放开httpd进程对/var/www/html目录的访问;【仍需注意httpd进程用户如apache对改目录的权限;一般改为apache属主】
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
如果dir_module模块加载了,内部指令生效;全局的生效,可被覆盖!
指令作用,为设置访问目录时,默认返回的文件
<Files ".ht*">
Require all denied
</Files>
禁用.ht文件的访问,全局的,可被覆盖;
ErrorLog "logs/error_log"
LogLevel warn
全局errolog日志路径,级别,可被覆盖
设置虚拟主机时,可以自定义自己的日志路径,级别,若不设置,默认都在该全局日志文件中
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
如果log_config_module加载了,内部指令生效,全局,可覆盖;可引用日志格式;
定义全局accesslog路径、格式,可覆盖
设置虚拟主机时,可以自定义自己的日志路径,级别,若不设置,默认都在该全局日志文件中
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
如果alias_module加载了 内部指令生效;将对uri的访问,/cgi-bin/定向到文件系统的/var/www/cgi-bin/路径下寻找!
如访问www.a.com/cgi-bin/1.cgi时,寻找到的文件为文件系统上/var/www/cgin-bin/1.cgi
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
对文件系统目录/var/www/cgi-bin的放行,directory指令层面放行;
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
若mime_module模块加载了,内部指令生效;
定义httpd支持,识别的文件类型
AddDefaultCharset UTF-8
默认编码
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
开启sendfile,用于零复制,加速响应
IncludeOptional conf.d/*.conf
导入其他配置,如虚拟主机的配置
导入模块的配置文件,所在的目录
[root@host2 conf.modules.d]# pwd
/etc/httpd/conf.modules.d
[root@host2 conf.modules.d]# ll
total 28
-rw-r--r-- 1 root root 3739 Nov 27 2019 00-base.conf
-rw-r--r-- 1 root root 139 Nov 27 2019 00-dav.conf
-rw-r--r-- 1 root root 41 Nov 27 2019 00-lua.conf
-rw-r--r-- 1 root root 742 Nov 27 2019 00-mpm.conf
-rw-r--r-- 1 root root 957 Nov 27 2019 00-proxy.conf
-rw-r--r-- 1 root root 88 Nov 27 2019 00-systemd.conf
-rw-r--r-- 1 root root 451 Nov 27 2019 01-cgi.conf
都是导入模块的配置文件;注意依赖性;分类写在不同的配置文件中;
conf.d下welcome.conf文件定义了默认的欢迎页面;
在/usr/share/httpd/noindex下;
[root@host2 ~]# httpd -M |wc -l
83
3个静态,80个动态的,且启用的;
[root@host2 ~]# httpd -l
Compiled in modules:
core.c
mod_so.c
http_core.c
[root@host2 ~]#
l选项列出静态的模块,即:核心模块;so模块支持DSO动态模块的模块;http模块
[root@host2 conf.modules.d]# ll /usr/lib64/httpd/modules/ | grep -v "total"| wc -l
100
yum安装版本一共编译进了100个动态模块;3个静态的不在此目录;在主程序内部
LoadModule 指令,加载需要的模块,采用相对路径,不需要重启生效;模块有依赖关系;
prefork参数
StartServers 8 启动时启动几个子进程;
MinSpareServers 5 最少空闲子进程
MaxSpareServers 30 最多空闲的子进程
ServerLimit 256 最多能开启的进程数
MaxClients 256 最大并发连接数;
MaxRequestsPerchild 4000 每个子进程处理最多4000次请求后就杀死,重启一个,为了稳定;
worker参数
ServerLimit 16最多进程数
StartServers 2 启动时启动的进程数;
MaxRequestWorkers 150 官方解释;
The MaxRequestWorkers directive sets the limit on the number of simultaneous requests that will be served. Any connection attempts over the MaxRequestWorkers limit will normally be queued, up to a number based on the ListenBacklog directive. Once a child process is freed at the end of a different request, the connection will then be serviced.
MinSpareThreads 25 整体最少空闲线程
MaxSpareThreads 75 整体最多空闲线程
ThreadsPerChild 25 每个worker子进程启动的线程数
配置文件常见指令
【配置文件中的常见指令是由一个个模块提供的代码实现,语法:指令:值——directive:values】
- Listen 监听端口
- ServerRoot 程序根目录
- DocumentRoot 网页文件根目录
- Directoryindex 访问uri为目录时,默认返回的页面文件
- ServerName 、ServerAlias 虚拟主机的主机名,别名;
- Include 导入哪些配置文件
- Define 、UnDefine 定义变量
- VirtualHost 虚拟主机配置段
- Options 、AllowOverride 定义目录属性等信息
- Require
- 长连接相关指令
Listen
配置httpd监听的端口,可以加地址,不加默认是本机所有ip的端口;
38 # Change this to Listen on specific IP addresses as shown below to
39 # prevent Apache from glomming onto all bound IP addresses.
40 #
41 #Listen 12.34.56.78:80
42 Listen 80
ServerRoot
ServerRoot 是指httpd程序的家目录,如果是编译安装,一般是在/usr/local/apache/
目录下有log,module等目录;
yum安装的默认是在/etc/httpd
22 # ServerRoot: The top of the directory tree under which the server's
23 # configuration, error, and log files are kept.
24 #
25 # Do not add a slash at the end of the directory path. If you point
26 # ServerRoot at a non-local disk, be sure to specify a local disk on the
27 # Mutex directive, if file-based mutexes are used. If you wish to share the
28 # same ServerRoot for multiple httpd daemons, you will need to change at
29 # least PidFile.
30 #
31 ServerRoot "/etc/httpd"
DocumentRoot
是指静态页面文件所在的目录,yum安装的,默认主机的目录默认在 /var/www/html
每个虚拟主机都可以配置自己的DocumentRoot
/var/www/html是默认虚拟主机的网页文件根目录
115 # DocumentRoot: The directory out of which you will serve your
116 # documents. By default, all requests are taken from this directory, but
117 # symbolic links and aliases may be used to point to other locations.
118 #
119 DocumentRoot "/var/www/html"
Directoryindex
配置的是:当url访问路径是以/结尾时,web会显示该目录下的那个具体文件;即访问的不是具体文件,是目录时,默认找该目录下哪个文件返回给客户端,可定义多个,根据次序寻找,找到即返回;
如访问http://1.1.1.1/dir1/时;
160 # DirectoryIndex: sets the file that Apache will serve if a directory
161 # is requested.
162 #
163 <IfModule dir_module>
164 DirectoryIndex index.php index.xyz index.html
165 </IfModule>
会依次寻找在${documentroot}目录下的dir1目录下的index.php index.xyz index.html,找到哪个就显示哪个
---
如果directoryindex定义的文件都没找到,此时又设置了 Options Indexes ,会列出当前目录的所有文件,仅限于充当下载服务器时,不然有安全隐患;
要点:
1,要加入Options Indexes选项;
2,该目录下要不存在定义的默认文件,index.html index.php index.htm等;
和nginx类似
1,开启autoindex on选项;
2,目录下不存在定义的默认文件,index.html index.php index.htm等;
<directory /usr/local/apache/htdocs/dir1>
Options Indexes
DirectoryIndex index.php index.html index.xyz
</directory>
ServerName 、ServerAlias
89 # ServerName gives the name and port that the server uses to identify itself.
90 # This can often be determined automatically, but we recommend you specify
91 # it explicitly to prevent problems during startup.
92 #
93 # If your host doesn't have a registered DNS name, enter its IP address here.
94 #
95 #ServerName www.example.com:80
定义虚拟主机的主机名;没明确指定时,httpd默认的虚拟主机会集成当前主机的主机名
如localhost.localdomain
---
一般基于主机头的每个虚拟主机都会设置一个ServerName,至于ServerAlias是其小名;
<VirtualHost *:80>
ServerName pc.bo.com
ServerAlias pc pc-name
</VirtualHost>
Include
---
45 # Dynamic Shared Object (DSO) Support
46 #
47 # To be able to use the functionality of a module which was built as a DSO you
48 # have to place corresponding `LoadModule' lines at this location so the
49 # directives contained in it are actually available _before_ they are used.
50 # Statically compiled modules (those listed by `httpd -l') do not need
51 # to be loaded here.
52 #
53 # Example:
54 # LoadModule foo_module modules/mod_foo.so
55 #
56 Include conf.modules.d/*.conf
将模块相关的配置文件导入进来,支持*的通配符,但要注意文件导入的顺序,有时可能会出错;模块之间有依赖性;
---
352 # Load config files in the "/etc/httpd/conf.d" directory, if any.
353 IncludeOptional conf.d/*.conf
IncludeOptional 在要导入的文件不存在时不报错,Include就不行,会报错;
httpd启动之前,会把include包含的文件,都合并在一起,再运行;
Define 、UnDefine
定义一个变量,【向后】全局范围生效;
配置文件的 Define 等同于httpd 启动时的 -D name命令行参数;
-D 命令行定义的参数由于配置文件,
Define param [value] 定义
${param} 引用
UnDefine param 取消定义
VirtualHost
<VirtualHost 1.1.1.1:80> # ip选择*为监听本机所有ip,端口可以自定义实现基于端口的虚拟主机
ServerName pc.bo.com # 定义虚拟主机主机名;
DocumentRoot "/var/www/html/pc" # 该虚拟主机的网页文件根目录,【注意Directory指令放行】
ErrorLog "logs/pc.bo.error.log" # 定义错误日志
TransferLog "logs/pc.bo.access.log" # 定义访问日志;
</VirtualHost>
虚拟主机,根据最多匹配原则,请求被转发给能匹配最多的虚拟主机上
Options 、AllowOverride
---
Options 指令可以启动或禁用其所在目录的某些特性;该指令的值有:
All
None
ExecCGI
FollowSymLinks
Includes
IncludesNOEXEC
Indexes 展示当前目录下文件,下载服务时需要
MultiViews
SymLinksIFOwnerMatch
不指定options,默认为all,一般除了下载服务会开启indexes选择,其他都禁用;
用Options None
---
allowoverride指令用于控制是否读取.htaccess配置文件;
。。没懂;
Require
用于控制对目录的访问权限;主要功能由mod_authz_core模块提供;
长连接相关指令
KeepAlive on/off
没有长连接时,客户端请求建立了一个tcp连接后,发一个http请求,服务端响应后,就把该连接关闭;
开启长连接时,允许客户端和服务端建立的一个tcp连接期间,客户端可以向服务器发起多次http请求;2个请求之间的时间间隔超过设定的超时时间后,就会断开,客户端需求再发起请求的话,需要再次发起建立tcp连接请求;
长连接内,每发一个新请求,计时器会归零重新计时;若设置了一次长连接最大可发的请求数,即便请求间隔不超时超时时间,达到上限次数后,也会关闭;
KeepAliveTimeout 60 2次请求间隔超过60s就断开
MaxKeepAliveRequests 500 一次长连接最多500个请求,多于500个后,即使超时时间不到,也会断开长连接;
容器类指令
、 、 、 # 针对的是文件系统 # 针对的是uri 、 、 判断
---
<Directory>指令,作用是对于匹配到的目录,封装一组指令,改指令对该目录递归生效;
一般是绝对路径,目录指的是根文件系统的目录,一般以"/“开头,使用相对路径也是相对于根
<Directory dir1> 等价于<Directory /dir1> 匹配的是主机上的 /dir1
示例:禁止根下所有的访问,但是放开/var/www的访问;
---
禁止:
102 <Directory />
103 AllowOverride none
104 Require all denied 禁止
105 </Directory>
表示主机的根文件系统从根开始不给访问;先从大范围禁止,逐步放开小范围,安全!
放开
122 # Relax access to content within /var/www.
123 #
124 <Directory "/var/www">
125 AllowOverride None
126 # Allow open access:
127 Require all granted 拒绝
128 </Directory>
Options 可以跟多个值;
Indexes 该项开放文件列表给用户;
FollowSymLinks 允许访问符号连接源文件;
#
AllowOverride
控制.htaccess文件中的访问控制相关指令;能否覆盖主配置文件;
AllowOverride All; .htaccess指令都有效;
AllowOverride None;.htaccess 文件整个无效
AllowOverride AuthConfig .htaccess 除了authcofig,.htaccess文件中其他指令无效;
files匹配的是单个,或一写文件,生效范围是限于它所在的外层标签;
如下:/usr/local/apache/htdocs目录下,都可以访问,除了其下的private.html文件(递归生效)
<Directory /usr/local/apache/htdocs>
require all granted
<Files private.html>
required all denied
</Files>
</Directory>
---
directory 和files指令支持 * ? [a-Z]等通配符,但是通配符,【不能匹配/符号】即不能跨目录
例如:
<Directory /*/public.html> 不能匹配 /home/wang/public.html
<Directory /home/*/public.html> 才能匹配;
--- 支持正则表达式,用~符号
<Directory ~ /usr/local/apache/htdocs/dir[1-9]>
</Directory>
等价于
<DirectoryMatch /usr/local/apache/htdocs/dir[1-9]>
</Directory>
<Files>指令也支持正则;
Directory和Files匹配的都是 本机主机的根文件系统上的路径!
而Location匹配的是URL后面的路径;
相同:都是对匹配到的路径,封装一组指令,只在该匹配路径内生效;
示例:
http://1.1.1.1/dir1/index.html
匹配的location是:
<Location "/dir1">
...
</Location>
---
location 三种模式:
1,location精确匹配url路径
2,location末尾加/ 只匹配该目录下的文件
3,location末尾不加/ 匹配该目录下的文件和目录本身
示例:
<Location "/dir1/">
</Location>
匹配 /dir1/ /dir1/1.txt
<Location "/dir1">
</Location>
匹配 /dir1 /dir1/ dir1/1.txt
都为条件判断容器,且都只在httpd启动时进行判断,
为真,封装在内的指令生效,否则忽略,
条件前加!表否定;
---
ifmodule,启动时加载了某模块的话,那么该容器内的指令就生效;
可以是静态加载模块,或LoadModule加载的模块,(此时,LoadModule指令需要在IfModule之前)
eg:
LoadModule status_module modules/mod_status.so
<IfModule "status_module">
<Location "/server_status">
SetHandler server-status
Require all granted
</Location>
</IfModule>
---
IfDefine param判断参数是否定义,定义了,为真,其内部指令生效;否则忽略;
条件前加!表否定;
httpd启动时,加的-D选项,和配置文件的Define指令都可定义参数;
Define指令要在IfDefine之前;
eg:
httpd -DReverserProxy -DUserCache -DMemCache ...
<IfDefine ReverseProxy>
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mode_proxy_http.so
<IfDefine UseCache>
LoadModule cache_module modules/mod_cache.so
<IfDefine MemCache>
LoadModule mem_cache_module modules/mod_mem_cache.so
</IfDefine>
<IfDefine !MemCache>
LoadModule cache_disk_module modules/mod_cache_disk.so
</IfDefine>
</IfDefine>
</IfDefine>
---
<IfVersion >=2.4>
...
</IfVersion>
eg:
判断请求主机地址是8位还是16位掩码;
<If "-R '1.1.0.0/16'">
...
</If>
<ElseIf "-R '1.0.0.0/8'">
...
</ElseIf>
<Else>
...
</Else>
配置文件合并规则
先把所有配置include进来,然后根据合并顺序处理
合并顺序:
- directory:
- directorymatch
- files和filesmatch等级别
- location和locationmatch等级别
- if
【directory之间处理顺序,先匹配离/近的,如:/var/web/dir 优于/var/web/dir/subdir】
【其余4个,根据出现在配置文件中顺序处理,如:/foo请求,location "/foo/bar" location "/foo",2个location谁在前,就匹配到谁去处理】
【virtualhost,在外部配置处理后,再处理,所以可以覆盖外部配置】
eg:请求的是/example/index.html
<Directory "/">
Header set CustomHeaderName one
<FilesMatch ".*">
Header set CustomHeaderName three
不能继续匹配的原因,是通配符不能跨目录符号/,应该是?
</FilesMatch>
</Directory>
<Directory "/example">
Header set CustomHeaderName two
</Directory>
最终首部值是three,
one-》two-》three
---
<Location "/">
E
</Location>
<Files "f.html">
D
</Files>
<VirtualHost *>
<Directory "/a/b">
B
</Directory>
</VirtualHost>
<DirectoryMatch "^.*b$">
C
</DirectoryMatch>
<Directory "/a/b">
A
</Directory>
E,location在最后
D,file次之
C,DirectoryMatch再次
B在virtualhost内部,后处理
所以顺序是:A B C D E
---
<Location "/">
Require all granted
</Location>
# Whoops! This <Directory> section will have no effect
<Directory "/">
<RequireAll>
Require all granted
Require not host badguy.example.com
</RequireAll>
</Directory>
directory顺序在前;
directory设置不生效,被location后续覆盖了!