http服务详解(2)——httpd2.2的配置文件常见设置

 摘要:一个服务的配置文件非常重要,弄懂配置文件是熟练掌握服务的必要前提。

一、httpd-2.2常见文件介绍

(1)配置文件:

主配置文件尽量别改,改自己的子配置文件

  /etc/httpd/conf/httpd.conf 主配置文件

  /etc/httpd/conf.d/*.conf 自配置文件

检查配置语法:

  httpd -t 通用

  service httpd configtest centos7不支持

服务脚本:/etc/rc.d/init.d/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

主进程文件 :服务起来后会自动生成,可以查进程pid,最后不要手动加

  /etc/httpd/run/httpd.pid

日志文件目录:

  /var/log/httpd

    access_log: 访问日志

    error_log :错误日志

帮助文档包:httpd-manual ,按完包后,重启服务,就能看帮助文档,没网也可以看

 

(2)httpd 配置文件的组成:修改前先备份,养成好习惯

# grep "Section" /etc/httpd/conf/httpd.conf  人为的分成3大段,方便管理,可以随便放

### Section 1: Global Environment 全局环境配置

### Section 2: 'Main' server configuration 主服务器

### Section 3: Virtual Hosts 虚拟主机,全是注释,默认没有

 

配置格式:directive(指令) value(值)

  directive: 不区分字符大小写

  value: 为路径时,是否区分大小写,取决于文件系统

 

二、Httpd 2.2 常见配置:可以在官网或安装帮助包查看帮助

vim /etc/httpd/conf/httpd.conf 总配置文件

1、启动报错:提示没有名字fqdn

在总配置文件搜索 /ServerName,把注释去掉,随便写,最好写自己的网站名;启动就不报错了

修改后:

 

2、显示服务器版本信息

ServerTokens:管理响应首部信息的,显示服务器版本信息

搜索/ServerTokens,文件默认是OS,可以注释掉、删掉,有默认值full

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-virtualhost basis. After version 2.0.44, this directive also controls the information presented by the ServerSignature directive.

建议使用:ServerTokens Prod 安全,显示越详细越不安全

可以查看帮助信息,要安装httpd-manual包,帮助信息很详细

实例:cur -I 192.168.37.106 查询头部信息

另:可以在调度器上设置:直接隐藏版本信息或随意修改

 

3、修改监听的IP和Port

搜索/Listen,默认80

Listen [IP:]PORT,不要随意更改,可以用于只想让特定的ip访问,不让其他人访问

(1) 省略IP 表示为0.0.0.0; 端口绑定所有ip

(2) Listen 指令至少一个,可重复出现多次,写多个,不能为空或注释掉,注释掉服务起不来

  Listen 80

  Listen 8080 写多个就可开启多个端口,但是访问的还是同一个网站

注意:改了端口,要在访问时加上自己改的端口

(3) 修改监听socket,重启服务进程方可生效

 

3、持久连接

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

  断开条件:数量限制:100

    时间限制:以秒为单位, httpd-2.4 支持毫秒级

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

  折中:使用较短的持久连接时间

设置: KeepAlive On|Off

   KeepAliveTimeout 15

  MaxKeepAliveRequests 100

测试:telnet WEB_SERVER_IP PORT

  GET /URL HTTP/1.1    模仿报文首部

  Host: WEB_SERVER_IP

 

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

(1)MPM 工作模式介绍:prefork、worker、 event(试验阶段)

① prefork 多进程I/O 模型每个进程响应一个请求,默认模型

  一个主进程 :生成和回收n个子进程 , 创建套接字,不响应请求

  多个子进程:工作work 进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个

② worker :复用的多进程I/O 模型, 多进程多线程,IIS 使用此模型

  一个主进程: 生成m 个子进程,每个子进程负责生n个线程,每个线程响应一个请求 ,并发响应请求:m*n

 event :事件驱动模型(worker 模型的变种)

  一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n ,有专门的线程来管理这些keep-alive 类型的监控线程,当有真实请求时, 将请求传递给服务线程,执行完毕后,又允许释放 。这样增强了高并发场景下的请求处理力 能力

httpd-2.2: event 测试版 ,centos6 默认

httpd-2.4 :event 稳定版,centos7 默认

  图示:

① prefork MPM

② worker MPM

③ event MPM

注意:httpd-2.2 不支持同时编译多个模块,所以只能编译时选定一个;rpm 安装的包提供三个二进制程序文件,分别用于实现对不同MPM 机制的支持

(2)确认方法:

  ps aux | grep httpd

  默认为/usr/sbin/httpd, 即prefork 模式

查看模块列表:

  查看静态编译的模块

    httpd -l

  查看静态编译及动态装载的模块

    httpd -M

动态模块加载:不需重启即生效

动态模块路径:/usr/lib64/httpd/modules

 

(3)更换使用的httpd 程序模块:

/etc/sysconfig/httpd 在这个文件中改

① HTTPD=/usr/sbin/httpd.worker  默认是被注释的,去掉注释就切换到worker程序了

重启服务生效

pstree -p|grep httpd 查看进程和线程

httpd.worker -l 模块换了,命令也换了

② Httpd 2.4 与之不同

以动态模块方式提供

配置文件:/etc/httpd/conf.modules.d/00-mpm.conf

httpd -M |grep mpm

重启服务 生效

pstree -p|grep httpd 查看进程和线程

 

(4)prefork 的默认配置:主配置文件中,搜索/prefork

<IfModule prefork.c> 根据工作环境设置

StartServers 8 一开启服务就准备8个进程

MinSpareServers 5 最小的空闲进程,先预留,不够就生成

MaxSpareServers 20 最大空闲进程

ServerLimit 256 最多进程数, 最大256

MaxClients 256 最大并发数

MaxRequestsPerChild 4000 子进程最多能处理请求数量。在处理MaxRequestsPerChild 个请求之后, 子进程将会被父进程终止,这时候子进程占用的内存就会释放( 为0时永远不释放)

</IfModule>

 

(5) worker 的默认配置:主配置文件中,搜索/worker

<IfModule worker.c>

StartServers 4 一开启服务就准备4个进程,4x25=100线程

MaxClients 300 最多300个线程

MinSpareThreads 25 最小空闲25线程

MaxSpareThreads 75 最大空闲75线程,和上边冲突,开服务先开启4个进程,再杀死1个进程

ThreadsPerChild 25 每个子进程最大25个线程

MaxRequestsPerChild 0 无限制

</IfModule>

(6) 测试性能:ab命令 yum -y install httpd-tools

ab -c 100 -n 1000 http://192.168.30.106/

-  c:并发连接数

  -n:总的连接数

结果:发现prefork和worker性能没有什么较大的差异

 

5 、DSO:Dynamic Shared Object

① 加载动态模块配置:/etc/httpd/conf/httpd.conf 主配置文件

配置指定实现模块加载格式:搜索/LoadModule

② 格式:

LoadModule <mod_name> <mod_path>

模块文件路径可使用相对路径:相对于ServerRoot 服务的根(设置的为/etc/httpd)

③ httpd -M 可以查询模块信息,若删除或注释掉一个模块,那个模块的功能就会禁用,且httpd -M 查询不到

因此,当我们需要用PHP时,可以写入PHP的模块,就能使用了

示例:

LoadModule auth_basic_module

modules/mod_auth_basic.so

 

6 、定义'Main' server (主站点) 的文档页面路径

搜索/DocumentRoot

格式:DocumentRoot "/path"

作用:文档路径映射:

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

注意:

① 可以写多行,但是下边的会覆盖上边的,最后还是使用下边的,写到自配置文件一样,因为子配置文件Include conf.d/*.conf在这行设置的上边,会被这行设置覆盖。

② 若设置的主站点不存在,那么服务会启动失败!

示例:

  DocumentRoot "/app/site1"

   http:/192.168.30.106/--> /app/site1/index.html

注意:SELinux 和iptables 的状态,要关掉

 

7、定义站点主页面

搜索:/DirectoryIndex

格式:DirectoryIndex index.html index.html.var

分析:

① 查询http://192.168.30.106/ 及其子目录时,不指定文件,可以默认打开目录下的index.html文件

若没有设置中的两个文件,看其他设置:下设置9,默认是报错;

有特定设置会显示特定设置,如首页;子配置文件 /etc/httpd/conf.d/welcome.conf 有设置,若只有 / 或多个,目录下没有index.html,就显示报错页面,welcome.conf这个设置优先级高,安全

报错页面

 

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

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

文件系统路径:格式

<Directory "/path">

...

</Directory>

<Files "/path/file">

...

</Files>

<FilesMatch "PATTERN">

...

</FilesMatch>

例:主配置文件中,不能访问 .ht 开头的文件的设置

 

URL 路径:支持正则,通配符

<Location "">

...

</Location>

<LocationMatch "">

...

</LocationMatch>

例:子配置文件,/etc/httpd/conf.d/welcome.conf 的设置

注意:支持正则,通配符

示例:

<FilesMatch "\.(gif|jpe?g|png)$"> 正则

<Files "?at.*"> 通配符

<Location /status> 绝对路径的目录

<LocationMatch "/(extra|special)/data">

 

9 、<Directory> 中"基于源地址"实现访问控制

(1) Options :后跟1 个或多个以空白字符分隔的选项列表,可在总配置文件中修改,也可从创建一个自配置文件中修改设置

在选项前的+ ,- 表示增加或删除指定选项

  常见选项:

  Indexes :指明的URL 路径下不存在定义的主页面资源相符的资源文件时,上设置7,返回索引列表给用户,默认是不允许,加上不安全;有需要的时候,例如做yum源的时候

  FollowSymLinks :允许访问符号所指向的源文件,例:链接文件,默认允许

  None :全部禁用

  All:全部允许

注意:若冲突,后边的设置会覆盖前边的

子目录也可以设置的和父目录不一样,放在下边

例:vim /etc/httpd/conf.d/test.conf 子配置文件

 

(2) AllowOverride,和上边实现的效果一样,就是把设置放在目录的隐藏文件下.htaccess

与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName 指定)文件中,覆盖之前的,.htaccess是主配置文件中设置指定的

用法:vim /etc/httpd/conf.d/test.conf

只对<directory> 语句有效

  AllowOverride All: 所有指令都有效

  AllowOverride None :.htaccess 文件无效

  AllowOverride AuthConfig Indexes 除了AuthConfig和Indexes的其它指令都无法覆盖

然后在.htaccess文件中设置,.htaccess放在所需要控制的目录下,例bbs目录

vim /app/site1/.htaccess

options +indexes -followsymlinks

 

(3) order 和allow 、deny,在2.4中已无效,有另外的权限控制

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

分析:① 若不冲突,allow,deny都产生效果,例

② 若冲突,看谁在后,在后的优先级高,但是只限于冲突的,

例:除107,这个网段的其他ip可以访问,但这个网段以外,都拒绝

③ 没在deny、allow中设置的,看allow/deny谁在后边,谁优先级高

 

10 、日志设定

日志类型:

  访问日志

  错误日志

错误日志:

  ErrorLog logs/error_log

  LogLevel warn

  loglevel 可选值:

  debug, info, notice, warn,error

  crit, alert, emerg

 

访问日志:搜索:/LogForma

定义访问日志格式:LogFormat format 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

各项设置的意思:可以随便改自己想要的

%h 客户端IP 地址

%l 远程用户, 启用mod_ident 才有效,通常为减号"-" "

%u 验证(basic ,digest )远程用户, 非登录访问时,为一个减号"-"

%t 服务器收到请求时的时间

%r First line of request ,即表示请求报文的首行;记录了此次请求的"方法","URL" 以及协议版本

%>s 最后的响应状态码

%b 响应报文的大小,纯数据大小,单位是字节;不包括响应报文http 首部

%{Referer}i 请求报文中首部"referer" 的值;即从哪个页面中的超链接跳转至当前页面的

  防止倒链,i就是首部的意思

%{User-Agent}i 请求报文中首部"User-Agent" 的值;即发出请求的应用程序

帮助文档里都有

查询日志:tail /var/log/httpd/access_log

 

11 、设定默认字符集

AddDefaultCharset UTF-8(全球) 默认

中文字符集:GBK, GB2312(中文简体), GB18030

 

12 、定义路径别名

格式: Alias /URL/ "/PATH/" /URL/有没有都无所谓,虚拟的目录

Alias /download/ "/rpms/pub/"

  例:http://www.magedu.com/download/bash.rpm ==> /rpms/pub/bash.rpm

  http://www.magedu.com/images/logo.png ==> /www/htdocs/images/logo.png

 

13 、status 页面

这个功能需要status_module 模块

  httpd -M | grep status 查询这个模块有没有被加载

在总配置文件中搜索/server-status

LoadModule status_module modules/mod_status.so 这个模块在总配置文件有加载

<Location /server-status> 本来是注释掉的

  SetHandler server-status2 这个名字随便写,只要访问时用这个名字就行

  Order allow,deny

  Allow from 192.168.30.0/24

</Location>

ExtendedStatus On 显示扩展信息,默认也是注释的

显示状态页面

状态的类型:

  "-"等待连接 "S"启动 "R"处于读取状态

  "W"发送应答 "K"保持长连接 "D"dns查询

  "C"正处于关闭状态 "L"记录日志 "G"优雅的终止,温柔的断开

  "r"把空闲的worker进程清理 "."没有正常的进程

 

 

posted @ 2017-10-23 19:02  alonghub  阅读(2288)  评论(0编辑  收藏  举报