文章目录
- TCP协议的特性:
- httpd的特性:
- httpd-2.4常用配置:
TCP协议的特性:
- 建立连接:三次握手;
- 将数据打包成段:校验和(CRC32)
- 确认、重传及超时;
- 排序:逻辑序号;
- 流量控制:滑动窗口算法;
- 拥塞控制:慢启动和拥塞避免算法
httpd的特性:
- 高度模块化:core+modules;
- DSO:dynamic shared object;
- MPM:Multipath processing Modules(多路处理模块);
* prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
n个子进程:每个子进程处理一个请求;
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
* worker:多进程多线程模型,每线程处理一个用户请求;
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
多个子进程:每个子进程负责生成多个线程;
每个线程:负责响应用户请求;
并发响应数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量;
* event:事件驱动模型,多进程模型,每个进程响应多个请求;
一个主进程 :负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
子进程:基于事件驱动机制直接响应多个请求;
httpd-2.4常用配置:
(一)、修改监听的IP和PORT:
Listen [IP:]PORT
- 省略IP表示为0.0.0.0;
- Listen指令可重复出现多次:Listen 80;Listen 8080;
- 修改监听socket,重启服务进程方可生效;
(二)、持久连接:
Persistent Connection:tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行; 如何断开?
- 资源数量限制;
- 连接时间限制;
- 副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常 响应;
- 折衷:使用较短的持久连接时长,以及较少的请求数量;
- Ex:
KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
(三)、MPM:
1、prefork的配置:
2、worker的配置:
(四)、DSO:
- 配置指定实现模块加载:LoadModule <mod_name> <mod_path>
- 模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)
(五)、定义“Main” server的文档页面路径:
- DocumentRoot “/var/www/html”
- DocumentRoot指向的文件系统路径为URL路径的起始位置,其相当于站点URL的根路径:/var/www/html/index.html–>(URL)/index.html
(六)、站点访问控制常见机制:
1、可基于两种机制指明对哪些资源进行何种访问控制:
-
文件系统路径:在httpd-2.4下所有目录访问控制都需要显示授权
<Directory “”>
…
<File “”>
…
<FileMatch “PATTERN”>
…
-
URL路径:
<Location “”>
…
<LocationMatch “”>
…
2、中“基于源地址”实现访问控制:
(1)、Options:
- 后跟1个或多个以空白字符分隔的“选项”列表;
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
None:
All:
(2)、AllowOverride:
与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
All:
None:
(3)、 基于IP的访问控制
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
控制特定的IP访问:
Require ip IPADDR:授权指定来源的IP访问;
Require not ip IPADDR:拒绝
控制特定的主机访问:
Require host HOSTNAME:授权指定来源的主机访问;
Require not host HOSTNAME:拒绝
HOSTNAME:
FQDN:特定主机
domin.tld:指定域名下的所有主机
#必须放置块内,例:
Require all granted
Require not ip 172.16.100.2
(七)、定义站点主页面:
DirectoryIndex index.html index.html.var index.php
(八)、定义路径别名:
格式:Alias /URL/ “/PATH/TO/SOMEDIR/”
例:
#DocumentRoot “/www/htdocs”
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
#Alias /download/ “/rpms/pub/”
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
(九)、设定默认字符集:
例:AddDefaultCharset UTF-8
(十)日志设定:访问日志和错误日志
1、访问日志:
LogFormat “%h %l %u %t “%r” %>s %b “%{Referer}i” “%{User-Agent}i”” combined
CustomLog logs/access_log combined
%h:客户端IP地址;
%l:Remote User, 通常为一个减号(“-”);
%u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;
%t:服务器收到请求时的时间;
%r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
%>s:最终响应状态码;(%s:起始的响应状态码;)
%b:响应报文的大小,单位是字节;不包括响应报文的http首部;
%{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
%{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;
2、错误日志:
ErrorLog logs/error_log
LogLevel warn
Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
(十一)、基于用户的访问控制:
1、认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
2、认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
认证方式有两种:
basic:明文
digest:消息摘要认证;
目前web常用表单认证;
3、安全域:
需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;
basic认证配置示例:
(1) 定义安全域
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
Require user username1 username2 …
允许账号文件中的所有用户登录访问:
用Require valid-user 替换 Require user username1 username2 …
(2) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5格式加密
-s: sha格式加密
-D:删除指定用户
另外:基于组账号进行认证;–为什么需要用到组认证?一个单位有上万人,我们想让3000人登录,总不能把这3000人都加入到配置文件吧,我们可以将这一万人进行分组,允许这3000人在的组登录管理;
(1) 定义安全域
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName "String“
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
AuthGroupFile “/PATH/TO/HTTPD_GROUP_FILE”
Require group grpname1 grpname2 …
(2) 创建用户账号和组账号文件;
组文件:"/PATH/TO/HTTPD_GROUP_FILE"每一行定义一个组
例如:运维组:包含哪些人:
GRP_NAME: username1 username2 …
(十二)、虚拟主机:
1、站点标识:socket
- IP相同,但端口不同;
- IP不相同,但端口均为默认端口;
- FQDN不同;请求报文中首部:Host:www.google.com
2、有三种实现方案:
- 基于IP:为每个虚拟主机准备至少一个ip地址;
- 基于port:为每个虚拟主机使用至少一个独立port;
- 基于FQDN:为每个虚拟主机使用至少一个FQDN;
3、虚拟主机的配置方法:
ServerName FQDN DocumentRoot ""(1)、其他可用指令:
ServerAlias:虚拟主机的别名;可多次使用;
ErrorLog:
CustomLog:
<Directory “”>
…
Alias
…
(2)、基于IP的虚拟主机实例:
①基于IP的虚拟主机示例:
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot “/www/a.com/htdocs”
<VirtualHost 172.16.100.7:80>
ServerName www.b.net
DocumentRoot “/www/b.net/htdocs”
②基于端口的虚拟主机:
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot “/www/a.com/htdocs”
<VirtualHost 172.16.100.6:8080>
ServerName www.b.net
DocumentRoot “/www/b.net/htdocs”
③基于FQDN的虚拟主机:
<VirtualHost 172.16.100.6:80>
ServerName www.a.com
DocumentRoot “/www/a.com/htdocs”
<VirtualHost 172.16.100.6:80>
ServerName www.b.net
DocumentRoot “/www/b.net/htdocs”
Note:如果是httpd2.2,使用基于FQDN的虚拟主机时,需要事先使用如下指令:
NameVirtualHost IP:PORT
(十三)、status页面:
需要加载status模块:LoadModule status_module modules/mod_status.so
<Location /server-status>—此处的server-status的名字可以自己乱起。
SetHandler server-status
Require ip 172.16
(十四)、user/group:
指定以哪个用户的身份运行httpd服务进程;
User apache
Group apache
(十五)、使用mod_deflate模块压缩页面优化传输速度:
1、适用场景:
- 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
- 压缩适于压缩的资源,例如文件文件;
2、实例:
创建/etc/httpd/conf.d/compress.conf文件,在文件编辑如下:
SetOutputFilter DEFLATE
# mod_deflate configuration
# 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 has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
(十六)、https、http over ssl:
1、SSL会话的简化过程
- (1) 客户端发送可供选择的加密方式,并向服务器请求证书;
- (2) 服务器端发送证书以及选定的加密方式给客户端;
- (3) 客户端取得证书并进行证书验正:
如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
(b) 验正证书的内容的合法性:完整性验正
© 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机要一致; - (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
- (5) 服务用此密钥加密用户请求的资源,响应给客户端;
- 注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
- 理解:ssl会话:1、先tcp三次握手;2、然后客户端给服务器要证书,服务器发送证书;3、客户端要验证一下证书的真伪;4、客户端给服务器发送商量好的对称秘钥,服务器用商量好的对称秘钥给客户端发送资料;
2、SSL自签证书流程:
(1)、构建私有CA:
配置文件:/etc/pki/tls/openssl.cnf
在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;
步骤:
(1) 生成私钥;
~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
(2) 生成自签证书;
~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
-new:生成新证书签署请求;
-x509:生成自签格式证书,专用于创建私有CA时;
-key:生成请求时用到的私有文件路径;
-out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;
-days:证书的有效时长,单位是day;
(3) 为CA提供所需的目录及文件;
~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
~]# touch /etc/pki/CA/{serial,index.txt}
~]# echo 01 > /etc/pki/CA/serial
(2)、要用到证书进行安全通信的服务器,需要向CA请求签署证书:
步骤:(以httpd为例)
(1) 用到证书的主机生成私钥;
~]# mkdir /etc/httpd/ssl
~]# cd /etc/httpd/ssl
~]# (umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 2048)
(2) 生成证书签署请求
~]# openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr -days 365
(3) 将请求通过可靠方式发送给CA主机;
scp /etc/httpd/ssl/httpd.csr root@192.168.80.10:/tmp/
(4) 在CA主机上签署证书;
~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365
查看证书中的信息:
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(3)、吊销证书:
步骤:
(1) 客户端获取要吊销的证书的serial(在使用证书的主机执行):
~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -serial -subject
(2) CA主机吊销证书
先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;
吊销:
~]# openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem
其中的SERIAL要换成证书真正的序列号;
(3) 生成吊销证书的吊销编号(第一次吊销证书时执行)
~]# echo 01 > /etc/pki/CA/crlnumber
(4) 更新证书吊销列表
~]# openssl ca -gencrl -out thisca.crl
查看crl文件:
~]# openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text
(十七)、httpd自带的工具程序:
- htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具;
- apachectl:httpd自带的服务控制脚本,支持start和stop;
- apxs:由httpd-devel包提供,扩展httpd使用第三方模块的工具;
- rotatelogs:日志滚动工具;
access.log -->
access.log, access.1.log -->
access.log, acccess.1.log, access.2.log - suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行;
- ab: apache bench
感想:如果你感觉生活很困难,那么你走的是上坡路,相反如果你感觉很舒适,嘿嘿,你在走下坡路哦。
文章目录