Linux 第76天 http配置文件内容解析
时间: 20181018
个人小站,欢迎访问: www.winthcloud.top
目录
httpd 常见配置
日志设定
虚拟主机(重点)
mod_deflate模块
https:http over ssl
总结
httpd 2.2常见配置
httpd配置文件的组成:
grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式:directive value
directive: 不区分字符大小写
value: 为路径时,是否区分大小写,取决于文件系统
ServerName 主机名
显示服务器版本信息
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续
等待其它的请求完成,默认关闭持久连接
断开条件:
1)数量限制:100
2)时间限制:以秒为单位, httpd-2.4 支持毫秒级
副作用:对并发访问量较大的服务器,持久连接会使有些请求得不到响应
折衷:使用较短的持久连接时间
设置:KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
测试:telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
MPM( Multi-Processing Module)多路处理模块
prefork的默认配置:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256 最多进程数,最大20000
MaxClients 256 最大并发
MaxRequestsPerChild 4000 子进程最多能处理的请求数量。在处理
MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进
程占用的内存就会释放(为0时永远不释放)
</IfModule>
worker的默认配置:
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0 无限制
</IfModule>
定义'Main' server的文档页面路径
DocumentRoot “/path”
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
示例:
DocumentRoot "/app/data“
http://HOST:PORT/test/index.html --> /app/data/test/index.html
定义站点主页面
DirectoryIndex index.html index.html.var
站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制
访问控制机制有两种:客户端来源地址,用户账号
文件系统路径:
<Directory “/path">
...
</Directory>
<File “/path/file”>
...
</File>
<FileMatch "PATTERN">
...
</FileMatch>
<Directory>中“基于源地址”实现访问控制
(1) Options:后跟1个或多个以空白字符分隔的选项列表
在选项前的+,- 表示增加或删除指定选项
常见选项:
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源
文件时,返回索引列表给用户
FollowSymLinks:允许访问符号链接文件所指向的源文件
None:全部禁用
All: 全部允许
(2) AllowOverride
与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName
指定)文件中,覆盖之前的配置指令
只对<directory>语句有效
AllowOverride All: .htaccess中所有指令都有效
AllowOverride None: .htaccess 文件无效
AllowOverride AuthConfig Indexes 除了AuthConfig
和Indexes的其它指令都无法覆盖
(3) order和allow、deny (http2.2配置)
放在directory, .htaccess中
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
示例:
<files "*.txt">
order deny,allow
deny from 172.16. 100.100
allow from 172.16
</files>
<filematch “.*\.(conf|ini)$">
order allow,deny
deny from 172.16.100.100
allow from 172.16
</filematch>
基于IP的访问控制(http2.4配置)
无明确授权的目录,默认拒绝
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all denied
控制特定的IP访问:
Require ip IPADDR:授权指定来源的IP访问
Require not ip IPADDR:拒绝特定的IP访问
控制特定的主机访问:
Require host HOSTNAME:授权特定主机访问
Require not host HOSTNAME:拒绝HOSTNAME:
FQDN:特定主机
domin.tld:指定域名下的所有主机
不能有失败,至少有一个成功匹配才成功,即失败优先
<RequireAll>
Require all granted
Require not ip 172.16.1.1 拒绝特定IP
</RequireAll>
多个语句有一个成功,则成功,即成功优先
<RequireAny>
Require all denied
require ip 172.16.1.1 允许特定IP
</RequireAny>
URL路径:
<Location "">
...
</Location>
<LocationMatch "">
...
</LocationMatch>
示例:
<FilesMatch "\.(gif|jpe?g|png)$">
<Files "?at.*"> 通配符
<Location /status>
<LocationMatch "/(extra|special)/data">
日志设定
日志类型:
访问日志
错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn
LogLevel 可选值: debug, info, notice, warn,error, crit, alert, emerg
访问日志:
定义日志格式:LogFormat format strings
LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b
\"%{Referer}i\" \"%{User-Agent}i\"" testlog (与上一行一行内容)
使用日志格式:
CustomLog logs/access_log testlog
参考帮助: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”的值;即从哪个页面中的超链
接跳转至当前页面的
%{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的
应用程序
设定默认字符集
AddDefaultCharset UTF-8 此为默认值
中文字符集:GBK, GB2312, GB18030
定义路径别名
格式:Alias /URL/ "/PATH/"
DocumentRoot "/www/htdocs"
http://www.winthcloud.com/download/bash.rpm
==>/www/htdocs/download/bash.rpm
Alias /download/ "/rpms/pub/"
http://www.winthcloud.com/download/bash.rpm
==>/rpms/pub/bash.rpm
http://www.winthcloud.com/images/logo.png
==>/www/htdocs/images/logo.png
基于用户的访问控制
认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求
客户端提供账号和密码
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证
通过时,则服务器发送响应的资源
认证方式两种:
basic:明文
digest:消息摘要认证,兼容性差
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便
于告知用户认证的原因
用户的账号和密码
虚拟账号:仅用于访问某服务时用到的认证标识
存储:文本文件,SQL数据库,ldap目录存储,nis等
ServerSignature On | Off | EMail
当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了
ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本
等信息
如果不对外显示这些信息,就可以将这个参数设置为Off
设置为Email,将显示ServerAdmin 的Email提示
status页面
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow,deny
Allow from 172.16
</Location>
ExtendedStatus On 显示扩展信息
虚拟主机(重点)
站点标识: socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同: 请求报文中首部 Host: www.winthcloud.com
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机使用至少一个独立的port
基于FQDN:为每个虚拟主机使用至少一个FQDN
注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机
禁用方法:注释中心主机的DocumentRoot指令即可
虚拟主机的配置方法:
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot “/path"
</VirtualHost>
建议:上述配置存放在独立的配置文件中
其它可用指令:
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog: 错误日志
CustomLog:访问日志
<Directory “/path"> </Directory>
Alias
基于IP的虚拟主机示例:
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.7:80>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.8:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
基于端口的虚拟主机:可和基于IP的虚拟主机混和使用
listen 808
listen 8080
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:808>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:8080>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
基于FQDN的虚拟主机:
NameVirtualHost *:80 httpd2.4不需要此指令
<VirtualHost *:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost *:80>
ServerName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost *:80>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>
mod_deflate模块
使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
(2) 压缩适于压缩的资源,例如文本文件
LoadModule deflate_module modules/mod_deflate.so
SetOutputFilter DEFLATE
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
排除特定旧版本的浏览器,不支持压缩
Netscape 4.x 只压缩text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html
Netscape 4.06-08三个版本 不压缩
BrowserMatch ^Mozilla/4\.0[678] no-gzip
Internet Explorer标识本身为“Mozilla / 4”,但实际上是能够处理请求的压缩。
如果用户代理首部匹配字符串“MSIE”(“B”为单词边界”),就关闭之前定
义的限制
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
https:http over ssl
SSL会话的简化过程
(1) 客户端发送可供选择的加密方式,并向服务器请求证书
(2) 服务器端发送证书以及选定的加密方式给客户端
(3) 客户端取得证书并进行证书验证
如果信任给其发证书的CA
(a) 验证证书来源的合法性;用CA的公钥解密证书上数字签名
(b) 验证证书的内容的合法性:完整性验证
(c) 检查证书的有效期限
(d) 检查证书是否被吊销
(e) 证书中拥有者的名字,与访问的目标主机要一致
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发
送给服务器,完成密钥交换
(5) 服务用此密钥加密用户请求的资源,响应给客户端
注意:SSL是基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机
https实现
(1) 为服务器申请数字证书
测试:通过私建CA发证书
(a) 创建私有CA
(b) 在服务器创建证书签署请求
(c) CA签证
(2) 配置httpd支持使用ssl,及使用的证书
yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 测试基于https访问相应的主机
openssl s_client [-connect host:port] [-cert filename]
[-CApath directory] [-CAfile filename]
重定向
Redirect [status] URL-path URL
status状态:
Permanent: 返回永久重定向状态码 301
Temp:返回临时重定向状态码302. 此为默认值
示例:
Redirect temp / https://www.winthcloud.com/
http重定向https
将http请求转发至https的URL
HSTS
HSTS:HTTP Strict Transport Security
服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带
HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在
内部做307跳转到HTTPS。而无需任何网络过程
HSTS preload list
是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用
Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、
Edge浏览器也会采用这个列表
实现HSTS示例:
vim /etc/httpd/conf/httpd.conf
Header always set Strict-Transport-Security "max-age=31536000"
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=302]
总结
1. alias 用来定义将web地址后边跟的路径连接至服务器的真正文件系统路径
2. redirect 将内部连接重定向至其它url并通知客户端去新的url去取资源
3. 实现https时要不将80的虚拟主机重定向至https要不就将端口改为443(推荐前一种)
转载于:https://blog.51cto.com/winthcloud/2308003