Httpd 2.2常见配置 要配置http服务的配置文件,先备份一下,养成良好习惯,如果误操作导致http服务起不来,就可以将备份的主配置文件重新覆盖一下 httpd配置文件的组成:有三大部分组成,其实配置文件里面的内容放的顺序没有规定,之所以把它划分为三部分是为了查看更加清晰 ...
Httpd 2.2常见配置
要配置http服务的配置文件,先备份一下,养成良好习惯,如果误操作导致http服务起不来,就可以将备份的主配置文件重新覆盖一下
httpd配置文件的组成:有三大部分组成,其实配置文件里面的内容放的顺序没有规定,之所以把它划分为三部分是为了查看更加清晰
# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment 全局配置
### Section 2: 'Main' server configuration 主服务器配置
### Section 3: Virtual Hosts 虚拟主机
配置格式:directive value
directive: 不区分字符大小写
value: 为路径时,是否区分大小写,取决于文件系统
了解http服务的配置文件是学好http服务的基础,下面我们就一起来看一下http服务的配置文件有哪些功能
解决启动httpd服务时报错的问题
在启动http服务时,总会有一些错误,如图:
修改httpd服务的配置文件
vim /etc/httpd/conf/httpd.conf,进入到配置文件之后搜索ServerName,然后按照格式随便添加一个域名就行了
然后再重启服务,这样就没有报错了
2、显示服务器版本信息
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
This setting applies to the entire server and cannot be enabled or disabled on a virtualhost-by-virtualhostbasis.
After version 2.0.44, this directive also controls the information presented by the ServerSignaturedirective.
建议使用:ServerTokens Prod,这时因为别人可以通过远程来查看你的服务器版本信息,知道了你的服务器版本信息,就可以针对你的服务器版本来攻击你,使用了Prod,就会隐藏你的服务器版本信息
curl -I 192.168.10.135 可以显示服务器版本信息
修改版本信息(修改配置文件)
vim /etc/httpd/conf/httpd.conf,进入到配置文件后,搜索ServerTokens,如图:
改完之后,在重新加载配置文件,service httpd reload,再次查看服务器版本信息
服务器版本隐藏
3.修改监听的IP和Port
Listen [IP:]PORT
(1) 省略IP表示为本机所有IP
(2) Listen指令至少一个,可重复出现多次
Listen 80
Listen 8080
在httpd服务的配置文件当中,监听的端口默认为80端口,你也可以人为的修改端口,比如修改成9527端口
重新加载httpd服务service httpd reload,再查看一下端口号ss -ntl
没有80端口,此时监听http服务的是9527端口,此时你在访问时就要指定端口号了,不然会访问失败
当然你也可以将改端口号绑定在指定的本机IP地址上,不指定就默认绑定在本机的所有IP地址上,如图:将80端口绑定在本机的192.168.10.135上,将9527端口绑定在172.17.0.182上
然后再重新加载httpd服务,查看端口号
这样别人访问时就必须指定端口号了,因为192.168.10.135绑定在80端口上,不指定就默认为80端口,所以能访问成功,而172.17.0.182绑定在9527端口上,这时你不指定就不能访问了
示例:
Listen 192.168.1.100:8080
Listen 80
查看服务对应的端口
4.持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接
断开条件:数量限制:100
时间限制:以秒为单位,httpd-2.4 支持毫秒级
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应
折衷:使用较短的持久连接时间
设置:KeepAlive On|Off
KeepAlive Timeout15
MaxKeepAlive Requests100
测试:telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
如果不配置http服务配置文件的话,默认只能访问一个资源,就断开连接
在http服务配置文件将KeepAlive off改为KeepAlive on
再去访问资源时就能够连续访问多个资源,而不断开连接
5、MPM(Multi-Processing Module)多路处理模块
prefork, worker, event(试验阶段)
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持
确认方法:
psaux | grep httpd
默认为/usr/sbin/httpd, 即prefork模式
查看静态编译的模块
httpd -l或httpd.worker -l
查看静态编译及动态装载的模块
httpd –M或httpd.worker -M
动态模块路径
/usr/lib64/httpd/modules/动态模块路径
更换使用的httpd程序:
vim /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker
重启服务生效
pstree -p|grep httpd查看进程和线程
prefork的默认配置:
<IfModule prefork.c>
StartServers 8 开启的服务器(表现为开启了http服务,运行了8个httpd主程序)
MinSpareServers 5 最小空闲服务器
MaxSpareServers 20 最大空闲服务器
ServerLimit 256 最多进程数,最大20000
MaxClients 256 最大并发
MaxRequestsPerChild 4000 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
</IfModule>
worker的默认配置:
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0 无限制
</IfModule>
将来开启了http服务就会运行4个httpd.worker程序,每个主程序包含25个线程,所以总共有100个线程,但是支持最多的空闲线程只有75个,所以要杀死一个httpd.worker程序,所以当你开启了http服务,就只有3个httpd.worker程序运行
测试性能
ab -c 100 -n 1000 >总共1000个请求访问a.jpg,并发同时能够访问100个,注意:访问的页面尽量大一些,不然无法测试性能
ll /var/www/html
1.测prefork,将主程序改为httpd
经过几次测试,prefork每秒能够处理的次数大约为520次
2.测试worker,将主程序改为httpd.worker
经过几次测试,worker每秒能够处理的请求次数大约为512次
由此可以看出prefork和work的性能差不多
6、DSO:Dynamic Shared Object(动态共享对象)
加载动态模块配置
/etc/httpd/conf/httpd.conf
配置指定实现模块加载格式:
LoadModule<mod_name> <mod_path>
模块文件路径可使用相对路径:
相对于ServerRoot(默认/etc/httpd)
示例:
LoadModuleauth_basic_module
modules/mod_auth_basic.so
http服务要实现一个功能,要看他的模块是否加载,在http服务的配置文件中,如果你把某个模块给注释掉,然后再重启http服务,那么http服务就没有了这个模块所对应的功能,例如:我将modules/mod_auth_basic.so这个模块给注释掉,如图:
重启服务,再查看所有的动态和静态模块就查不到了,http服务就没有这个basic验证的功能了
7、定义'Main' server的文档页面路径
DocumentRoot"/path"
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
示例:
DocumentRoot"/app/data"
--> /app/data/test/index.html
注意:SELinux和iptables的状态
更改'Main' server的文档页面路径
默认是/var/www/html,如图我将默认的路径给注释掉,更改为/app/data
然后再/app/data目录下建一个index.html,再在里面写点东西
vim /app/data/index.html
在重启服务,再来访问,访问的页面就是在/app/data下编辑的index.html的内容,不是/var/www/index.html的内容了
8、定义站点主页面
DirectoryIndex index.html index.html.var
在http服务的配置文件中,定义了站点的主页面
访问站点的主页面先找index.html,再找index.html.var如果都找不到,就会访问一个错误页面
为什么会返回一个错的页面呢,这是因为在另外一个配置文件/etc/httpd/conf.d/welcome.conf做了配置
vim /etc/httpd/conf.d/welcome.conf
我在根目录下面建一个子目录bbs,里面创建一个index.html文件,并写上内容
接下来我访问这个页面,能访问
如果把bbs里面的index.html文件改个名a.html,再次去访问,竟然显示站点的文件列表,这样是很危险的
再点一下a.html才能访问
所以应该在http服务器的根目录下面以及其下面的子目录都建一个index.html或者index.html.tar文件,以防止这种现象出现
9.站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制
访问控制机制有两种:
1.客户端来源地址
2.用户账号
文件系统路径:
<Directory "/path">目录
...
</Directory>
<File "/path/file">具体的文件路径
...
</File>
<FileMatch"PATTERN">正则表达式来匹配
...
</FileMatch>
URL路径:
<Location "">
...
</Location>
<LocationMatch"">
...
</LocationMatch>
示例:
<FilesMatch "\.(gif|jpe?g|png)$">正则表达式
<Files "?at.*"> 通配符,?是任意的一个字符,.就是点,*是任意字符串
<Location /status> URL
<LocationMatch "/(extra|special)/data"> URL
10、<Directory>中"基于源地址"实现访问控制
(1) Options:后跟1个或多个以空白字符分隔的选项列表
在选项前的+,-表示增加或删除指定选项
常见选项:
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
FollowSymLinks:允许访问符号链接文件所指向的源文件
None:全部禁用
All:全部允许
1.更改根目录的权限,对某个用户设置acl权限,或者设置根目录下文件的权限来实现访问控制
注意:设置acl权限是对apache用户设置,因为访问资源是通过apache用户来访问的
2.也可以在主配置文件里配置,也可以在子配置文件中配置,为了方便管理,在子配置文件中配置/etc/httpd/conf.d/*.conf
在/etc/httpd/conf.d/目录下随便创建一个以conf为结尾的配置文件,这就是http服务的子配置文件,假如说创建一个test.conf文件
vim /etc/httpd/conf.d/test.conf
如果什么都不加,就默认能够访问软链接,和不能子目录下的索引,也就是子目录的文件列表(在子目录下没有index.html或者index.html.tar的情况下)
将根目录改为/app/data
单独对根目录进行配置,其子目录也会继承根目录的配置
现在我想要拒绝能够访问软链接和拒绝显示子目录下的索引,如图,也可以写成options none,不加-允许
重启服务,这样别人就不能访问你的软链接和子目录的索引了,而且根目录的子目录会继承父目录的配置,所以别人也不能访问子目录里的软链接和子目录下的子目录索引
f1是fstab的软链接,不能访问软链接
bbs是根目录下的子目录,bbs目录中没有index/html和index.html.tar,也不能访问目录的索引
f2是根目录的子目录下的软链接,也不能访问
bbs1是bbs的子目录,并且里面没有index.html或者index.html.tar,也不能访问bbs1的索引
也可以单独对根目录下的子目录进行配置,让其不继承对根目录的配置
f2是bbs目录下的软链接,又能访问了
bbs1是bbs的子目录,又能访问其索引了
(2) AllowOverride
与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令
只对<directory>语句有效
AllowOverride All: 所有指令都有效
AllowOverride None:.htaccess 文件无效
AllowOverride AuthConfig Indexes除了AuthConfig 和Indexes的其它指令都无法覆盖
注意:.htaccess这个文件必须在你所做了访问控制的目录里创建,如图:我对/app/data做了访问控制,所以要在/app/data下创建.htaccess覆盖之前的访问控制指令
vim /app/data/.htaccess在这个文件里设置配置指令来覆盖之前的配置指令,如图:拒绝了访问子目录的索引和访问软链接
如图:不能访问子目录的索引
如图:也不能访问软链接
(3)order和allow、deny(HTTP2.4版本已经取消,使用别的方法代替)
放在directory, .htaccess中
order:定义生效次序;写在后面的表示默认法则
Order allow,deny
Order deny,allow
Allow from, Deny from
来源地址:
IP
网络:172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
还在http服务的子配置文件来配置
vim /etc/htpd/conf.d/test.conf
<directory /app/data>
配置指令
</directory>
配置指令如下:
示例1:
order allow deny
allow from 192.168.10.188
deny from 192.168.10.200
允许和拒绝的毫无关系,所以order后面的allow和deny次序无所谓,允许192.168.10.188访问,拒绝192.168.10.200访问
示例2:
order allow deny
allow from 192.168.10.0/14
deny from 192.168.10.200
允许的包括拒绝的,因为order后面deny在最后,所以拒绝的生效,允许192.168.10.0/24这个网段里的所有IP地址访问,但除了192.168.10.200
示例3
order deny allow
allow from 192.168.10.0/14
deny from 192.168.10.200
允许的包括拒绝的,因为order后面allow放在最后,所以允许的生效,允许192.168.10.0/24这个网段里的所有IP地址访问
11.日志设定
日志类型:
访问日志
错误日志
错误日志:
ErrorLoglogs/error_log
LogLevelwarn
loglevel可选值:
debug, info, notice, warn,error
crit, alert, emerg
访问日志:
定义日志格式:LogFormatformat strings
LogFormat"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
自定义日志格式:
CustomLog logs/access_log combined
如图:将原本的日志格式注释掉,添加自定义的日志格式
然后再来访问一下,查看日志
参考帮助:
%h 客户端IP地址
%l 远程用户,启用mod_ident才有效,通常为减号"-"
%u 验证(basic,digest)远程用户,非登录访问时,为一个减号"-"
•%t 服务器收到请求时的时间
•%r First line of request,即表示请求报文的首行;记录了此次请求的"方法","URL"以及协议版本
•%>s 响应状态码
•%b 响应报文的大小,单位是字节;不包括响应报文http首部
•%{Referer}i 请求报文中首部"referer"的值;即从哪个页面中的超链接跳转至当前页面的
•%{User-Agent}i 请求报文中首部"User-Agent"的值;即发出请求的应用程序
12、设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
设置指定的字符集(默认是UTF-8),修改http服务的配置文件
查看指定的字符集
12、定义路径别名
格式:Alias /URL/ "/PATH/"
DocumentRoot"/www/htdocs"
==>/www/htdocs/download/bash.rpm
Alias /download/ "/rpms/pub/"
==>/rpms/pub/bash.rpm
==>/www/htdocs/images/logo.png
定义路径别名:假如我访问根目录下的bbs就给你跳转到/app/bbsdir下的主页面
1.在/app下建一个目录bbsdir,在这个目录下创一个主页面文件index.html
mkdir /app/bbsdir
echo /app/bbdir > /app/bbsdir/index.html
2。改http服务的配置文件,我们还是改子配置文件
vim /etc/httpd/conf.d/test.conf
alias /bbs /app/bbsdir (注意这里的/bbs是相对路径,相对于/var/www/html)
然后重新加载服务service httpd reload
3.访问根目录下的bbs,如图:确实跳转到了/app/bbsdir目录下的主页面
14、基于用户的访问控制
认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
认证方式两种:
basic:明文
digest:消息摘要认证,兼容性差
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因
用户的账号和密码:
虚拟账号:仅用于访问某服务时用到的认证标识
存储:文本文件,SQL数据库,ldap目录存储,nis等
basic认证配置示例:
(1) 定义安全域
<Directory "/path">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
</Directory>
允许账号文件中的所有用户登录访问:
Require valid-user
(2)提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd[options] /PATH/HTTPD_PASSWD_FILE username
-c:自动创建文件,仅应该在文件不存在时使用(注意创建第一个用户需要指定-c,创建第二个用户是就不要指定-c了,这样会覆盖创建的第一个用户)
-m:md5格式加密,默认方式
-s: sha格式加密
-D:删除指定用户
基于组账号进行认证
(1) 定义安全域
<Directory "/path">
AuthTypeBasic
AuthName"String"
AuthUserFile"/PATH/HTTPD_USER_PASSWD_FILE"
AuthGroupFile"/PATH/HTTPD_GROUP_FILE"
Require group grpname1 grpname2 ...
</Directory>
(2) 创建用户账号和组账号文件;(创建组账号文件不用命令创建,直接用vim,在写入每行的组用户)
组文件:每一行定义一个组
GRP_NAME: username1 username2 ...
实验
1.基于用户账号进行认证
(1)在http服务的子配置文件进行配置,如下图:对根目录下的bbs进行访问控制(我在http服务的主配置文件中定义的根目录是/app/data),是基于basic验证的,用户账号目录是/etc.httpd/conf.d/.httpusers,允许用户http1和http2访问。
(2)创建账号和密码,如图:创建http1,http2和http3这3个用户
(3)然后再去访问web服务器根目录下的bbs目录,如图:这时访问web服务根目录下bbs目录,就不会直接打开bbs目录下的主页面了,需要输入用户和密码
根据我们在http服务的子配置文件的配置,用户http1和http2能够访问,http3不能够访问
先来验证用户http1,能够访问
再来测试用户http3,不能访问
2.基于组账号进行认证
(1)在http服务的子配置文件里对根目录下的bbs目录进行访问控制,如下图:访问bbs目录需要进行basic验证,定义一个用户目录,定义一个组用户目录,允许组group1里的用户访问bbs目录
(2)在定义的用户目录创建用户账号并指定密码
(3)在定义的组用户目录下设置每个组中的用户
(4)测试,访问web服务器根目录下的bbs目录,根据在子配置文件做的访问控制,允许组group1里的用户访问,group1里的用户有http1和http2,所以http1和http2能够访问bbs目录下的主页面,http3不能访问,先测试http1,如图:成功访问,http1测试成功了,http2就不用测试了,直接测试http3
测试http3,不能够访问
远程客户端和用户验证的控制
Satisfy ALL|Any
ALL 客户机IP和用户验证都需要通过才可以
Any客户机IP和用户验证,有一个满足即可
如图:在http服务的子配置文件中,对根目录下的bbs目录做了访问控制,对客户机ip和用户进行验证,并且都需要通过才行
每个组中的用户
加载http服务,然后测试,
15、虚拟主机(在一个虚拟主机上可以建立多个站点)
站点标识:socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同;
请求报文中首部
Host: www.magedu.com
有三种实现方案:
1.基于ip:为每个虚拟主机准备至少一个ip地址
2.基于port:为每个虚拟主机使用至少一个独立的port
3.基于FQDN:为每个虚拟主机使用至少一个FQDN
注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机
禁用方法:注释中心主机的DocumentRoot指令即可
虚拟主机的配置方法:
<VirtualHostIP:PORT>
ServerNameFQDN
DocumentRoot"/path"
</VirtualHost>
建议:上述配置存放在独立的配置文件中
其它可用指令:
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog:错误日志
CustomLog:访问日志
<Directory "/path">
</Directory>
Alias
(1)配置基于ip的虚拟主机
1.在你的一个网卡上添加3个地址
2.设置站点
在/app下建立3个目录,将来作为对应3个IP地址的站点
3.在http服务的子配置文件配置虚拟主机(配置虚拟主机可以参照http服务的主配置文件)
cat /etc/httpd/conf/httpd.conf 参照格式在最后面
参照上图的格式来配置虚拟主机
4.重新加载http服务,测试
5.在客户端,配置dns域名解析,就可以使用域名来访问站点了
编辑/etc/hosts文件,模拟dns解析
接着就可以用域名来访问站点了
(2)配置基于端口的虚拟主机
配置一个虚拟主机就要消耗一个IP地址,如果基于IP地址来配置虚拟主机就太浪费IP地址了,而基于端口来配置虚拟主机,只需要消耗一个IP地址,将一个IP地址绑定在多个端口上面,这样来配置多台虚拟主机。
1.1.设置站点,参考配置基于ip地址的虚拟主机的第二步
2.在http服务的子配置文件里配置多台虚拟主机,如图:*代表本机的IP地址,本机的IP地址绑定不同的端口
3.重新加载http服务,通过访问不同的端口就可以访问不同的站点
4.在客户端,配置dns域名解析,就可以使用域名在加上端口来访问站点了
编辑/etc/hosts文件,模拟dns解析
(3)配置基于FQDN的虚拟主机
现在我们在访问一个站点都是通过访问域名来访问的,所以前两种方法来配置虚拟主机很少用,通常使用基于域名的方式来配置虚拟主机
如果在在请求报文的首部加上你要访问的站点,web服务器服务器通过分析你的请求报文首部来返回给你结果
1.设置站点,参考配置基于ip地址的虚拟主机的第二步
2.在http服务的子配置文件来配置基于域名的虚拟主机
vim /etc/httpd/con.d/test.conf
3.在客户端配置dns域名解析,来访问站点
编辑/etc/hosts文件,模拟dns域名解析
4.通过域名来访问不同的站点
5.查看日志文件,看看是否生成
6.在http服务的子配置文件中,哪个站点排在第一个谁就是默认站点
16、status页面(可以了解当前web服务器的工作的情况)
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 172.16
</Location>
ExtendedStatus On 显示扩展信息
了解web服务器的工作情况,先查看status_mdule模块是否启动,再修改http服务的主配置文件
httpd -M|grep status 查看status_module模块是否启动,如果没有启动的话,要在http服务的主配置文件里添加该模块,如图:已经启动
vim /etc/httpd/conf/httpd.conf 修改http服务的主配置文件
重新加载一下http服务,然后再去访问,如图:就可以查看web服务器的工作情况
如果还想显示当前web服务器更加详细的工作情况,再修改一下http服务的主配置文件,如图:
重新加载一下http服务,再去查看一下当前web服务器的工作情况,就更加详细了,如图:
好了,今天的内容就到这里,下期再见。
原标题:Httpd2.2常见配置及功能
关键词:http
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。