本文主要总结了一些常用的httpd的配置项
首先,RPM安装的和自己手动编译的httpd的配置文件组织方式稍有区别
RPM包安装的配置文件有三个地方
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/.conf
/etc/httpd/conf.module.d/.conf
rpm包安装的httpd,ServerRoot的位置为/etc/httpd/,因此这个目录里还有几个软链接,指向了,logs,modules等目录的真实位置
源码编译的httpd的配置文件主要有两个位置
/etc/httpd/httpd.conf
/etc/httpd/extra/.conf
源码包的ServerRoot为编译时手动指定的,多为/usr/local目录中的某个目录
需要注意的是/etc/httpd/extra/.conf中的好多文件默认是没有被引入到主配置文件中的,因此,很可能配置后出现不生效的可能
配置格式,httpd的配置文件采用了类似xml的格式配置,即两个标签将内容包起来,
例如\<Directory "/path">\是对某一个目录的具体配置
另外它还引入了一种判断格式,判断某个模块是否启用,如果模块启用则内部的配置生效,否则不生效,
<IfModule mpm_event_module>
...
</IfModule>
用的最多的是这种类似key value的形式,中间用空格分开,配置文件中统一使用#进行注释
模块加载,
格式:这里模块的路径可以是相对于ServerRoot的相对路径
LoadModule module_name module/path
服务版本信息:
在http头中的server字段中,显示的服务器版本信息,建议配置为Prod,仅显示为Apache,避免服务器版本暴露
ServerTokens {full|major|minor|os|prod}
错误页面底部是否显示版本信息:同上建议设置为Off
ServerSignature {On|Off|Email}
修改监听的ip,端口,ip不写的话监听在所有ip上
Listen [1.2.3.4:]80
持久连接:
KeepAlive {on|off},是否开启持久连接,httpd的一个特性,即建立一次tcp连接后是否可以通过改连接发起多次请求,而不用每个请求都进行三次握手四次挥手,根据业务需求打开或者关闭
KeepAliveTimeout N[ms]:此处的N是一个时间值,默认单位为秒,在2.4版本中可以以毫秒为单位,
MaxKeepAliveRequests N:单个连接允许的最大请求次数,超过N,则强制断开连接,如果客户端需要请求资源,必须重新建立会话连接
MPM配置,httpd有三种进程管理模型,perfork,worker,event,在源码编译时通过可通过--enable-mpms-shared选项将这三个模块编译为动态模块,安装完之后可以启用三者之一的模块来定义使用的管理模型,否则只会编译一个模块,要想改变工作模型必须重新编译
perfork:服务启动时创建一个守护进程,和多个子进程,每个子进程响应一个请求
worker:服务启动时创建一个守护进程,和多个子进程,每个子进程创建n个线程,由每个线程进行请求的响应
event:和worker工作模式相似,不过引入了个管理线程,来提高线程的复用
以下为各个模块的各个配置项的具体说明,注意这些配置项需根据自己的生成环境不断调整优化,得出比较符合自己的数字,
<ifModule mpm_prefork_module>
StartServers:启动服务时创建的进程数(不包含主进程)
MinSpareServers:最小空闲子进程数
MaxSpareServers:最大空闲子进程数
MaxRequestWorksers:最大并发连接数
MaxConnectionsPerChild:每个子进程在其生命周期内允许最大的请求数,为0子进程将永远不会结束
</ifModule>
<ifModule mpm_worker_module>
StartServers:启动服务时创建的进程数
MinSpareThreads:最小空闲子进程数
MaxSpareThreads:最大空闲子进程数
ThreadsPerChild:每个子进程产生的线程数量
MaxRequestWorksers:最大并发数
MaxConnectionsPerChild:每个子进程在其生命周期内允许最大的请求数量
</ifModule>
<ifModule mpm_event_module>
StartServers:启动服务时创建的进程数
MinSpareThreads:最小空闲子进程数
MaxSpareThreads:最大空闲子进程数
ThreadsPerChild:每个子进程产生的线程数量
MaxRequestWorksers:最大并发数
MaxConnectionsPerChild:每个子进程在其生命周期内允许最大的请求数量
</ifModule>
网站的根目录路径:
DocumentRoot /path/to/webdir,配置网站程序存放的路径,此路径最好对运行httpd响应进程的用户有权限,且应该为最小权限,在2.4版本中必须有相应的Directory对其限制
站点访问路径控制
目录控制示例:
<Directory "/path/to/webdir">
Options -Indexes
Require all granted
<Directory>
文件控制
<Files "/path/to/file">
</Files>
正则匹配
<Filesmatch "pattern">
</Filesmatch>
URL控制
<Location "/path/url">
</Location>
URL正则匹配
<LocationMatch "pattern">
</Location>
控制策略:
options可以定义特定的操作是否可以在该目录下正常使用,选项前+表示可以,-表示不可以,可以跟多个选项,用空格分隔
Indexes:当首页文件不存在时,是否通过web界面向用户展示目录列表
FollowSymLinks:当目录中存在软链接时是否可以被访问
ExecCGI:是否允许使用mod_cgi执行CGI脚本。
MultiViews:是否允许内容协商,即是否允许使用mod_negotiation模块
none:全部禁止
all:全部允许
Require定义了哪些用户是否有权限访问
Require all granted:所有的请求都允许
Require all denied
Require [not] user user1,user2,...是否允许指定的用户访问,配合用户认证使用
Require [not] group user1,user2,...是否允许指定组中的用户访问,配合用户认证使用
Require valid-user:所有的用户都可以访问
Require [not] ip ip1,ip2,...指定范围内的ip可以访问
用户基本认证方式:
AuthType basic:认证类型
AuthName "string":用户打开网页时认证对话框中显示信息
AuthUserFile "/path/to/user_file":用户数据文件
AuthGroupFile "/path/to/group_file":组数据文件
Require ...
satisfy {all|any}
all:只有ip和用户密码认证都通过了才可以正常访问
any:只要有一项认证通过了就可以
创建用户数据文件:
# htpasswd [options] /path/to/user_file username
-c:创建user_file文件,只有第一次创建时使用该选项,之后使用会覆盖
-p:不加密密码
-m:使用md5加密密码
-s:使用sha加密密码
-D:删除指定用户
组文件可以自己手动创建,格式为group_name:user1,user2,...
首页文件名
DirectoryIndex index.html index.php
日志相关:
ErrorLog 错误日志的位置
LogLevel 日志级别
debug,info,notice,warn,error越靠前记录的越详细
CustomLogs /path/to/logfile [format_name]:定义访问日志的位置,及使用的格式名称
LogFormat formats.... format_name:定义日志格式:
%h:客户端ip地址
%l:登录时使用的用户名,并不是表单认证中的,-为空
%{format}t:客户端访问时间,可以对其进行格式定制,其格式和date命令中的格式符类似
%r:请求报文的首行信息
%>s:响应的状态码
%b:响应报文大小,不包含首部信息
%{some}i:请求报文中某个字段的值
设定字符集
AddDefaultCharset UTF-8
别名:请求某个URL使其访问特定目录中的内容,注意为这个目录做授权
Alias "/url" "/path/to/somedir"
httpd状态展示:需要启用mod_status.so模块
LoadModule status_module modules/mod_status.so
<Location /server_status>
SetHandler server-status
</Location>
当用户访问网站下的server_status时就会返回httpd状态的一个页面,当然,这个页面不应该让所有人都看见
虚拟主机配置:可以基于端口,ip,主机名进行配置,一般虚拟主机不与中心主机共存,配置虚拟主机后应该把中心主机关闭,即注释DocumentRoot
基于端口
listen 81
listen 82
listen 83
<VirtualHost 1.2.3.4:81>
DocumentRoot "/path/to/site"
<Directory "/path/to/site">
Require all granted
</Directory>
ErrorLog '/path/to/errlog'
TransferLog '/path/to/acclog'
</VirtualHost>
基于主机名: 尖括号中只能写*:80
<VirtualHost *:80>
ServerName fqdn
ServerAlias:虚拟主机别名
DocumentRoot "/path/to/site"
<Directory "/path/to/site">
Require all granted
</Directory>
ErrorLOg '/path/to/errlog'
TransferLog '/path/to/acclog'
</VirtualHost>
mod_deflate模块,用于压缩,可以对指定类型的数据进行压缩后传输,节省带宽,
loadmodule deflate_module modules/mod_deflate.so
AddOutputFilterByType DEFLATE text/plain:指定要压缩的内容
DeflateCompressionLevel 9,指定压缩比
sendfile机制
httpd的连接线程是使用普通用户运行在用户空间下的进程,在客户端访问请求到达后,他需要向内核申请,由内核来读取文件到内核空间,然后将数据复制到连接线程的用户空间中,然后连接线程为数据打好http包头,然后再向内核申请将数据通过网络进行传输,
减少进程上下文切换,文件复制次数
EnableSendFile {On|Off}
反向代理功能:
ProxyPass "/" "http://fqdn"
ProxyPassMatch "/" "http://fqdn":可以使用正则匹配
重定向
Redirect {Temp|permanent} new_url
Permanent:301重定向
temp:302重定向
HSTS:Http Strict Transport Security:
第一次访问时通过307状态码返回HTTPS的链接
Header always set Strict-Transport-Security "Max-age=86400"
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1[redirect=302]
文章评论(0)