配置文件
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
启动文件:
/usr/lib/systemd/system/httpd.service
日志文件:
[root@localhost ~]# ls /var/log/httpd
access_log error_log
站点文档:
/var/www/html
模块文件:
/usr/lib64/httpd/modules
模块相关的配置文件:
/etc/httpd/conf.modules.d/
httpd.conf
[root@localhost ~]# grep -v "#" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd" # 主配置文件目录
Listen 80 #监听的端口
Include conf.modules.d/*.conf #包含模块文件的配置文件
User apache #默认运行程序的用户
Group apache #默认运行程序的组
ServerAdmin root@localhost #在httpd出现错误时,如何联系管理员,可以使用邮箱地址,也可以使用服务器地址,但是这个服务器应该指向你控制的下一台服务器
<Directory />
AllowOverride none
Require all denied
</Directory>
#Directroy 和 /Directory用于封装一组指令。这些指令仅用于命名的目录以及子目录中的所有文件。Directory后面可以跟完整的路径也可以使用使用通配符来表示,例如:[0-9]{3}、/*/public_html。 而且指令不能嵌套
DocumentRoot "/var/www/html" # 站点目录
<Directory "/var/www">
AllowOverride None
Require all granted
</Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
# httpd是模块管理的。通过将特定模块存在一个模块中,可以将配置伪指令包括在内<IfModule>。然而, <IfModule> 块不是必需的,并且在某些情况下可能掩盖了您缺少重要模块的事实。
<Files ".ht*">
Require all denied
</Files>
#防止用户查看.htaccess和.htpasswd的文件
ErrorLog "logs/error_log" #错误日志
LogLevel warn #日志级别
<IfModule log_config_module> # log模块
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>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</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>
AddDefaultCharset UTF-8 # 默认字符集
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on # sendfile机制
指令
以下所有得指令全部放在了/etc/httpd/conf.d/test.conf
中。没有放在httpd.conf中。
1、显示服务器版本信息
服务器若是显示程序版本,可能会导致系统的不安全。 我们可以屏蔽显示。
ServerTokens 该指令控制server的显示,总共有以下几个选项
ServerTokens Full 示例:Apache/2.4.2
ServerTokens Prod[uctOnly] 示例: Server: Apache
ServerTokens Major 示例:Server: Apache/2
ServerTokens Minor 示例:Server: Apache/2.4
ServerTokens Min[imal] 示例:Server: Apache/2.4.2
ServerTokens OS 示例:Server: Apache/2.4.2 (Unix)
设置要设置不能低于min的。 prod是最好的,只显示web服务程序。
[root@localhost ~]# cat /etc/httpd/conf.d/test.conf
ServerTokens Prod
2、持久连接
httpd在回应请求完之后不会立即关闭套接字。而是持续接收客户端发送来的请求。 默认是关闭持久连接的。
启用保持连接:KeepAlive ON
等待客户端持续请求的秒数:KeepAliveTimeout 10
打开时允许允许多少个请求进来:MaxKeepAliveRequests 500 ,0表示无限制,一般建议设大一点。
3、MPM处理模块
MPM提供来三种工作方式:worker、prefork、event
worker:httpd生成一个主进程,m个子进程。子进程在生成n个线程。一个线程接收一个请求。总共可以接收m*n个请求。
prefork:程序预先生成许多子进程等待用户发来的请求,这样做的好处是为了防止经常进行子进程的生成和销毁。每个子进程只有一个线程,一个线程接收一个请求。最大不能超过1024个。
event:事件驱动模型( worker模型的变种)一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求: m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时, 将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力。跟worker很类似,只不过有来专门的线程来管理keep-alive。
配置文件:/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
三种工作模式,使用哪一种就将哪一种的\#号注释掉. 默认prefork
默认配置
StartServers 8 #server预先生成几个进程。 worker和event默认是3个, prefork为5个
minspareservers 5 #最小空闲进程数,当空闲进程数小于设置的值后,那么系统将自动以1秒的速度按指数形式生成。直到生成32个子进程。 prefork默认为5。只有非常繁忙的站点才会调优此参数。将此数调大是一个很坏的注意
MaxSpareServers 10 #最大空闲进程数,如果空闲进程数量大于来设置的值,那么将主进程将停止多余的进程。同样参数不宜过大。 prefork默认是10
ServerLimit 256 #最多进程数,最大值为20000。 prefork默认256。worker和event默认是16个。
MaxClients 256 # 最大并发数
MaxRequestsPerChild 4000 #子进程最多能处理的连接请求。 一个子进程最多处理4000个请求之后会关闭,如果此时的进程数小于预设值,会重新开启一个。
4、定义’Main Server’的文档页面路径
DocumentRoot "/var/www/html"
5、定义站点主页面
DirectoryIndex index.html #表示输入网址可以直接跳到index.html。
6、站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制
访问控制机制有两种:客户端来源地址,用户账号
1、文件系统路径:
<Directory PATH>
</Directory>
<File FILENAME>
#对指定的文件进行权限设置
</File>
<FileMatch PATTERN>
</FileMatch>
2、URL路径
<Location "">
#针对某一站点进行权限设置
</Location>
<LocationMatch "">
</LocationMatch>
示例:
<Location "/">
Require all denied
</Location>
# 访问根下的站点时将会拒绝访问
7、<Directroy>中的访问机制
1)
Options:后跟1个或多个空白字符分隔的选项列表。在选项前的+、-表示增加或删除选项。总共有下面三种选项:
- Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源时,返回索引列表给用户
FollowSymLinks:允许访问符号链接文件所指向的源文件
[root@localhost html]# ll
lrwxrwxrwx 1 root root 14 3月 13 22:39 index.html -> test/link.html
#创建软连接后再次访问
None:全部禁用
All:全部允许
2)Allowoverride
与访问控制相关的哪些指令可以放在目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令。只对<Directory>有效
有三种形式:
- Allowoverride all :所有指令都生效
- Allowoverride none:忽略.htaccess文件
- AllowOverride AuthConfig Indexes: 除了AuthConfig和Indexes的其它指令都无法覆盖
主配置文件中是不建议这么做的,为了做实验而做的修改。接下来添加.htaccess文件
[root@localhost httpd]# vim /var/www/html/.htaccess
1 require all denied
在配置文件中指定.htaccess文件
[root@localhost httpd]# cat conf.d/test.conf
AccessFileName ".htaccess"
将.htacess文件中的denied改为granted
当然是不建议启用.htaccess文件的。这样一来,无论访问的网页是否用的上此文件,都会去目录里去找一遍。这样无疑是对性能产生一定的影响。所以使用none选项
3)访问控制
使用<RequireAll>来封装一组指令。至少有一个成功才能匹配,失败优先。
使用<RequireAny>来封装一组指令。多个语句有一个成功就能匹配,即成功优先。
可以作用在<Directory>中或者.htaccess中
- 允许所有主机访问:Require all granted
- 拒绝所有主机访问:Require all denied
- 允许指定源ip访问:Require ip IP-ADDR
- 拒绝特定ip访问: Require not ip IP-ADDR
- 允许特定主机访问:Require host HOSTNAME
- 拒绝特定主机访问:Require not host HOSTNAME
[root@localhost httpd]# cat conf.d/test.conf
<Directory "/var/www/html">
<RequireAll>
Require all granted
Require not ip 192.168.199.215
</RequireAll>
</Directory>
[root@localhost httpd]# cat conf.d/test.conf
<Directory "/var/www/html">
<RequireAny>
Require all denied
Require ip 192.168.199.215
</RequireAny>
</Directory>
8、设定字符集
默认是UTF-8。
9、定义路径别名
格式: Alias /URL/ "/PATH/"
[root@localhost httpd]# cat conf.d/test.conf
alias "/index.html" "/data/html/index.html"
<Directory /data/html/>
Require all granted
</Directory>
[root@localhost httpd]# cat /data/html/index.html
alias page
10、基于用户的访问控制
认证质询:响应码为410,拒绝客户请求,并说明要求客户端提供账号和密码
认证:客户填入账号和密码发送请求报文,认证通过时,服务器就会发送响应的资源
认证方式:
- basic:明文
- digest:消息摘要认证,兼容性差
安全域:需要用户认证后能访问的路径,应该通过名称对其进行标识,以便于告知用户认证的原因
使用htpasswd生成存放账号和密码的文件
示例:
1)使用htpasswd来生成账户和密码
[root@localhost httpd]# htpasswd -c conf.d/.htpasswd htuser
New password:
Re-type new password:
Adding password for user htuser
[root@localhost httpd]# cat conf.d/.htpasswd
htuser:$apr1$fhgaKKey$GKqB/Xj23gVsOzlHtouT4/
2)准备配置文件
<Directory /var/www/html>
Authtype Basic
Authname "pleases input user and password"
Authuserfile "/etc/httpd/conf.d/.htpasswd"
Options none
Allowoverride none
Require user htuser # 允许文件中的用户访问,允许所有用户require valid-user
</Directory>
3)访问测试
4)输入账号密码
基于组的访问控制
1)创建配置文件
<Directory /var/www/html>
AuthType Basic
AuthName "pleases input user and password"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Options none
Allowoverride none
Require group ht1
</Directory>
2)使用htpasswd添加用户
[root@localhost httpd]# htpasswd conf.d/.htpasswd htuser2
New password:
Re-type new password:
Adding password for user htuser2
3)创建组访问文件
[root@localhost httpd]# cat conf.d/.htgroup
ht1:htuser
ht2:htuser2
4)测试访问
5)使用ht2组内的用户访问
无法访问,会一致提示输入账号密码
12、实现用户家目录共享
用户家目录依靠mod_userdir.so实现。安装之后配置文件在conf.d/userdir.conf中。
修改配置文件
[root@localhost httpd]# grep -v '#' conf.d/userdir.conf
<IfModule mod_userdir.c>
#UserDir disabled 注销此项
UserDir public_html #启用这项
</IfModule>
<Directory "/home/*/public_html">
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>
在用户家目录创建public_html
[root@localhost httpd]# mkdir /home/ydong/public_html
创建默认网页index.html
[root@localhost httpd]# echo 'ydong page'>/home/ydong/public_html/index.html
为apache用户提供该目录的执行权限
[root@localhost httpd]# setfacl -m u:apache:x ~ydong /home/ydong/public_html/
测试访问
13、status页面
status_modlues提供status的页面,允许服务器查看当前页面的一个状态。2.4默认情况下只要加载了status模块就已经将指令ExtendedStatus on
了。所以可以直接定义location进行访问
<location "/server-status">
SetHandler server-status
require all granted
</location>