Apache Httpd 2.2 配置全解析(CentOS6)

个人博客地址:http://www.pojun.tech/ 欢迎访问

服务器应用

   通常我们所说的,服务器应用一般会有两种类型,http服务器应用程序服务器 ,而http服务器的典型代表有Apache Http ServerNginx应用程序服务器的典型代表则有IIS,Tomcatjetty
   很多做过java开发的朋友应该都知道 Apache Tomcat,但是二者之间具体有什么区别和联系呢?大家可以自己上网查询下资料,也可以自己参考 https://www.zhihu.com/question/32212996,去了解一下。
   当然,也可以去这个网站,查看目前主流服务器的市场占有率。https://www.netcraft.com/

Apache Httpd 2.2 配置全解析

  目前,在计算机运维领域,有比较流行的几种架构,分别是LAMP和LNMP。这里LAMP中的A指的就是Apache Httpd Server 。
  CentOS 6 系统中默认安装了Httpd2.2版本,而CentOS7 默认支持的则是Httpd 2.4 版本,二者在使用上有所不同。同时,如果想要在CentOS 6 上安装Httpd2.4 的话,也需要花费一些功夫。
   本篇文章,我们一起来了解一下,Apache Httpd 2.2 的配置,其余的内容留作以后来介绍。

CentOS 6 中 httpd的程序环境

配置文件

/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文件。

这样的话,再重启的时候,就不会有问题提示了。

httpd 2.2 的常见配置

这里所说的配置信息都位于/etc/httpd/conf/httpd.conf

1、显示服务器的版本信息

   显示服务器的版本信息的意思是说,我们在日常工作中,可能会通过一些手段,获取某些网段的服务器信息,如果我们的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 方式,暴露的信息越少,相对的也就乐安全。

2、修改监听的IP和PORT

配置的格式为 Listen [IP:]PORT

  • 省略IP表示为0.0.0.0;
  • Listen指令至少一个,可重复出现多次
  • 修改监听socket,重启服务进程方可生效

3、持久连接

   Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接。

断开持久连接的条件:
- 数量限制:假设设定的100
- 时间限制:以秒为单位,HTTPD-2.4支持毫秒级。

副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应
解决办法:使用较短的持久连接时间。

4、MPM( Multi-Processing Module)多路处理模块

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 : 每个进程支持的线程数量,因为这个值会导致StartServersMaxSpareThreads 值产生冲突。
- MaxRequestsPerChild : 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)

5、DSO: Dynamic Shared Object 动态模块配置

   使用 httpd -M命令可以查看目前已经加载的动态模块。

配置指定实现模块加载格式:LoadModule
模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd,在/etc/httpd/conf/httpd.conf 文件中已经指定ServerRoot)

例如 auth_basic_module modules/mod_auth_basic.so就是指定用户在访问服务器的时候需要提供身份验证的模块。

6、 定义’Main’ server的文档页面路径

所谓默认主页的意思就是说,当我们只通过域名访问的时候,系统会默认跳转到某一页面,这个页面就是默认主页,所以这里可以设置默认主页的路径。

DocumentRoot指向的路径为URL路径的起始位置

7、 定义站点主页面

站点主页面,也就是我们所说的默认首页啦。

8、站点访问控制常见机制

可基于两种机制指明对哪些资源进行何种访问控制,访问控制机制有两种:客户端来源地址,用户账号

  • 基于文件系统路径控制
<Directory “/path">
...
Directory>
<File “/path/file”>
...
File>
<FileMatch "PATTERN">
...
FileMatch>
  • 基于URL路径控制
"">
...

"">
...

9、 中“基于源地址”实现访问控制

  • 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

10、日志设定

日志的类型有两种 访问日志错误日志

错误日志

loglevel 可选值:debug, info, notice, warn,errorcrit, alert, emerg

访问日志

定义日志的格式

日志的使用

参考帮助:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#logformat

  • %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”的值;即发出请求的应用程序

11、设定默认字符集

设定服务器默认的字符集,一般使用UTF-8,这是国际通用的字符集。

12、定义路径别名

格式: Alias /URL/ “/PATH/”

设置了别名之后,当我们通过url进行访问的时候,服务器会自动的将资源路径指向别名所指的位置。
例如 http://127.0.0.1/icons/ ==> /var/www/icons/

13、基于用户的访问控制

认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的
资源认证方式两种:
- basic(明文)
- digest(消息摘要认证,兼容性差)

安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因

用户的账号和密码:
- 虚拟账号:仅用于访问某服务时用到的认证标识
- 存储:文本文件,SQL数据库,ldap目录存储,nis等

(一)基于basic认证配置示例

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

14、虚拟主机

(一) 基于ip:为每个虚拟主机准备至少一个ip地址

基于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"

(二) 基于port:为每个虚拟主机使用至少一个独立的port

基于端口的配置,可以针对一个主机监听不同的端口,不过一定要注意的就是,在配置文件之前一定要加上 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"

(三) 基于FQDN:为每个虚拟主机使用至少一个FQDN

基于域名的虚拟主机。这里非常重要的一点就是,如果要使用这种方式,就必须要将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

15、status页面

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/ ,若有疑问,欢迎留言。

你可能感兴趣的:(linux)