Apache httpd 常用配置

2020-02-11 0 条评论 725 次阅读 0 人点赞

本文主要总结了一些常用的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]

bighero

这个人太懒什么东西都没留下

文章评论(0)