httpd之安装与配置

httpd的安装与配置...

安装

yum安装

yum install -y httpd
直接安装即可,共计安装5个rpm包;

systemctl enable httpd; systemctl start httpd
启动,开机自启动

编译安装

官方文档:http://httpd.apache.org/docs/2.4/install.html

  1. 安装依赖包,编译工具
  2. configure、make、make install 三步走
  3. 安装后配置
    1. PATH变量、
    2. man文件、头文件、库文件、[可选]
    3. 单独的网页文件存放目录,(一般单独挂载高可用的存储设备,或nfs共享)
    4. 添加apache用户
    5. 服务脚本、配置文件准备

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进来,然后根据合并顺序处理

合并顺序:

  1. directory:
  2. directorymatch
  3. files和filesmatch等级别
  4. location和locationmatch等级别
  5. 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后续覆盖了!
updatedupdated2020-10-162020-10-16
加载评论