个人博客地址:http://www.pojun.tech/ 欢迎访问
通常我们所说的,服务器应用一般会有两种类型,http服务器、应用程序服务器 ,而http服务器的典型代表有Apache Http Server和Nginx,应用程序服务器的典型代表则有IIS,Tomcat,jetty。
很多做过java开发的朋友应该都知道 Apache Tomcat,但是二者之间具体有什么区别和联系呢?大家可以自己上网查询下资料,也可以自己参考 https://www.zhihu.com/question/32212996,去了解一下。
当然,也可以去这个网站,查看目前主流服务器的市场占有率。https://www.netcraft.com/
目前,在计算机运维领域,有比较流行的几种架构,分别是LAMP和LNMP。这里LAMP中的A指的就是Apache Httpd Server 。
CentOS 6 系统中默认安装了Httpd2.2版本,而CentOS7 默认支持的则是Httpd 2.4 版本,二者在使用上有所不同。同时,如果想要在CentOS 6 上安装Httpd2.4 的话,也需要花费一些功夫。
本篇文章,我们一起来了解一下,Apache Httpd 2.2 的配置,其余的内容留作以后来介绍。
配置文件
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
检查修改后的配置文件中是否存在语法错误
httpd –t
service httpd configtest
httpd的服务脚本
/etc/rc.d/init.d/httpd
httpd的服务脚本的配置文件
/etc/sysconfig/httpd
服务控制和启动
chkconfig httpd on|off
service {start|stop|restart|status|configtest|reload} httpd
站点网页文档根目录
/var/www/html
模块文件路径
/etc/httpd/modules
/usr/lib64/httpd/modules
主程序文件
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event
主进程文件
/etc/httpd/run/httpd.pid
日志文件目录
/var/log/httpd
access_log: 访问日志
error_log:错误日志
帮助文档包
httpd-manual
httpd配置文件的组成
# 执行下面的这条命令就可以看到,配置文件一共由下面三部分组成。
[root@centos6 ~]$grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式
# 指令 值
directive value
directive: 指令,不区分字符大小写
value: 值为路径时,是否区分大小写,取决于文件系统
上面所述的所有的内容,都可以执行
rpm -ql httpd
中查看到。了解了上面的基本信息之后,我们来启动一下httpd 服务。
root@centos6 ~]$service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for centos6.pojun.tech
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
从上面的提示信息中我们可以看出,这里有两个小问题。下面我们解决一下,这两个小问题。从问题描述中我们可以看出,HTTPD 服务不能明确服务器主机的名字,最好使用127.0.0.1来指定一下。
我们修改一下/etc/httpd/conf/httpd.conf
文件。
这样的话,再重启的时候,就不会有问题提示了。
这里所说的配置信息都位于
/etc/httpd/conf/httpd.conf
显示服务器的版本信息的意思是说,我们在日常工作中,可能会通过一些手段,获取某些网段的服务器信息,如果我们的HTTP服务器的信息对于一个陌生的用户完全暴露,将会大大导致服务器的安全风险。
下图是我们通过工具获取到Microsoft的服务器信息(吐槽下,微软自己竟然还用别人的服务器,大家风范哪里去了(●’◡’●))。
下面是我本机的Http 2.2 服务器的信息
[root@centos6 ~]$curl -I 172.18.2.66
HTTP/1.1 200 OK
Date: Tue, 26 Sep 2017 09:22:39 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Mon, 25 Sep 2017 07:28:24 GMT
ETag: "320951-0-559fe80fa6ca6"
Accept-Ranges: bytes
Connection: close
Content-Type: text/html; charset=UTF-8
这里我们能够看到,不仅将服务器的版本暴露了出来,连操作系统的信息也显示了出来。下面我们介绍一下Httpd服务器显示信息的设置。
使用ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
配置。
# 只显示产品名称
ServerTokens Prod[uctOnly] :Server: Apache
# 显示大版本号
ServerTokens Major: Server: Apache/2
# 显示小版本号
ServerTokens Minor: Server: Apache/2.2
# 显示精确的版本号
ServerTokens Min[imal]: Server: Apache/2.2.15
# 显示系统
ServerTokens OS: Server: Apache/2.2.15 (CentOS)
#全部都显示
ServerTokens Full (or not specified): Server: Apache/2.0.41
(Unix) PHP/4.2.2 MyMod/1.2
通常来说,推荐使用 prod 方式,暴露的信息越少,相对的也就乐安全。
配置的格式为
Listen [IP:]PORT
- 省略IP表示为0.0.0.0;
- Listen指令至少一个,可重复出现多次
- 修改监听socket,重启服务进程方可生效
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接。
断开持久连接的条件:
- 数量限制:假设设定的100
- 时间限制:以秒为单位,HTTPD-2.4支持毫秒级。副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应
解决办法:使用较短的持久连接时间。
httpd 2.2 提供了三种不同类型的多路处理模块。prefork,worker,event(实验阶段)。
想要指定相应的处理模块,修改/etc/sysconfig/httpd
文件。
每一种多路处理模块都有相应的配置,打开
/etc/httpd/conf/httpd.conf
prefork模块的配置信息
其中参数的含义如下所示。
-StartServers
: 服务开始时的默认进程数
-MinSpareServers
: 进程数最少数量
-MaxSpareServers
: 最大的空闲进程数
-ServerLimit
: 最大的进程数,最大20000
-MaxClients
: 最大的并发数量
-MaxRequestsPerChild
: 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)worker模块的配置信息
其中参数的含义如下所示。
-StartServers
: 服务开始时的默认进程数
-MaxClients
: 最大的并发数量
-MinSpareThreads
: 最小的空闲线程数量,低于这个数量,系统就会立马开启新的进程
-MaxSpareThreads
: 最大的空闲线程数量,这个值可能会与StartServers
值冲突
-ThreadPerChild
: 每个进程支持的线程数量,因为这个值会导致StartServers
和MaxSpareThreads
值产生冲突。
-MaxRequestsPerChild
: 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
使用
httpd -M
命令可以查看目前已经加载的动态模块。
配置指定实现模块加载格式:
LoadModule
模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd
,在/etc/httpd/conf/httpd.conf
文件中已经指定ServerRoot)例如
auth_basic_module modules/mod_auth_basic.so
就是指定用户在访问服务器的时候需要提供身份验证的模块。
所谓默认主页的意思就是说,当我们只通过域名访问的时候,系统会默认跳转到某一页面,这个页面就是默认主页,所以这里可以设置默认主页的路径。
DocumentRoot指向的路径为URL路径的起始位置
站点主页面,也就是我们所说的默认首页啦。
可基于两种机制指明对哪些资源进行何种访问控制,访问控制机制有两种:客户端来源地址,用户账号
- 基于文件系统路径控制
<Directory “/path">
...
Directory>
<File “/path/file”>
...
File>
<FileMatch "PATTERN">
...
FileMatch>
- 基于URL路径控制
"">
...
"">
...
中“基于源地址”实现访问控制
- Options:后跟1个或多个以空白字符分隔的选项列表。在选项前的 +,- 表示增加或删除指定选项。
- Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
- FollowSymLinks:允许访问符号链接文件所指向的源文件
- None:全部禁用
- All: 全部允许
- AllowOverride:与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令,只对语句有效。
- AllowOverride All: 所有指令都有效
- AllowOverride None:.htaccess 文件无效 例如AllowOverride AuthConfig Indexes 除了AuthConfig和Indexes的其它指令都无法覆盖
- order和allow、deny:
- order:定义生效次序;写在后面的表示默认法则
Order allow,deny
Order deny,allow
Allow from, Deny from
下面是一些示例
Options Indexes 允许查看索引
Options FollowSymLinks 允许访问连接
order deny,allow
deny from 172.16. 100.100
allow from 172.16
order allow,deny
deny from 172.16.100.100
allow from 172.16
日志的类型有两种 访问日志,错误日志
loglevel 可选值:debug, info, notice, warn,errorcrit, alert, emerg
定义日志的格式
日志的使用
参考帮助:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#logformat
设定服务器默认的字符集,一般使用UTF-8,这是国际通用的字符集。
格式: Alias /URL/ “/PATH/”
设置了别名之后,当我们通过url进行访问的时候,服务器会自动的将资源路径指向别名所指的位置。
例如http://127.0.0.1/icons/
==>/var/www/icons/
认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的
资源认证方式两种:
- basic(明文)
- digest(消息摘要认证,兼容性差)安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因
用户的账号和密码:
- 虚拟账号:仅用于访问某服务时用到的认证标识
- 存储:文本文件,SQL数据库,ldap目录存储,nis等
1、定义安全域
新建一个 以.conf 结尾的配置文件放在/etc/httpd/conf.d/
目录下。
这个目录就是存放自定义配置文件的路径。/etc/httpd/
就是我们前面提到的ServerRoot
">
Options None
AllowOverride None
AuthType Basic # 验证的方式
AuthName "String" # 验证的提示信息
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE" #密码文件存放路径
Require user username1 username2 ... # 输入的用户名称
2、 提供账号和密码存储(文本文件),使用专用命令完成此类文件的创建及用户管理
# /PATH/HTTPD_PASSWD_FILE 这个路径在前面的配置中已经指定
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
-c:自动创建文件,仅应该在文件不存在时使用
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户
1、定义安全域
">
AuthType Basic
AuthName "String“
AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/HTTPD_GROUP_FILE"
Require group grpname1 grpname2 ...
2、 创建用户账号和组账号文件,组文件:每一行定义一个组
基于组的认证配置示例
<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmins
Directory>
vim /etc/httpd/conf.d/.htgroup
webadmins:hehe haha
基于IP的控制
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
基于端口的配置,可以针对一个主机监听不同的端口,不过一定要注意的就是,在配置文件之前一定要加上
listen 端口号
# 这两个listen如果不加上的话,基于端口的配置将不起作用,因为没有监听这两个端口啊。
listen 808
listen 8080
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
基于域名的虚拟主机。这里非常重要的一点就是,如果要使用这种方式,就必须要将
NameVirtualHost *:80
加上。入股不加的话,是没有什么效果的。
# 这句话一定要加上
NameVirtualHost *:80
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
总结一下虚拟主机的配置方法
虚拟主机的配置方法结构如下所示,建议将配置存放在独立的配置文件中
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot “/path"
其它可用指令:
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog: 错误日志
CustomLog:访问日志
<Directory "/path">
Directory>
Alias
statue 页面是编译在动态模块中,如果要使用这个功能,就要将这个动态模块加入到配置文件中。
# 如果下面这行被注释掉的了话,一定要去掉注释,
# 如果没有这个模块的话,就手动添加上
LoadModule status_module modules/mod_status.so
SetHandler server-status
Order allow,deny
Allow from 172.16
ExtendedStatus On 显示扩展信息
搭建成功的状态页面如下图所示
经过上面的几项配置,我们已经大体了解了Apache httpd 2.2 的基本设置,如果想要详细的配置的话可以参考Apache 的官方文档,http://httpd.apache.org/docs/2.2/ ,若有疑问,欢迎留言。