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 虚拟主机
了解http服务的配置文件是学好http服务的基础,下面我们就一起来看一下http服务的配置文件有哪些功能
在启动http服务时,总会有一些错误,如图:
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
在httpd服务的配置文件当中,监听的端口默认为80端口,你也可以人为的修改端口,比如修改成9527端口
重新加载httpd服务service httpd reload,再查看一下端口号ss -ntl
没有80端口,此时监听http服务的是9527端口,此时你在访问时就要指定端口号了,不然会访问失败
当然你也可以将改端口号绑定在指定的本机IP地址上,不指定就默认绑定在本机的所有IP地址上,如图:将80端口绑定在本机的192.168.10.135上,将9527端口绑定在172.17.0.182上
这样别人访问时就必须指定端口号了,因为192.168.10.135绑定在80端口上,不指定就默认为80端口,所以能访问成功,而172.17.0.182绑定在9527端口上,这时你不指定就不能访问了
4.持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应
如果不配置http服务配置文件的话,默认只能访问一个资源,就断开连接
在http服务配置文件将KeepAlive off改为KeepAlive on
5、MPM(Multi-Processing Module)多路处理模块
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持
默认为/usr/sbin/httpd, 即prefork模式
/usr/lib64/httpd/modules/动态模块路径
StartServers 8 开启的服务器(表现为开启了http服务,运行了8个httpd主程序)
MaxRequestsPerChild 4000 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
将来开启了http服务就会运行4个httpd.worker程序,每个主程序包含25个线程,所以总共有100个线程,但是支持最多的空闲线程只有75个,所以要杀死一个httpd.worker程序,所以当你开启了http服务,就只有3个httpd.worker程序运行
ab -c 100 -n 1000 http://192.168.10.135/a.jpg总共1000个请求访问a.jpg,并发同时能够访问100个,注意:访问的页面尽量大一些,不然无法测试性能
经过几次测试,prefork每秒能够处理的次数大约为520次
经过几次测试,worker每秒能够处理的请求次数大约为512次
6、DSO:Dynamic Shared Object(动态共享对象)
LoadModule<mod_name> <mod_path>
http服务要实现一个功能,要看他的模块是否加载,在http服务的配置文件中,如果你把某个模块给注释掉,然后再重启http服务,那么http服务就没有了这个模块所对应的功能,例如:我将modules/mod_auth_basic.so这个模块给注释掉,如图:
重启服务,再查看所有的动态和静态模块就查不到了,http服务就没有这个basic验证的功能了
7、定义'Main' server的文档页面路径
http://HOST:PORT/test/index.html
默认是/var/www/html,如图我将默认的路径给注释掉,更改为/app/data
然后再/app/data目录下建一个index.html,再在里面写点东西
在重启服务,再来访问,访问的页面就是在/app/data下编辑的index.html的内容,不是/var/www/index.html的内容了
8、定义站点主页面
DirectoryIndex index.html index.html.var
访问站点的主页面先找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,再次去访问,竟然显示站点的文件列表,这样是很危险的
所以应该在http服务器的根目录下面以及其下面的子目录都建一个index.html或者index.html.tar文件,以防止这种现象出现
9.站点访问控制常见机制
<FilesMatch "\.(gif|jpe?g|png)$">正则表达式
<Files "?at.*"> 通配符,?是任意的一个字符,.就是点,*是任意字符串
<LocationMatch "/(extra|special)/data"> URL
10、<Directory>中"基于源地址"实现访问控制
(1) Options:后跟1个或多个以空白字符分隔的选项列表
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
FollowSymLinks:允许访问符号链接文件所指向的源文件
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的情况下)
现在我想要拒绝能够访问软链接和拒绝显示子目录下的索引,如图,也可以写成options none,不加-允许
重启服务,这样别人就不能访问你的软链接和子目录的索引了,而且根目录的子目录会继承父目录的配置,所以别人也不能访问子目录里的软链接和子目录下的子目录索引
bbs是根目录下的子目录,bbs目录中没有index/html和index.html.tar,也不能访问目录的索引
bbs1是bbs的子目录,并且里面没有index.html或者index.html.tar,也不能访问bbs1的索引
也可以单独对根目录下的子目录进行配置,让其不继承对根目录的配置
与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令
AllowOverride None:.htaccess 文件无效
AllowOverride AuthConfig Indexes除了AuthConfig 和Indexes的其它指令都无法覆盖
注意:.htaccess这个文件必须在你所做了访问控制的目录里创建,如图:我对/app/data做了访问控制,所以要在/app/data下创建.htaccess覆盖之前的访问控制指令
vim /app/data/.htaccess在这个文件里设置配置指令来覆盖之前的配置指令,如图:拒绝了访问子目录的索引和访问软链接
(3)order和allow、deny(HTTP2.4版本已经取消,使用别的方法代替)
vim /etc/htpd/conf.d/test.conf
允许和拒绝的毫无关系,所以order后面的allow和deny次序无所谓,允许192.168.10.188访问,拒绝192.168.10.200访问
允许的包括拒绝的,因为order后面deny在最后,所以拒绝的生效,允许192.168.10.0/24这个网段里的所有IP地址访问,但除了192.168.10.200
允许的包括拒绝的,因为order后面allow放在最后,所以允许的生效,允许192.168.10.0/24这个网段里的所有IP地址访问
11.日志设定
debug, info, notice, warn,error
定义日志格式:LogFormatformat strings
LogFormat"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
参考帮助:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%l 远程用户,启用mod_ident才有效,通常为减号"-"
%u 验证(basic,digest)远程用户,非登录访问时,为一个减号"-"
•%r First line of request,即表示请求报文的首行;记录了此次请求的"方法","URL"以及协议版本
•%b 响应报文的大小,单位是字节;不包括响应报文http首部
•%{Referer}i 请求报文中首部"referer"的值;即从哪个页面中的超链接跳转至当前页面的
•%{User-Agent}i 请求报文中首部"User-Agent"的值;即发出请求的应用程序
12、设定默认字符集
设置指定的字符集(默认是UTF-8),修改http服务的配置文件
12、定义路径别名
http://www.magedu.com/download/bash.rpm
==>/www/htdocs/download/bash.rpm
http://www.magedu.com/download/bash.rpm
http://www.magedu.com/images/logo.png
==>/www/htdocs/images/logo.png
定义路径别名:假如我访问根目录下的bbs就给你跳转到/app/bbsdir下的主页面
1.在/app下建一个目录bbsdir,在这个目录下创一个主页面文件index.html
echo /app/bbdir > /app/bbsdir/index.html
vim /etc/httpd/conf.d/test.conf
alias /bbs /app/bbsdir (注意这里的/bbs是相对路径,相对于/var/www/html)
3.访问根目录下的bbs,如图:确实跳转到了/app/bbsdir目录下的主页面
14、基于用户的访问控制
认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ...
htpasswd[options] /PATH/HTTPD_PASSWD_FILE username
-c:自动创建文件,仅应该在文件不存在时使用(注意创建第一个用户需要指定-c,创建第二个用户是就不要指定-c了,这样会覆盖创建的第一个用户)
AuthUserFile"/PATH/HTTPD_USER_PASSWD_FILE"
AuthGroupFile"/PATH/HTTPD_GROUP_FILE"
Require group grpname1 grpname2 ...
(2) 创建用户账号和组账号文件;(创建组账号文件不用命令创建,直接用vim,在写入每行的组用户)
GRP_NAME: username1 username2 ...
(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不能够访问
(1)在http服务的子配置文件里对根目录下的bbs目录进行访问控制,如下图:访问bbs目录需要进行basic验证,定义一个用户目录,定义一个组用户目录,允许组group1里的用户访问bbs目录
(4)测试,访问web服务器根目录下的bbs目录,根据在子配置文件做的访问控制,允许组group1里的用户访问,group1里的用户有http1和http2,所以http1和http2能够访问bbs目录下的主页面,http3不能访问,先测试http1,如图:成功访问,http1测试成功了,http2就不用测试了,直接测试http3
如图:在http服务的子配置文件中,对根目录下的bbs目录做了访问控制,对客户机ip和用户进行验证,并且都需要通过才行
15、虚拟主机(在一个虚拟主机上可以建立多个站点)
注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机
3.在http服务的子配置文件配置虚拟主机(配置虚拟主机可以参照http服务的主配置文件)
cat /etc/httpd/conf/httpd.conf 参照格式在最后面
5.在客户端,配置dns域名解析,就可以使用域名来访问站点了
配置一个虚拟主机就要消耗一个IP地址,如果基于IP地址来配置虚拟主机就太浪费IP地址了,而基于端口来配置虚拟主机,只需要消耗一个IP地址,将一个IP地址绑定在多个端口上面,这样来配置多台虚拟主机。
2.在http服务的子配置文件里配置多台虚拟主机,如图:*代表本机的IP地址,本机的IP地址绑定不同的端口
3.重新加载http服务,通过访问不同的端口就可以访问不同的站点
4.在客户端,配置dns域名解析,就可以使用域名在加上端口来访问站点了
现在我们在访问一个站点都是通过访问域名来访问的,所以前两种方法来配置虚拟主机很少用,通常使用基于域名的方式来配置虚拟主机
如果在在请求报文的首部加上你要访问的站点,web服务器服务器通过分析你的请求报文首部来返回给你结果
vim /etc/httpd/con.d/test.conf
6.在http服务的子配置文件中,哪个站点排在第一个谁就是默认站点
16、status页面(可以了解当前web服务器的工作的情况)
LoadModule status_module modules/mod_status.so
了解web服务器的工作情况,先查看status_mdule模块是否启动,再修改http服务的主配置文件
httpd -M|grep status 查看status_module模块是否启动,如果没有启动的话,要在http服务的主配置文件里添加该模块,如图:已经启动
vim /etc/httpd/conf/httpd.conf 修改http服务的主配置文件
重新加载一下http服务,然后再去访问,如图:就可以查看web服务器的工作情况
如果还想显示当前web服务器更加详细的工作情况,再修改一下http服务的主配置文件,如图:
重新加载一下http服务,再去查看一下当前web服务器的工作情况,就更加详细了,如图:
好了,今天的内容就到这里,下期再见。