httpd2.2基本配置和http协议报文和https的配置(第21天)
MPM: (课程后面会详细介绍)
prefork:多进程模型,一个进程直接响应一个请求;
worker:多线程模型(多进程生成,一个进程生成多个线程),一个线程响应一个请求;
event:事件驱动模型,一个线程响应多个请求;
并发服务器响应请求:
单进程I/O模型;启动一个进程处理用户的请求,并且以此只处理一个请求,多个请求被串行响应
多进程I/O模型;并行启动多个进程,每个进程响应一个连接请求
复用的I/O模型;启动一个进程,然后同时响应N个连接请求,有如下两种实现方式(包括多线程模型和事件驱动模型)
多线程模型:一个进程生成N个线程,每个线程响应一个连接请求
事件驱动 : 一个进程直接处理N个请求
复用的多进程I/O模型;启动M个进程,每个进程响应N个连接请求,所以就同时接受M×N个请求。
httpd第二部分(2)
CentOS 6: httpd版本2.2
CentOS 7: httpd版本2.4
CentOS 6:
httpd安装完成之后,通过rpm -ql httpd 查看所有的文件
httpd服务的配置文件如下:
/etc/httpd/conf/httpd.conf 主要配置文件
/etc/httpd/conf.d/*.conf 分段配置文件
httpd服务的启动脚本:
/etc/rc.d/init.d/httpd
脚本的配置文件:/etc/sysconfig/httpd
httpd提供的二进制文件如下:
/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd prefork模型
/usr/sbin/httpd.event event模型
/usr/sbin/httpd.worker worker模型
/usr/sbin/httxt2dbm
/usr/sbin/rotatelogs
/usr/sbin/suexec
httpd提供的日志文件:
/var/log/httpd/access_log 访问日志
/var/log/httpd/error_log 错误日志
httpd提供的站点文档目录:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
配置文件/etc/httpd/conf/httpd.conf文件详解:
该文件有3段section
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment 全局环境
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts 虚拟主机 ,sections2和sections3一般只选一个
httpd.conf文件的配置格式:directive value
directive: 不区分字符大小写;
value: 为路径时,取决于文件系统;
常用配置:
1、修改监听的IP和Port
Listen [IP:]PORT 省略ip表示监听本机所有IP; Listen可重复出现多次;
2、持久连接(长连接)
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续保持连接等待其它的请求完成;
如何断开持久连接?
数量限制:获取100个资源后,断开连接
时间限制:可配置
持久连接的副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到响应;
折衷:使用较短的持久连接时间;httpd-2.4 支持毫秒级持久时间;
非持久连接:
持久连接的配置选项:
KeepAlive On|Off
MaxKeepAliveRequests #
KeepAliveTimeout #
测试持久连接特性,可以使用telnet命令
telnet HOST PORT
GET /URL HTTP/1.1
Host: HOSTNAME or IP
3、httpd的MPM模型
Multipath Process Module:多道处理模块
模型有prefork, worker, event
httpd-2.2不支持同时编译多个模块,所以只能编译源码时选定一个;rpm安装的包提供3个二进制程序文件,分别用于实现对不同MPM机制的支持;
确认方法:# ps aux | grep httpd
默认为/usr/sbin/httpd, 其使用prefork
查看静态编译的模块
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
查看静态编译及动态装载的模块
# httpd -M
更换使用的httpd程序的MPM模型:
编辑/etc/sysconfig/httpd文件指定 查找 #HTTPD=/usr/sbin/httpd.worker ,将其注释取消掉,重启服务生效;
prefork的配置:
102 <IfModule prefork.c>
103 StartServers 8 服务启动时启动的进程的数量,这个是工作进程,不包含主控进程
104 MinSpareServers 5 最少空闲进程数量
105 MaxSpareServers 20 最大空闲进程数量
106 ServerLimit 256 表示MaxClients允许的最大值
107 MaxClients 256 允许启动的最大服务器进程数,也就是同一时间的并发量
108 MaxRequestsPerChild 4000 服务器进程响应的最大请求数
109 </IfModule>
worker的配置: worker是多进程多线程模型
118 <IfModule worker.c>
119 StartServers 4 服务启动时启动的进程的初始数量
120 MaxClients 300 最大并发请求数
121 MinSpareThreads 25 保留备用的最小工作线程数
122 MaxSpareThreads 75 保留备用的最大工作线程数
123 ThreadsPerChild 25 每个进程的工作线程数量
124 MaxRequestsPerChild 0 每个进程服务的最大请求数
125 </IfModule>
PV: Page View,一个PV有多个请求。
UV: User View,也就是独立IP量;
4、DSO 动态共享对象
配置指令实现模块加载的格式如下:
LoadModule <mod_name> <mod_path>
其中,模块路径可使用相对地址,相对于ServerRoot(/etc/httpd)指向的路径而言的;
/etc/httpd/modules/
5、定义'Main' server的文档页面路径
DocumentRoot
文档路径映射表示DocumentRoot指向的路径为URL路径的起始位置;
比如:
DocumentRoot "/var/www/html"
如果想访问 http://HOST:PORT/test/index.html,那么对应的服务器上路径为/var/www/html/test/index.html
6、站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:可以通过如下的标签设置
<Directory ""> </Directory> 对某个目录控制
<File ""> </File> 对单个文件控制
<FileMatch ""> </FileMatch> 对匹配到的文件控制
URL路径:
<Location ""> </Location>
...
具体的访问控制机制:有基于来源ip地址和基于账号;
7、Directory中“基于来源地址”实现访问控制
(1) Options的取值有Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None, All
Indexes 索引;如果定义了Indexes,没有定义默认主页面,会403错误
FollowSymlinks 允许跟踪符号链接文件;
(2) 基于来源地址的访问控制机制
Order allow,deny 检查顺序,先检查允许的,后检查拒绝的,黑名单
Order deny,allow 白名单
Allow from
Deny from
来源地址可以有如下的形式:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8、定义默认主页面
DirectoryIndex index.html index.html.var
9、日志设定:包括错误日志和访问日志
错误日志的定义如下:
ErrorLog logs/error_log
LogLevel warn
日志级别: debug, info, notice, warn, error, crit, alert, emerg
访问日志的定义如下:
CustomLog logs/access_log combined combined表示日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h:客户端IP地址;
%l: Remote logname (from identd, if supplied). -表示为空;
%u: Remote user, (from auth; may be bogus if return status (%s) is 401);-表示为空
%t:Time the request was received (standard english format),服务器收到请求的时间;
%r:First line of request,请求报文的首行信息(method url version);
%>s: 响应状态码;
%b: 响应报文的大小,单位是字节,不包括响应报文首部;
%{Referer}i:请求报文当中"referer"首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来;
%{User-Agent}i:请求报文当中"User-Agent"首部的值;即发出请求用到的应用程序;
例如:
192.168.62.1 - - [11/Jul/2017:01:10:23 +0800] "GET / HTTP/1.1" 403 4954 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36"
详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10、路径别名的定义:
Alias /URL/ "/PATH/TO/SOMEDIR/"
例如定义别名如下:
Alias /bbs/ "/forum/htdocs/"
当访问http://www.magedu.com/bbs/index.html的时候,那么访问的就是/forum/htdocs/index.html文件
11、设定默认字符集
AddDefaultCharset UTF-8
GBK, GB2312, GB18030
12、基于用户的访问控制
认证质询:服务器响应WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;
认证:客户端http首部 Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源;
认证类型:有如下2种:
basic:明文
digest:消息摘要
安全域:需要用户认证后方能访问的路径;
应该通过名称对安全域进行标识,并用于告知用户认证的原因;
用户的账号和密码存储于何处?
虚拟账号:仅用于访问某服务时用到的认证标识;
存储:
文本文件
SQL数据库
ldap
nis
basic认证详解(分2步):
(1) 定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/etc/httpd/conf.d/.htpasswdfile" 该文件保存通过htpasswd命令生成的用户名和密码摘要
Require user username1 username2 ...
</Directory>
允许账号文件中的所有用户登录访问:Require valid-user
(2) 提供账号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
-m: md5加密用户密码;
-s: sha1加密用户密码;
-D: 删除指定用户
例如
htpasswd -c -m /etc/httpd/conf.d/.htpasswdfile Jerry
htpasswd -m /etc/httpd/conf.d/.htpasswdfile Tom
(3) 实现基于组进行认证
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/etc/httpd/conf.d/.htpasswdfile" 该文件保存通过htpasswd命令生成的用户名和密码摘要
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2 ...
</Directory>
要提供:用户账号文件和组文件;
组文件:每一行定义一个组
GRP_NAME:user1 user2 user3 ...
示例如下:
<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmin
</Directory>
13、虚拟主机
虚拟主机有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:为每个虚拟主机准备至少一个专用hostname;
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机,禁用中心主机可以注释httpd.conf文件中的DocumentRoot
每个虚拟主机都有专用配置:
<VirtualHost "IP:PORT">
SeverName
DocumentRoot "" 虚拟主机网页存放位置
ServerAlias: 虚拟主机的别名;
ErrorLog
CustomLog
<Directory "">
......
</Directory>
</VirtualHost>
示例1:基于ip,主机上必须有172.16.100.6和172.16.100.7的ip地址,必须先添加地址,可以使用ip addr add dev eth0 172.16.100.6/16 命令在网卡设备上添加新的ip地址
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
示例2:基于port, http.conf文件中必须要监听80和8080端口
<VirtualHost 172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.7:8080>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
示例3:基于hostname,httpd.conf文件中的 NameVirtualHost *:80 必须开启(注意:httpd2.4是不需要开启NameVirtualHost *:80,httpd2.2是必须的)
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
CustomLog logs/web1_access_log
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
14、内置的status页面 访问 http://192.168.62.149/server-status
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.62.149
</Location>
实现:基于账号实现访问控制status页面
15:curl命令详解
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
curl格式如下:
curl [options] [URL...]
curl的常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
elinks工具的格式:
elinks [OPTION]... [URL]...
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;
16 使用mod_deflate模块压缩页面优化传输速度
mod_deflate模块的适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
(2) 压缩适于压缩的资源,例如文件文件;
# httpd.conf文件中开启该模块
LoadModule deflate_module modules/mod_deflate.so
要使用mod_deflate模块,还必须设置http.conf文件中的输出过滤器(就是输出到网页中)为DEFLATE,设置格式如下:
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 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
17、https的配置
http over ssl = https 443/tcp
ssl: v3
tls: v1
SSL会话的简化过程:
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;
(2) 服务器端发送证书以及选定的加密方式给客户端;
(3) 客户端取得证书并进行证书验正:
如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上的数字签名;
(b) 验正证书的内容的合法性:完整性验正
(c) 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机要一致;
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
(5) 服务用此密钥加密用户请求的资源,响应给客户端;
具体过程参见下图:
回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)
配置httpd支持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]
例子:
假设192.168.62.149(172.16.100.9)为CA机构,
192.168.62.159(172.16.100.6)为服务器
1:登录192.168.62.149,创建私钥来创建私有CA
(umsk 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) 创建私钥文件cakey.pem
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 7300 创建自签证书cacert.pem
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:MageEdu Ltd
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.magedu.com
Email Address []:lv@gmail.com
2:登录192.168.62.159,生成证书签署请求
mkdir /etc/httpd/ssl 创建ssl目录
cd /etc/httpd/ssl 进入ssl目录
(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 1024) 生成服务器的私钥
openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr 使用上一步的私钥生成证书签署请求
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:MageEdu Ltd
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www.lvqinghe.com
Email Address []:eq@gmail.com
scp /etc/httpd/ssl/httpd.csr root@192.168.62.149:/tmp/ 将证书签署请求发送给CA,让CA签署
3:登录192.168.62.149 给服务器端发送过来的httpd.csr做签署
openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/www.lvqinghe.com.crt -days 365 签署,生成的证书为www.lvqinghe.com.crt
scp /etc/pki/CA/certs/www.lvqinghe.com.crt root@192.168.62.159:/etc/httpd/ssl/ 把证书传递到服务器端的/etc/httpd/ssl/目录下
4:登录192.168.62.159
httpd -M | grep ssl 查看是否支持ssl
yum -y install mod_ssl 安装ssl模块
/etc/httpd/conf.d/ssl.conf 这个文件是mod_ssl模块的配置文件
cd /etc/httpd/conf.d/
编辑ssl.conf 文件,内容如下:
Listen 443 https 监听在443端口
<VirtualHost *:443>
ErrorLog logs/ssl_error_log ssl错误日志
TransferLog logs/ssl_access_log ssl访问日志
LogLevel warn 日志级别
SSLEngine on SSL引擎
SSLCertificateFile /etc/httpd/ssl/www.lvqinghe.com.crt 证书文件
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key 私钥文件
DocumentRoot "/var/www/html"
ServerName www.lvqinghe.com:443
service httpd restart 重启服务
ss -tan | grep :443 查看是否监听了443端口
5:测试
登录192.168.62.149 做测试
openssl s_client -connect 192.168.62.159:443 -CAfile /etc/pki/CA/cacert.pem
18、httpd自带的工具程序
htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具;
apachectl:httpd自带的服务控制脚本,支持start, stop;
apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具;
rotatelogs:日志滚动工具;
access.log -->
access.log, access.1.log
access.log, access.1.log, access.2.log
suexec:
访问某些有特殊权限配置的资源时,临时切换至指定用户运行;
ab: apache benchmark
19、http压力测试工具
ab
webbench
http_load
jmeter
loadrunner
tcpcopy
ab [OPTIONS] URL
-n: 总的请求数
-c:模拟的并发数,同一时间发出的请求数量
-k: 以持久连接模式测试
ab -c 100 -n 10000 http://news.163.com/17/1024/12/D1GTEU5C0001899O.html
ulimit -n #: 调整当前用户所同时打开的文件数;
练习题:
1、建立httpd服务器,要求:
提供两个基于名称的虚拟主机:
(a)www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access;
(b)www2.stuX.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2.err,访问日志为/var/log/httpd/www2.access;
(c)为两个虚拟主机建立各自的主页文件index.html,内容分别为其对应的主机名;
(d)通过www1.stuX.com/server-status输出httpd工作状态相关信息,且只允许提供帐号密码才能访问(status:status);
2、为上面的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(Beijing)、城市(Beijing)和组织(MageEdu);
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com;
-------------------------华丽的分割线-------------------------------------------
http协议和httpd的配置
URL:Unifrom Resource Locator
URL的组成为如下3个:
URL方案:scheme
服务器地址:ip:port
资源路径:
例如: http://www.magedu.com:80/bbs/index.php
https://www.magedu.com:80/bbs/index.php
基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params参数 http://www.magedu.com/bbs/hello;gender=f
query http://www.magedu.com/bbs/item.php?username=tom&title=abc
frag https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html#ch-Boot-x86
相对URL
绝对URL
http协议:
有多个版本:http/0.9, http/1.0, http/1.1, http/2.0
http协议:stateless
服务器无法持续追踪访问者来源
所以通过cookie, session来确认某个请求来自于某个用户
服务器端只生成标识唯一用户的cookie,并发送给客户端,客户端下次访问时,在http首部带上该cookie,服务器端就能识别哪些请求来自于哪些用户。至于用户的浏览信息,购物车等等之类的私密信息可以保存在服务器端的session中。
http事务:包括请求和响应
请求:request
响应:response
request报文的格式如下:3部分组成,分别是首行,头部,实体
<method> <request-URL> <version>
<headers>
换行
换行
<entity-body>
response报文的格式如下:3部分组成,分别是首行,头部,实体
<version> <status> <reason-phrase>
<headers>
换行
换行
<entity-body>
method: 请求方法,标明客户端希望服务器对资源执行的动作,有GET、HEAD、POST,PUT等
version:
HTTP/<major>.<minor>
status: 响应状态码
三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况;
reason-phrase:
状态码所标记的状态的简要描述;
headers:请求报文和相应报文中都有
每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值;就是一些key:value
entity-body:
请求时附加的数据或响应时附加的数据
method(请求方法有哪些):
GET:从服务器获取一个资源;
HEAD:只从服务器获取文档的响应首部;
POST:向服务器发送要处理的数据;
PUT:将请求的实体部分存储在服务器上;
DELETE:请求删除服务器上指定的文档;
TRACE:追踪请求到达服务器中间经过的代理服务器;
OPTIONS:请求服务器返回对指定资源支持使用的请求方法;
协议查看或分析的工具:tcpdump, tshark, wireshark
status(状态码):
1xx:100-101, 信息提示;
2xx:200-206, 成功
3xx:300-305, 重定向
4xx:400-415, 错误类信息,客户端错误
5xx:500-505, 错误类信息,服务器端错误
常用的状态码:
200: 成功,请求的所有数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置; Found
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此状态码通知客户端;Not Modified
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway
headers详解:
格式:Name: Value
Cache-Control:public, max-age=600
Connection:keep-alive
Content-Type:image/png
Date:Tue, 28 Apr 2015 01:43:54 GMT
ETag:"5af34e-ce6-504ea605b2e40"
Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT
Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:access.redhat.com
If-Modified-Since:Wed, 08 Oct 2014 14:46:09 GMT
If-None-Match:"5af34e-ce6-504ea605b2e40"
Referer:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36
首部的分类:
通用首部
请求首部
响应首部
实体首部
扩展首部
通用首部:
Date: 报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点
Cache-Control:控制缓存 比如 no-cache,max-age
Pragma:比如 no-cache
请求专用首部:
Accept:通知服务器自己可接受的媒体类型;
Accept-Charset:
Accept-Encoding:接受编码格式,如gzip
Accept-Language:接受的语言
Client-IP:
Host: 请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源;
User-Agent:客户端代理
条件式请求首部:(主要和缓存系统有关)
Expect:
If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改;
If-Unmodified-Since:自从指定的时间之后,请求的资源是否没发生过修改;
If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配;
If-Match:
安全请求首部:
Authorization:向服务器发送认证信息,如账号和密码;
Cookie: 客户端向服务器发送cookie
Cookie2:
代理请求首部:
Proxy-Authorization: 向代理服务器认证
响应首部:信息性+协商+安全响应+认证表单
信息性:
Age:响应持续时长
Server:服务器程序软件名称和版本
协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其它首部列表;
安全响应首部:
Set-Cookie:向客户端设置cookie;
Set-Cookie2:
WWW-Authenticate:来自服务器的对客户端的质询认证表单
实体首部:用来描述报文中的实体的属性
Allow: 列出对此实体可使用的请求方法
Location:告诉客户端真正的实体位于何处
Content-Encoding:
Content-Language:
Content-Length: 实体的长度
Content-Location: 实体真正所处位置;
Content-Type:实体的对象类型
缓存相关:
ETag:实体的扩展标签;
Expires:实体的过期时间;
Last-Modified:最后一次修改的时间
prefork:多进程模型,一个进程直接响应一个请求;
worker:多线程模型(多进程生成,一个进程生成多个线程),一个线程响应一个请求;
event:事件驱动模型,一个线程响应多个请求;
并发服务器响应请求:
单进程I/O模型;启动一个进程处理用户的请求,并且以此只处理一个请求,多个请求被串行响应
多进程I/O模型;并行启动多个进程,每个进程响应一个连接请求
复用的I/O模型;启动一个进程,然后同时响应N个连接请求,有如下两种实现方式(包括多线程模型和事件驱动模型)
多线程模型:一个进程生成N个线程,每个线程响应一个连接请求
事件驱动 : 一个进程直接处理N个请求
复用的多进程I/O模型;启动M个进程,每个进程响应N个连接请求,所以就同时接受M×N个请求。
httpd第二部分(2)
CentOS 6: httpd版本2.2
CentOS 7: httpd版本2.4
CentOS 6:
httpd安装完成之后,通过rpm -ql httpd 查看所有的文件
httpd服务的配置文件如下:
/etc/httpd/conf/httpd.conf 主要配置文件
/etc/httpd/conf.d/*.conf 分段配置文件
httpd服务的启动脚本:
/etc/rc.d/init.d/httpd
脚本的配置文件:/etc/sysconfig/httpd
httpd提供的二进制文件如下:
/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd prefork模型
/usr/sbin/httpd.event event模型
/usr/sbin/httpd.worker worker模型
/usr/sbin/httxt2dbm
/usr/sbin/rotatelogs
/usr/sbin/suexec
httpd提供的日志文件:
/var/log/httpd/access_log 访问日志
/var/log/httpd/error_log 错误日志
httpd提供的站点文档目录:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
该文件有3段section
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment 全局环境
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts 虚拟主机 ,sections2和sections3一般只选一个
httpd.conf文件的配置格式:directive value
directive: 不区分字符大小写;
value: 为路径时,取决于文件系统;
常用配置:
1、修改监听的IP和Port
Listen [IP:]PORT 省略ip表示监听本机所有IP; Listen可重复出现多次;
2、持久连接(长连接)
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续保持连接等待其它的请求完成;
如何断开持久连接?
数量限制:获取100个资源后,断开连接
时间限制:可配置
持久连接的副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到响应;
折衷:使用较短的持久连接时间;httpd-2.4 支持毫秒级持久时间;
非持久连接:
持久连接的配置选项:
KeepAlive On|Off
MaxKeepAliveRequests #
KeepAliveTimeout #
测试持久连接特性,可以使用telnet命令
telnet HOST PORT
GET /URL HTTP/1.1
Host: HOSTNAME or IP
3、httpd的MPM模型
Multipath Process Module:多道处理模块
模型有prefork, worker, event
httpd-2.2不支持同时编译多个模块,所以只能编译源码时选定一个;rpm安装的包提供3个二进制程序文件,分别用于实现对不同MPM机制的支持;
确认方法:# ps aux | grep httpd
默认为/usr/sbin/httpd, 其使用prefork
查看静态编译的模块
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
查看静态编译及动态装载的模块
# httpd -M
更换使用的httpd程序的MPM模型:
编辑/etc/sysconfig/httpd文件指定 查找 #HTTPD=/usr/sbin/httpd.worker ,将其注释取消掉,重启服务生效;
prefork的配置:
102 <IfModule prefork.c>
103 StartServers 8 服务启动时启动的进程的数量,这个是工作进程,不包含主控进程
104 MinSpareServers 5 最少空闲进程数量
105 MaxSpareServers 20 最大空闲进程数量
106 ServerLimit 256 表示MaxClients允许的最大值
107 MaxClients 256 允许启动的最大服务器进程数,也就是同一时间的并发量
108 MaxRequestsPerChild 4000 服务器进程响应的最大请求数
109 </IfModule>
worker的配置: worker是多进程多线程模型
118 <IfModule worker.c>
119 StartServers 4 服务启动时启动的进程的初始数量
120 MaxClients 300 最大并发请求数
121 MinSpareThreads 25 保留备用的最小工作线程数
122 MaxSpareThreads 75 保留备用的最大工作线程数
123 ThreadsPerChild 25 每个进程的工作线程数量
124 MaxRequestsPerChild 0 每个进程服务的最大请求数
125 </IfModule>
UV: User View,也就是独立IP量;
4、DSO 动态共享对象
配置指令实现模块加载的格式如下:
LoadModule <mod_name> <mod_path>
其中,模块路径可使用相对地址,相对于ServerRoot(/etc/httpd)指向的路径而言的;
/etc/httpd/modules/
5、定义'Main' server的文档页面路径
DocumentRoot
文档路径映射表示DocumentRoot指向的路径为URL路径的起始位置;
比如:
DocumentRoot "/var/www/html"
如果想访问 http://HOST:PORT/test/index.html,那么对应的服务器上路径为/var/www/html/test/index.html
6、站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:可以通过如下的标签设置
<Directory ""> </Directory> 对某个目录控制
<File ""> </File> 对单个文件控制
<FileMatch ""> </FileMatch> 对匹配到的文件控制
URL路径:
<Location ""> </Location>
...
具体的访问控制机制:有基于来源ip地址和基于账号;
7、Directory中“基于来源地址”实现访问控制
(1) Options的取值有Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None, All
Indexes 索引;如果定义了Indexes,没有定义默认主页面,会403错误
FollowSymlinks 允许跟踪符号链接文件;
(2) 基于来源地址的访问控制机制
Order allow,deny 检查顺序,先检查允许的,后检查拒绝的,黑名单
Order deny,allow 白名单
Allow from
Deny from
来源地址可以有如下的形式:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8、定义默认主页面
DirectoryIndex index.html index.html.var
9、日志设定:包括错误日志和访问日志
错误日志的定义如下:
ErrorLog logs/error_log
LogLevel warn
日志级别: debug, info, notice, warn, error, crit, alert, emerg
访问日志的定义如下:
CustomLog logs/access_log combined combined表示日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h:客户端IP地址;
%l: Remote logname (from identd, if supplied). -表示为空;
%u: Remote user, (from auth; may be bogus if return status (%s) is 401);-表示为空
%t:Time the request was received (standard english format),服务器收到请求的时间;
%r:First line of request,请求报文的首行信息(method url version);
%>s: 响应状态码;
%b: 响应报文的大小,单位是字节,不包括响应报文首部;
%{Referer}i:请求报文当中"referer"首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来;
%{User-Agent}i:请求报文当中"User-Agent"首部的值;即发出请求用到的应用程序;
例如:
192.168.62.1 - - [11/Jul/2017:01:10:23 +0800] "GET / HTTP/1.1" 403 4954 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36"
详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10、路径别名的定义:
Alias /URL/ "/PATH/TO/SOMEDIR/"
例如定义别名如下:
Alias /bbs/ "/forum/htdocs/"
当访问http://www.magedu.com/bbs/index.html的时候,那么访问的就是/forum/htdocs/index.html文件
11、设定默认字符集
AddDefaultCharset UTF-8
GBK, GB2312, GB18030
12、基于用户的访问控制
认证质询:服务器响应WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;
认证:客户端http首部 Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源;
认证类型:有如下2种:
basic:明文
digest:消息摘要
安全域:需要用户认证后方能访问的路径;
应该通过名称对安全域进行标识,并用于告知用户认证的原因;
用户的账号和密码存储于何处?
虚拟账号:仅用于访问某服务时用到的认证标识;
存储:
文本文件
SQL数据库
ldap
nis
basic认证详解(分2步):
(1) 定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/etc/httpd/conf.d/.htpasswdfile" 该文件保存通过htpasswd命令生成的用户名和密码摘要
Require user username1 username2 ...
</Directory>
允许账号文件中的所有用户登录访问:Require valid-user
(2) 提供账号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
-m: md5加密用户密码;
-s: sha1加密用户密码;
-D: 删除指定用户
例如
htpasswd -c -m /etc/httpd/conf.d/.htpasswdfile Jerry
htpasswd -m /etc/httpd/conf.d/.htpasswdfile Tom
(3) 实现基于组进行认证
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/etc/httpd/conf.d/.htpasswdfile" 该文件保存通过htpasswd命令生成的用户名和密码摘要
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2 ...
</Directory>
要提供:用户账号文件和组文件;
组文件:每一行定义一个组
GRP_NAME:user1 user2 user3 ...
示例如下:
<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmin
</Directory>
13、虚拟主机
虚拟主机有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:为每个虚拟主机准备至少一个专用hostname;
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机,禁用中心主机可以注释httpd.conf文件中的DocumentRoot
每个虚拟主机都有专用配置:
<VirtualHost "IP:PORT">
SeverName
DocumentRoot "" 虚拟主机网页存放位置
ServerAlias: 虚拟主机的别名;
ErrorLog
CustomLog
<Directory "">
......
</Directory>
</VirtualHost>
示例1:基于ip,主机上必须有172.16.100.6和172.16.100.7的ip地址,必须先添加地址,可以使用ip addr add dev eth0 172.16.100.6/16 命令在网卡设备上添加新的ip地址
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
示例2:基于port, http.conf文件中必须要监听80和8080端口
<VirtualHost 172.16.100.7:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.7:8080>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
示例3:基于hostname,httpd.conf文件中的 NameVirtualHost *:80 必须开启(注意:httpd2.4是不需要开启NameVirtualHost *:80,httpd2.2是必须的)
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
CustomLog logs/web1_access_log
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
</VirtualHost>
14、内置的status页面 访问 http://192.168.62.149/server-status
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.62.149
</Location>
实现:基于账号实现访问控制status页面
15:curl命令详解
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
curl格式如下:
curl [options] [URL...]
curl的常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
elinks工具的格式:
elinks [OPTION]... [URL]...
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;
16 使用mod_deflate模块压缩页面优化传输速度
mod_deflate模块的适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
(2) 压缩适于压缩的资源,例如文件文件;
# httpd.conf文件中开启该模块
LoadModule deflate_module modules/mod_deflate.so
要使用mod_deflate模块,还必须设置http.conf文件中的输出过滤器(就是输出到网页中)为DEFLATE,设置格式如下:
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 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
17、https的配置
http over ssl = https 443/tcp
ssl: v3
tls: v1
SSL会话的简化过程:
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;
(2) 服务器端发送证书以及选定的加密方式给客户端;
(3) 客户端取得证书并进行证书验正:
如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上的数字签名;
(b) 验正证书的内容的合法性:完整性验正
(c) 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机要一致;
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
(5) 服务用此密钥加密用户请求的资源,响应给客户端;
具体过程参见下图:
回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)
配置httpd支持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]
例子:
假设192.168.62.149(172.16.100.9)为CA机构,
192.168.62.159(172.16.100.6)为服务器
1:登录192.168.62.149,创建私钥来创建私有CA
(umsk 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) 创建私钥文件cakey.pem
touch /etc/pki/CA/index.txt
echo 01 > /etc/pki/CA/serial
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 7300 创建自签证书cacert.pem
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:MageEdu Ltd
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.magedu.com
Email Address []:lv@gmail.com
2:登录192.168.62.159,生成证书签署请求
mkdir /etc/httpd/ssl 创建ssl目录
cd /etc/httpd/ssl 进入ssl目录
(umask 077; openssl genrsa -out /etc/httpd/ssl/httpd.key 1024) 生成服务器的私钥
openssl req -new -key /etc/httpd/ssl/httpd.key -out /etc/httpd/ssl/httpd.csr 使用上一步的私钥生成证书签署请求
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:MageEdu Ltd
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www.lvqinghe.com
Email Address []:eq@gmail.com
scp /etc/httpd/ssl/httpd.csr root@192.168.62.149:/tmp/ 将证书签署请求发送给CA,让CA签署
3:登录192.168.62.149 给服务器端发送过来的httpd.csr做签署
openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/www.lvqinghe.com.crt -days 365 签署,生成的证书为www.lvqinghe.com.crt
scp /etc/pki/CA/certs/www.lvqinghe.com.crt root@192.168.62.159:/etc/httpd/ssl/ 把证书传递到服务器端的/etc/httpd/ssl/目录下
4:登录192.168.62.159
httpd -M | grep ssl 查看是否支持ssl
yum -y install mod_ssl 安装ssl模块
/etc/httpd/conf.d/ssl.conf 这个文件是mod_ssl模块的配置文件
cd /etc/httpd/conf.d/
编辑ssl.conf 文件,内容如下:
Listen 443 https 监听在443端口
<VirtualHost *:443>
ErrorLog logs/ssl_error_log ssl错误日志
TransferLog logs/ssl_access_log ssl访问日志
LogLevel warn 日志级别
SSLEngine on SSL引擎
SSLCertificateFile /etc/httpd/ssl/www.lvqinghe.com.crt 证书文件
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key 私钥文件
DocumentRoot "/var/www/html"
ServerName www.lvqinghe.com:443
service httpd restart 重启服务
ss -tan | grep :443 查看是否监听了443端口
5:测试
登录192.168.62.149 做测试
openssl s_client -connect 192.168.62.159:443 -CAfile /etc/pki/CA/cacert.pem
18、httpd自带的工具程序
htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具;
apachectl:httpd自带的服务控制脚本,支持start, stop;
apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具;
rotatelogs:日志滚动工具;
access.log -->
access.log, access.1.log
access.log, access.1.log, access.2.log
suexec:
访问某些有特殊权限配置的资源时,临时切换至指定用户运行;
ab: apache benchmark
19、http压力测试工具
ab
webbench
http_load
jmeter
loadrunner
tcpcopy
ab [OPTIONS] URL
-n: 总的请求数
-c:模拟的并发数,同一时间发出的请求数量
-k: 以持久连接模式测试
ab -c 100 -n 10000 http://news.163.com/17/1024/12/D1GTEU5C0001899O.html
ulimit -n #: 调整当前用户所同时打开的文件数;
练习题:
1、建立httpd服务器,要求:
提供两个基于名称的虚拟主机:
(a)www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access;
(b)www2.stuX.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2.err,访问日志为/var/log/httpd/www2.access;
(c)为两个虚拟主机建立各自的主页文件index.html,内容分别为其对应的主机名;
(d)通过www1.stuX.com/server-status输出httpd工作状态相关信息,且只允许提供帐号密码才能访问(status:status);
2、为上面的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(Beijing)、城市(Beijing)和组织(MageEdu);
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com;
-------------------------华丽的分割线-------------------------------------------
http协议和httpd的配置
URL:Unifrom Resource Locator
URL的组成为如下3个:
URL方案:scheme
服务器地址:ip:port
资源路径:
例如: http://www.magedu.com:80/bbs/index.php
https://www.magedu.com:80/bbs/index.php
基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params参数 http://www.magedu.com/bbs/hello;gender=f
query http://www.magedu.com/bbs/item.php?username=tom&title=abc
frag https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html#ch-Boot-x86
相对URL
绝对URL
http协议:
有多个版本:http/0.9, http/1.0, http/1.1, http/2.0
http协议:stateless
服务器无法持续追踪访问者来源
所以通过cookie, session来确认某个请求来自于某个用户
服务器端只生成标识唯一用户的cookie,并发送给客户端,客户端下次访问时,在http首部带上该cookie,服务器端就能识别哪些请求来自于哪些用户。至于用户的浏览信息,购物车等等之类的私密信息可以保存在服务器端的session中。
http事务:包括请求和响应
请求:request
响应:response
request报文的格式如下:3部分组成,分别是首行,头部,实体
<method> <request-URL> <version>
<headers>
换行
换行
<entity-body>
response报文的格式如下:3部分组成,分别是首行,头部,实体
<version> <status> <reason-phrase>
<headers>
换行
换行
<entity-body>
method: 请求方法,标明客户端希望服务器对资源执行的动作,有GET、HEAD、POST,PUT等
version:
HTTP/<major>.<minor>
status: 响应状态码
三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况;
reason-phrase:
状态码所标记的状态的简要描述;
headers:请求报文和相应报文中都有
每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值;就是一些key:value
entity-body:
请求时附加的数据或响应时附加的数据
method(请求方法有哪些):
GET:从服务器获取一个资源;
HEAD:只从服务器获取文档的响应首部;
POST:向服务器发送要处理的数据;
PUT:将请求的实体部分存储在服务器上;
DELETE:请求删除服务器上指定的文档;
TRACE:追踪请求到达服务器中间经过的代理服务器;
OPTIONS:请求服务器返回对指定资源支持使用的请求方法;
协议查看或分析的工具:tcpdump, tshark, wireshark
status(状态码):
1xx:100-101, 信息提示;
2xx:200-206, 成功
3xx:300-305, 重定向
4xx:400-415, 错误类信息,客户端错误
5xx:500-505, 错误类信息,服务器端错误
常用的状态码:
200: 成功,请求的所有数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置; Found
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此状态码通知客户端;Not Modified
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway
headers详解:
格式:Name: Value
Cache-Control:public, max-age=600
Connection:keep-alive
Content-Type:image/png
Date:Tue, 28 Apr 2015 01:43:54 GMT
ETag:"5af34e-ce6-504ea605b2e40"
Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT
Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:access.redhat.com
If-Modified-Since:Wed, 08 Oct 2014 14:46:09 GMT
If-None-Match:"5af34e-ce6-504ea605b2e40"
Referer:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36
首部的分类:
通用首部
请求首部
响应首部
实体首部
扩展首部
通用首部:
Date: 报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点
Cache-Control:控制缓存 比如 no-cache,max-age
Pragma:比如 no-cache
请求专用首部:
Accept:通知服务器自己可接受的媒体类型;
Accept-Charset:
Accept-Encoding:接受编码格式,如gzip
Accept-Language:接受的语言
Client-IP:
Host: 请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源;
User-Agent:客户端代理
条件式请求首部:(主要和缓存系统有关)
Expect:
If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改;
If-Unmodified-Since:自从指定的时间之后,请求的资源是否没发生过修改;
If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配;
If-Match:
安全请求首部:
Authorization:向服务器发送认证信息,如账号和密码;
Cookie: 客户端向服务器发送cookie
Cookie2:
代理请求首部:
Proxy-Authorization: 向代理服务器认证
响应首部:信息性+协商+安全响应+认证表单
信息性:
Age:响应持续时长
Server:服务器程序软件名称和版本
协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其它首部列表;
安全响应首部:
Set-Cookie:向客户端设置cookie;
Set-Cookie2:
WWW-Authenticate:来自服务器的对客户端的质询认证表单
实体首部:用来描述报文中的实体的属性
Allow: 列出对此实体可使用的请求方法
Location:告诉客户端真正的实体位于何处
Content-Encoding:
Content-Language:
Content-Length: 实体的长度
Content-Location: 实体真正所处位置;
Content-Type:实体的对象类型
缓存相关:
ETag:实体的扩展标签;
Expires:实体的过期时间;
Last-Modified:最后一次修改的时间
评论
发表评论