本文httpd版本为:2.4.6php
先来看一下httpd.conf配置文件中的ServerRoot默认定义:html
# cat /etc/httpd/conf/httpd.conf |egrep ^ServerRoot ServerRoot "/etc/httpd"
这里咱们看到 ServerRoot 后面跟的是一个目录路径,再来看一下这个目录路径里都有些什么吧。web
# tree /etc/httpd /etc/httpd ├── conf │ ├── httpd.conf │ ├── httpd.conf.bak │ ├── httpd.conf.rpmsave │ └── magic ├── conf.d │ ├── autoindex.conf │ ├── php.conf │ ├── README │ ├── userdir.conf │ ├── virhosts.conf │ └── welcome.conf ├── conf.modules.d │ ├── 00-base.conf │ ├── 00-dav.conf │ ├── 00-lua.conf │ ├── 00-mpm.conf │ ├── 00-proxy.conf │ ├── 00-systemd.conf │ ├── 01-cgi.conf │ └── 10-php.conf ├── logs -> ../../var/log/httpd ├── modules -> ../../usr/lib64/httpd/modules └── run -> /run/httpd # ll /run/httpd/ total 8 -rw-r--r--. 1 root root 8 Feb 27 03:27 authdigest_shm.96049 drwx------. 2 apache apache 40 Feb 24 11:32 htcacheclean -rw-r--r--. 1 root root 6 Feb 27 03:27 httpd.pid
能够看出这是一个保存配置文件的目录,还有3个连接文件,分别是日志目录,模块目录和运行时PID文件目录。默认为安装目录,不需更改。正则表达式
配置语法:ServerRoot directory-path
如: ServerRoot "/usr/local/apache-2.4.6"(编译安装状况下)
注意,此指令中的路径最后不要加 / 。shell
指定服务器监听的IP和端口。默认状况下Apache会在全部IP地址上监听。Listen是Apache2.0之后版本必须设置的指令,若是在配置文件中找不到这个指令,服务器将
没法启动。apache
语法:Listen [IP-address:]portnumber [protocol]浏览器
Listen指令指定服务器在那个端口或地址和端口的组合上监听接入请求。若是只指定一个端口,服务器将在全部地址上监听该端口。若是指定了地址和端口的组合,服务器将在指定地址的指定端口上监听。可选的protocol参数在大多数状况下并不须要,若未指定该参数,则将为443端口使用默认的https 协议,为其它端口使用http协议。服务器
使用多个Listen指令能够指定多个不一样的监听端口和/或地址端口组合。网络
默认为:Listen 80dom
若是让服务器接受80和8080端口上请求,能够这样设置:
Listen 80
Listen 8080
若是让服务器在两个肯定的地址端口组合上接受请求,能够这样设置:
Listen 192.168.2.1:80
Listen 192.168.2.2:8080
若是使用IPV6地址,必须用方括号把IPV6地址括起来:
Include conf.modules.d/*.conf
2.4.6版本中全部模块加载采用了配置文件,使用Include conf.modules.d/*.conf这条指令来加载模块,这也是httpd高度模块化的一个表现。
来看一下conf.module.d/10-php.conf
# cat /etc/httpd/conf.modules.d/10-php.conf # # PHP is an HTML-embedded scripting language which attempts to make it # easy for developers to write dynamically generated webpages. # <IfModule prefork.c> LoadModule php5_module modules/libphp5.so </IfModule>
LoadModule语法:LoadModule module filename
那么10-php.conf这个文件是怎么来的呢,通过测试当你yum install php的时候会自动在这个目录下生成这个配置文件,当yum remove php时会自动删除这个文件。
User apache Group apache
User:设置实际提供服务的子进程的用户。为了使用这个指令,服务器必须以root身份启动和初始化。若是你以非root身份启动服务器,子进程将不可以切换至非特权用户,并继续以启动服务器的原始用户身份运行。若是确实以root用户启动了服务器,那么父进程将仍然以root身份运行。
用于运行子进程的用户必须是一个没有特权的用户,这样才能保证子进程无权访问那些不想为外界所知的文件,一样的,该用户亦需没有执行那些不该当被外界执行的程序的权限。强烈建议专门为Apache子进程创建一个单独的用户和组。一些管理员使用nobody用户,可是这并不能老是符合要求,由于可能有其余程序也在使用这个用户。
Group:设置提供服务的Apache子进程运行时的用户组。为了使用这个指令,Apache必须以root初始化启动,不然在切换用户组时会失败,并继续以初始化启动时的用户组运行。
# pstree root systemd─| ├─httpd───6*[httpd]
能够看到httpd父进程以root身份启动后生成了6个子进程。
# ps aux |grep httpd root 1784 0.0 0.5 308440 12012 ? Ss 18:29 0:00 /usr/sbin/httpd -DFOREGROUND apache 1785 0.0 0.3 310636 8712 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND apache 1786 0.0 0.2 310524 6688 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND apache 1787 0.0 0.2 310524 6688 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND apache 1788 0.0 0.2 310524 6456 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND apache 1789 0.0 0.2 310524 6688 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND apache 1790 0.0 0.2 310524 6456 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND
经过ps命令看到6个子进程的运行身份是apache
ServerName:设置服务器用于辨识本身的主机名和端口号。
语法:ServerName fully-qualified-domain-name[:port]
当没有指定ServerName时,服务器会尝试对IP地址进行反向查询来推断主机名。若是在ServerName中没有指定端口号,服务器会使用接受请求的那个端口。
为了增强可靠性和可预测性,建议使用ServerName显式的指定一个主机名和端口号。
若是使用的是基于域名的虚拟主机,在
例如:
# cat /etc/httpd/conf.d/virhosts.conf #virtual host 1 <VirtualHost 192.168.138.200:80> ServerName www1.frank.com DocumentRoot "/var/www/vhosts/www1" ErrorLog "/var/log/httpd/www1/error_log" CustomLog "/var/log/httpd/www1/access_log" combined </VirtualHost>
<Directory>和</Directory>用于封装一组指令,使之仅对某个目录及其子目录生效。
语法:<Directory Directory-path> ... </Directory>
Directory-path能够是一个目录的完整路径,或是包含了Unix shell匹配语法的通配符字符串。在通配符字符串中,"?"匹配任何单个的字符,"*"匹配任何字符序列。也可使用"[]"来肯定字符范围。在"~" 字符以后也可使用正则表达式。
若是有多个(非正则表达式)
正则表达式将在全部普通配置段以后予以考虑。全部的正则表达式将根据它们出如今配置文件中的顺序进行应用。
<Directory>指令不可被嵌套使用,也不能出如今<Limit>或<LimitExcept>配置段中。
# cat conf/httpd.conf |egrep -v "^#|\s{4}#" |grep -Ev "^$" <Directory /> AllowOverride none Require all denied </Directory> <Directory "/var/www"> AllowOverride None Require all granted </Directory> <Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
AllowOverride:肯定容许存在于.htaccess文件中的指令类型。
语法:AllowOverride All|None|directive-type [directive-type] ...
若是此指令被设置为None ,那么.htaccess文件将被彻底忽略。事实上,服务器根本不会读取.htaccess文件。
当此指令设置为All时,全部具备".htaccess"做用域的指令都容许出如今.htaccess文件中。
directive-type能够是下列各组指令之一:
AuthConfig 容许使用与认证受权相关的指令
FileInfo 容许使用控制文档类型的指令、控制文档元数据的指令、mod_rewrite中的指令、mod_actions中的Action指令
Indexes 容许使用控制目录索引的指令
Limit 容许使用控制主机访问的指令
Options[=Option,...] 容许使用控制指定目录功能的指令(Options和XBitHack)。能够在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制容许Options指令使用哪些选项。
AllowOverride仅在不包含正则表达式的
Order:控制默认的访问状态与Allow和Deny指令生效的顺序。
Ordering取值范围是如下几种范例之一:
Deny,Allow Deny指令在Allow指令以前被评估。默认容许全部访问。任何不匹配Deny指令或者匹配Allow指令的客户都被容许访问。
Allow,Deny Allow指令在Deny指令以前被评估。默认拒绝全部访问。任何不匹配Allow指令或者匹配Deny指令的客户都将被禁止访问。
Mutual-failure 只有出如今Allow列表而且不出如今Deny列表中的主机才被容许访问。这种顺序与"Order Allow,Deny"具备一样效果,不同意使用。
关键字只能用逗号分隔,它们之间不能有空格,在全部状况下每一个Allow和Deny指令语句都将被评估。
Allow:控制哪些主机能够访问服务器的该区域。能够根据主机名、IP地址、 IP地址范围或其余环境变量中捕获的客户端请求特性进行控制。
语法:Allow from all|host|env=env-variable [host|env=env-variable] ...
这个指令的第一个参数老是"from",随后的参数能够有三种不一样形式:若是指定"Allow from all",则容许全部主机访问,按照下述Deny和Order指令的配置;若要只容许特定的主机或主机群访问服务器,host能够用下面任何一种格式来指定:一个(部分)域名、完整的IP地址、部分IP地址、网络/掩码、网络/nnn无类别域间路由规格;第三种参数格式容许对服务器的访问由环境变量的一个扩展指定,指定"Allow from env=env-variable"时,若是环境变量env-variable存在则访问被容许,使用由mod_setenvif提供的指令,服务器用一种基于客户端请求的弹性方式提供了设置环境变量的能力。所以,这条指令能够用于容许基于像User-Agent(浏览器类型)、Referer或其余 HTTP请求头字段的访问。
Deny:控制哪些主机被禁止访问服务器的该区域。能够根据主机名、IP地址、 IP地址范围或其余环境变量中捕获的客户端请求特性进行控制。
语法:Deny from all|host|env=env-variable [host|env=env-variable] ...
此指令的参数设置和Allow指令彻底相同。
DirectoryIndex:当客户端请求一个目录时寻找的资源列表。
语法:DirectoryIndex Local-url [Local-url] ...
Local-url(%已解码的)是一个相对于被请求目录的文档的URL(一般是那个目录中的一个文件)。能够指定多个URL,服务器将返回最早找到的那一个,好比:
DirectoryIndex index.html index.php
指定网站文件存放的目录路径,一般配置在主配置文件中,或虚拟主机文件中。
语法:DocumentRoot directory-path
在没有使用相似Alias这样的指令的状况下,服务器会将请求中的URL附加到DocumentRoot后面以构成指向文档的路径。
若是directory-path不是绝对路径,则被假定为是相对于ServerRoot的路径。
指定DocumentRoot时不该包括最后的"/"。