文章目录
httpd的设置
http://httpd.apache.org/docs/2.4/ 官方帮助
1. httpd -t
用于 对配置文件进行语法检查
[root@node1 ~]# httpd -t
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:feb6:7c90. Set the 'ServerName' directive globally to suppress this message
Syntax OK
在 配置文件中加入 ServerName 可以解决无识别主机名的告警
ServerName node1
[root@node1 ~]# httpd -t
Syntax OK
2. server token
httpd 默认的 响应头会显示服务器的信息,不安全可以关闭。
Server: Apache/2.4.6 (CentOS)
conf 修改ServerTokens 即可
ServerTokens Prod
Server: Apache
3. listen
修改监听的IP和Port
Listen [IP:]PORT
(1) 省略IP表示为本机所有IP
(2) Listen指令至少一个,可重复出现多次
Listen 80
Listen 192.168.0.3:8080
oot@node1 ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 192.168.0.3:8080 *:*
LISTEN 0 128 :::80 :::*
4. 持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接
断开条件:时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应
折衷:使用较短的持久连接时间
设置:
KeepAlive On|Off (打开或关闭)
KeepAliveTimeout 15 (超时时长)
MaxKeepAliveRequests 80 #长连接最多接受多少个请求。请求数量大于改值则自动断开
默认值:
使用谷歌浏览器查看 Reponse Headers
Keep-Alive: timeout=5, max=100
修改之后
Keep-Alive: timeout=15, max=80
5、DSO: Dynamic Shared Object
加载动态模块配置,不需重启即生效
DSO配置文件的相对位置 Include conf.modules.d/*.conf
格式:
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)
动态模块路径: /usr/lib64/httpd/modules/
示例:
httpd –M 查看所有装载的模块
[root@node1 ~]# httpd -M |grep mod_auth_basic
[root@node1 ~]# vim /etc/httpd/conf.modules.d/00-base.conf
LoadModule auth_basic_module modules/mod_auth_basic.so (添加这一行)
修改之后发现已经加载
[root@node1 ~]# httpd -M |grep mod_auth_basic
[Thu Feb 20 19:55:46.175434 2020] [so:warn] [pid 7734] AH01574: module auth_basic_module is already loaded, skipping
[root@node1 ~]#
6. MPM( Multi-Processing Module)多路处理模块
切换使用的MPM
/etc/httpd/conf.modules.d/00-mpm.conf
启用要启用的MPM相关的LoadModule指令即可( 取消注释即可)
例子:
默认的prefork的模式,是一个父进程带多个子进程
[root@node1 ~]# pstree -p |grep httpd
|-httpd(7575)-+-httpd(7576)
| |-httpd(7577)
| |-httpd(7578)
| |-httpd(7579)
| |-httpd(7580)
| `-httpd(7581)
修改为event 之后
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so (当前使用的prework 注释了)
LoadModule mpm_event_module modules/mod_mpm_event.so (启用event)
重启httpd ,发现一个子进程带了多个子线程
[root@node1 ~]# pstree -p |grep httpd
|-httpd(7786)-+-httpd(7787)
| |-httpd(7788)-+-{httpd}(7820)
| | |-{httpd}(7821)
| | |-{httpd}(7822)
| | |-{httpd}(7823)
| | |-{httpd}(7824)
| | |-{httpd}(7825)
| | |-{httpd}(7826)
| | |-{httpd}(7827)
| | |-{httpd}(7828)
| | |-{httpd}(7829)
| | |-{httpd}(7830)
| | |-{httpd}(7831)
prefork的配置:
StartServers
8
MinSpareServers
5
MaxSpareServers
20
ServerLimit
256 最多进程数,最大值 20000
MaxClients 256 最大的并发连接数
MaxRequestsPerChild 4000 子进程最多能处理的请求数量。在处理
MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进
程占用的内存就会释放(为0时永远不释放)
MPM的具体设置
prefork的配置:
StartServers 8 (httpd 服务启动时,开启的子进程)
MinSpareServers 5 (最小空闲子进程数)
MaxSpareServers 20 (最大空闲子进程数)
ServerLimit 256 最多进程数,最大值 20000
MaxClients 256 最大的并发连接数
MaxRequestsPerChild 4000
子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
worker的配置:
ServerLimit 16 允许最大的子进程数
StartServers 2 启动时的进程数
MaxRequestWorkers 150 允许最大的并发请求数
MinSpareThreads 25 空闲时最小的子线程数
MaxSpareThreads 75 空闲时最大的子线程数
ThreadsPerChild 25 每个子线程最多处理的请求次数,超过重生
7.定义’Main’ server的文档页面路径
格式 DocumentRoot “/path”
文档路径映射:
例子
创建站点首页文件
[root@node1 ~]# mkdir /apps/data -p
[root@node1 ~]# echo "this is 103 main page" >/apps/data/ index.html
修改配置 记得同时要授权
DocumentRoot "/apps/data/"
<directory "/apps/data">
Require all granted
</directory>
测试
[root@node1 ~]# curl 192.168.0.3
this is 103 main page
8. 定义站点主页面
访问网址路径时,web 服务器默认的是把index.html 返回给用户。可以自定义
默认设置
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
修改后,首先找a.txt ,找不到就再找index.html
<IfModule dir_module>
DirectoryIndex a.txt index.html </IfModule>
测试
[root@node1 data]# ls
a.txt index.html
[root@node1 data]# curl 192.168.0.3
this is 103 main page
9 . 站点访问控制常见机制
访问控制机制:客户端来源地址,用户账号.特定的访问资源文件
9.1 <Directory>中“基于源地址”实现访问控制
-
Options:后跟1个或多个以空白字符分隔的选项列表
在选项前的+ -,表示增加或删除指定选项
常见选项:
-
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户(会显示请求路径下的子目录文件夹,用户可以点那个,访问哪个)
例子:
DocumentRoot "/apps/data/" <directory "/apps/data"> Require all granted options Indexes </directory>
当你访问不存在的资源时
但是可以看到上一级的目录
-
FollowSymLinks:允许访问符号链接文件所指向的源文件
例子:
没有设置之前 是默认可以访问软连接的
[root@node1 data]# ll -t lrwxrwxrwx 1 root root 11 Feb 20 22:47 xx -> /dd/123.txt [root@node1 ~]# curl 192.168.0.3/xx 233
设置之后
<directory "/apps/data"> Require all granted options -FollowSymLinks </directory>
root@node1 ~]# curl 192.168.0.3/xx <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access /xx on this server.</p> </body></html>
-
None:全部禁用
例子:
<directory "/apps/data"> Require all granted options none </directory>
[root@node1 ~]# curl 192.168.0.3/xx <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access /xx on this server.</p> </body></html>
-
All: 全部允许
-
9.1.5 AllowOverride
与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令只对语句有效
相关参数:
- All: .htaccess中所有指令都有效
- AllowOverride None: .htaccess 文件无效
- AllowOverride AuthConfig .htaccess 文件中,除了AuthConfig 其它指令都无法生效
作用:把写在dircotry中的设置放在一个单独的配置文件中
例子:
[root@node1 data]# ls -a
. .. asite bsite .htaccess index.html xx
[root@node1 data]# cat .htaccess
options Indexes FollowSymLinks
conf:
<directory "/apps/data">
Require all granted
AllowOverride All
</directory>
效果与它一样
<directory "/apps/data">
Require all granted
options Indexes FollowSymLinks
</directory
9.2 基于IP的访问控制:
授权的方式
- 无明确授权的目录,默认拒绝
- 允许所有主机访问:Require all granted
- 拒绝所有主机访问:Require all denied
- 控制特定的IP访问:Require ip
例子:
<directory "/data/html/"> <requireall>
require all granted
require not ip 192.168.37.6
</requireall>
</directory>
-
IPADDR:授权指定来源的IP访问
Require not ip -
IPADDR:拒绝特定的IP访问
控制特定的主机访问:
Require host HOSTNAME:授权特定主机访问
Require not host HOSTNAME:拒绝 特定主机访问HOSTNAME:
- FQDN:特定主机
- domin.tld:指定域名下的所有主机
匹配规则
-
不能有失败,至少有一个成功匹配才成功,即失败优先
<RequireAll> Require all granted Require not ip 172.16.1.1 拒绝特定IP </RequireAll>
-
多个语句有一个成功,则成功,即成功优先
<RequireAny> Require all denied require ip 172.16.1.1 允许特定IP </RequireAny>
9.3 文件系统路径:
- 指令提供了基于文件名的访问控制,类似于和指令。它将配对一个指令。在此配置段中定义的指令将作用于其基本名称(不是完整的路径)与指定的文件名相符的对象。段将根据它们在配置文件中出现的顺序被处理:在段和.htaccess文件被处理之后,但在段之前。请注意:能嵌入到段中以限制它们作用的文件系统范围
<Directory “/path">
...
</Directory>
<File “/path/file”>
...
</File>
<FileMatch "PATTERN">
...
</FileMatch>
例子: 拒绝所有 .ht * 文件的访问(这就.htaccess不能被访问的原因)
<Files ".ht*">
Require all denied
</Files>
9.4 URL路径:
-
提供了基于URL的访问控制。与指令类似,它也会启用一个以结尾的配置段。配置段的处理位于, .htaccess, 之后,并依照在配置文件中出现的顺序进行处理。
-
Location>配置段完全独立于文件系统之外操作。这有几个重要的后果。最重要的是<Location>不能用于针对文件系统的访问控制。因为可能会有几个不同的URL指向文件系统中的同一个文件,所以这样的控制常常会被很容易的绕过。
-
和指令相同,提供了基于URL的访问控制。但它使用正则表达式作为参数,而不是简单字符串。比如:
<Location "">
...
</Location>
<LocationMatch "">
...
</LocationMatch>
例子 访问不存在的资源跳转403页面
<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /.noindex.html
</LocationMatch>
Alias /.noindex.html /usr/share/httpd/noindex/index.html
9.5 基于的用户和组访问控制
见我下一篇
9.6 远程客户端和用户验证的控制 Satisfy
Satisfy ALL|Any
- ALL 客户机IP和用户验证都需要通过才可以
- Any客户机IP和用户验证,有一个满足即可
示例:
地址段为172.16.1.0/21 不可访问,不在male 用户组的不能访问。
这样写觉得配置太长了 ?当然也可以放在.htacees 文件中
<Directory “/data/html/rz2">
AuthType Basic
AuthName "String“
AuthUserFile "/etc/httpd/conf.d/.huser"
AuthGroupFile "/etc/httpd/conf.d/.hgroup"
Require group male
<RequireAll>
Require all granted
Require not ip 172.16.1.0/21
</RequireAll>
Satisfy Any
</Directory>