基于 C/S 架构
传输层协议: TCP,UDP,SCTP
IANA:
0-1023 :
众所周知,永久地分配给固定的应用使用,特权端口;
1024-41951 :
注册端口,但是要求不是特别严格,分配给程序注册某应用使用; 3306/tcp ...
41952+ :
客户端程序随机使用的端口,因此称为动态端口,或私有端口;其范围定义在 /proc/sys/net/ipv4/ip_local_port_range 中
cat /proc/sys/net/ipv4/ip_local_port_range
3276861000
BSN Socket :
IPC的一种实现,允许位于不同主机(也可以是同一主机)上的进程之间进程通信;
Socket API(封装了内核中的socket通信相关的系统调用)
SOCK_STREAM : tcp 套接字
SOCK_DGRAM : UDP 套接字
SOCK_RAW :raw套接字
根据套接字所使用的地址格式:Socket Domain:
AF_INET : Address Family,IPV4地址
AF_INET6 : IPV6
AF_UNIX : 同一主机上的不同进程间基于socket套接字通信使用的一种地址;Unix_SOCK
TCP FSM : 有限状态机
CLOSE;LISTEN;SYN_SENT;SYN_RECV;ESTABLISHEN;FIN_WAIT1;CLOSE_WAIT1;FIN_WAIT2;LAST_ACK;TIMEWAIT;CLOSED
tcp协议的特性:
建立连接 : 三次握手
将数据打包成段 : 校验和(CRC32)
确认,重传及超时
排序 : 逻辑序号
流量控制 : 滑动窗口算法
拥塞控制 : 慢启动和拥塞避免算法
http : hyper text transfer protocol,应用层协议,80/tcp
html : hyper text mark language,编程语言,超文本标记语言
工作模式:
http请求报文 : http request
http响应报文 : http response
一次http事务 : 请求 <--> 响应
web资源 : web resource
静态资源
动态资源
一次完整的http请求处理过程
(1) 建立或处理连接:接受请求或拒绝请求
(2) 接收请求:就收来自于网络上的主机请求报文中对某特定资源的一次请求的过程
(3) 处理请求 : 对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息
(4) 访问资源:获取请求报文中请求的资源
(5) 构建响应报文
(6) 发送响应报文
(7) 记录日志
接收请求的模型:
并发访问响应模型:
单进程I/O模型:启动一个进程处理用户请求,这意味着,一次只能处理一个请求,多个请求被串行响应
多进程I/O结构:并行启动多个进程,每个进程响应一个请求
复用的I/O结构: 一个进程响应n个请求
多线程模式:一个进程生成n个线程,一个线程处理一个请求
事件驱动(event-driven):一个进程直接响应n个请求
复用的多进程I/O结构:启动(m)个进程,每个进程生成(n)个线程
响应的请求的数量: m*n
处理请求:分析请求报文的http首部
http协议:
http 请求报文首部
http 响应报文首部
访问资源:获取请求报文中请求的资源
web服务器,即存放了web资源的主机
web服务器的资源路径映射方式:
(1)docroot
(2)alias
(3)虚拟主机的docroot
(3)用户家目录的docroot
http请求处理中的连接模式:
保存连接(长连接):keep-alive
时间:
数量:
非保持连接(短连接):
http 服务器程序:
httpd(apache)
nginx
lighttpd
应用程序服务器:
IIS: .NET
tomcat: .jsp
httpd的安装和使用:
ASF : apache software foundation
httpd : apache :a patchy server
httpd的特性:
高度模块化:core+modules
DSO : dynamic shared object
MPM : Multipath processing Modules(多路处理模块)
prefork : 多进程模型,每个进程响应一个请求
一个主进程:负责生成子进程及回收子进程;负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
n个子进程:每个子进程处理一个请求
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求,最大空闲和最小空闲
worker:多进程多线程模型,每个线程处理一个用户请求
一个主进程:负责生成子线程;负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
多个子进程:每个子进程负责生成多个线程
每个线程:负责响应用户请求
并发响应数量:m(子进程数量)*n(每个子进程所能创建的最大线程数量)
event:事件驱动模型;多进程模型,每个进程响应多个请求
一个主进程:负责生成子线程;负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
子进程:基于事件驱动机制直接响应多个请求
httpd 2.2 :仍为测试使用模型
httpd 2.4 :even可生产环境中使用
httpd的程序版本:
httpd 1.3 :官方已经停止维护
httpd 2.0
httpd 2.2
httpd 2.4 :目前最新稳定版
httpd的功能特性:
CGI : Common Gateway Interface
虚拟主机: IP,PORT,FQND
反向代理: http,ajp,fcgi,wsgi,...
负载均衡: bytraffic,byrequest,bybusiness
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块
...
http协议和httpd的配置
URL:Unifrom Resource Locator
URL方案:scheme
服务器地址: ip:port
资源路径
基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params: 参数 http://nineven.com/bbs/xixi;gender=ok
query:查询字符串 http://nineven.com/bbs/xixi.php?username=xi&title=z
frag: 页面锚定符 http://nineven.com/bbs/yu.html#ok
相对URL
绝对URL
HTTP协议: http/0.9,http/1.0,http/1.1,http/2.0
http协议:stateless 无状态的
服务器无法持续追踪访问者来源
cookie ,session
http事务
请求:request
响应:response
报文语法格式:
request报文:
<method><request-URL> <version>
<headers>
<entity-body>
response报文:
<version> <status code><reason-phrase>
<headers>
<entity-body>
method : 请求方法,表明客户端希望服务器对资源执行的动作
GET,HEAD,POST
version:
HTTP/<major>,<minor>
status:
三位数字,如 200,301,302,404,502,标记请求处理过程中发生的情况
reason-phrase:
状态码所标记的状态的简要描述
headers:
每个请求或响应报文可包含任意个首部,每个首部都有首部名称,后面跟上一个可选空格,接着是一个值
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
首部的分类:
通用首部
请求首部
响应首部
实体首部
扩展首部
通用首部:
Date : 报文的创建时间
Connection :连接状态,如keep-alive,close
Via :显示报文经过的中间节点,报文传输经过的的中间代理服务器
Cache-Control :控制缓存功能,定义缓存控制机制
Pragma:
请求首部:
Accept :通知服务器自己可接受的媒体类型
Accept-Charset :接受的字符集格式
Accept-Encoding :接受编码格式,如gzip
Accept-Language :接受的语言
Clinet-IP :客户端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 : 最后一次修改的时间
安装httpd:
rpm包
编译安装:定制新功能,或其他原因(不建议在生产环境使用)
centos 6:
程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件: /etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日志文件:
/var/log/httpd:
access_log:访问日志
error_log:错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
服务控制和启动:
chkconfig httpd on
service httpd {start|stop|restart|status}
centos 7:
程序环境:
配置文件:
/etc/httpd/httpd.conf
/etc/httpd/conf.d/*.conf
模块相关的配置文件:/etc/httpd/conf.models.d/*.conf
systemd unit file:
/usr/lib/systemd/system/httpd.service
主程序文件:
/usr/sbin/httpd
httpd2.4支持MPM的动态切换
日志文件:
/var/log/httpd:
access_log:访问日志
error_log:错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
服务控制和启动:
systemctl enable httpd.server
systemctl {start|stop|restart|status} httpd.service
httpd 2.2的常用的配置:
主配置文件: /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
配置格式:
directive value
directive : 不区分字符大小写
value : 为路径时,是否区分字符大小写,取决于文件系统
常用配置:(操作之前请先备份)(cp -v httpd.conf{,.bak})
1,修改监听的ip和端口
LISTEN [IP:]PORT
(1) 省略ip表示为0.0.0.0
(2) LISTEN指令可重复出现多次
LISTEN 80
LISTEN 8088
(3) 修改监听socket,重启服务进程方可生效
netstat -tunlp 查看监听端口进程pid;ip
2,持久连接
Persistent Conneciton : tcp 连接建立后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求的进行
如何断开?
数量限制
时间限制
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常的响应
折中:使用较短的持久连接时长,以及较少的请求数量
KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100
测试:
telnet ip port
GET /index.html HTTP/1.1
Host: IP
连续回车两次
[root@localhost ~]# telnet 192.168.153.149 80
Trying 192.168.153.149...
Connected to 192.168.153.149.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host: 192.168.153.149
HTTP/1.1 200 OK
Date: Mon, 26 Sep 2016 14:02:59 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Mon, 26 Sep 2016 14:02:47 GMT
ETag: "40372-3-53d6995391aee"
Accept-Ranges: bytes
Content-Length: 3
Connection: close
Content-Type: text/html; charset=UTF-8
ok
Connection closed by foreign host.
3,MPM
httpd 2.2 不支持同时编译多个MPM模块,所以只能编译选定要使用的那个模块;centos 6的rpm包为此专门提供了三个应用程序文件,httpd(perfork),httpd.worker,httpd.event,分别用于实现对不同的MPM机制的支持
确认现在使用的是哪个程序文件的方法:
ps aux | grep httpd
httpd -l
默认使用的为/usr/sbin/httpd , 其为prefork的MPM模块;
查看httpd程序的模块列表:
查看静态编译的模块:
httpd -l
查看静态编译及动态编译的模块:
httpd -M
更换使用的httpd程序,以支持其他MPM机制:
编辑配置文件: /etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}
注意:重启服务方可生效
MPM 配置:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
PV,UV
PV:page view
UV:user view
4,DSO
配置指定实现模块加载
LoadModule <mod_name> <mod_path>
模块路径可以使用相对路径
相对于ServerRoot(默认为 /etc/httpd)
5,定义'Main' server 的文档页面路径
DocumentRoot ""
文档路径映射:
DocumentRoot指向的路径为URL的起始位置
相当于站点的URL的跟路径
6,站点访问控制的常见机制:
可基于两种机制指明对哪些资源进行何种访问控制:
文件系统路径
<Directory "">
...
</Directory>
<File "">
...
</File>
<FileMath "PATTERN">
...
</FileMatch>
URL路径:
<Location "">
...
<Location>
<LocationMatch "">
...
</LocationMatch>
<Directory>中"基于源地址"实现访问控制
(1) Options
后跟一个或多个空白字符分割的"选项"列表;
Indexes:指定的URL路径下不存在与定义的主页面资源相符的资源文件时,就返回索引列表给用户(危险)
FollowSymLinks:允许跟踪符号链接文件所指向的源文件(危险)
None: 所有都没有
All:所有都允许
(2) AllowOverride(建议禁止,因为开启后影响性能)
与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中
All :
None :
(3)order 和allow,deny
order:定义生效次序,写在后面的表示默认法则
Allow from,Deny from
来源地址:
IP
NetAddr:
172.168
172.168.0.0
172.168.0.0/16
仅允许172.168网段访问: Allow from 172.168
7,定义站点主页面:
DirectoryIndex index.html index.html.var
8,定义路径别名
DocumentRoot "/www/htdocs"
Alias /download/ "/rpms/pub/"
http://nineven.com/download/xixi.jpg
/rpms/pub/xixi.jpg
定义格式:
Alias /URL/ "/PATH/TO/SOMEDIR/"
当访问/URL/路径时,会自动访问/PATH/TO/SOMEDIR/
9,设定默认字符集
AddDefaultCharset UTF-8
中文字符集: GBK,GB2312,GB18030
10,日志设定
日志类型:访问日志和错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn:
debug, info, notice, warn, error, crit,alert, emerg.
访问日志:
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%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 :响应状态码;
%b :响应报文的大小,单位是字节,不包括响应报文的http首部
%{Referer}i :请求报文中首部"referer"的值,即从哪个页面中的超链接跳转至当前页面
%{User-Agent}i :请求报文中首部"User-Agent"的值,即发出请求的应用程序
11,基于用户的访问控制
认证质询:
WWW-Authernticate:响应吗为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文,认证通过时,则服务器发送响应的资源
认证方式有 两种:
basic :明文
digest :消息摘要认证
安全域:需要用户认证后方能访问路径,应该通过名称对其进行标识,以便于告知用户认证的原因
用户的账号和密码存放在何处?
虚拟账号:仅用于访问某服务是用到的认证标识
存储:
文本文件
SQL数据库
ldap目录存储
basic认证配置示例:
(1)定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 ... #仅允许登录
</Directory>
允许账号文件中的所有用户登录访问
Require valid-user
(2)提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /path/to/passwdfile username1
-c :自动创建此处指定的文件,因此,仅应该在此文件不存在时使用
-m :md5格式加密
-s :sha格式加密
-D :删除指定用户
另外:基于组账号进行认证;
httpd -t 检查配置文件是否正确
(1)定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require group grpname1 grpname2 ... #仅允许登录
AuthGroupFile "path/to/groupfile"
</Directory>
(2)创建用户账号和组账号文件
组文件:每一行定义一个组
GRP_NAME:username1 username2
12,虚拟主机
站点的标识:socket
ip相同,但端口不同
ip不同,但端口均为默认端口
FQDN不同:
请求报文首部
Host :www.nineven.com
有三种实现方案:
基于ip:
为每个虚拟主机准备至少一个ip地址
基于port:
为每个虚拟主机使用至少一个独立的port
基于FQDN:
为每个虚拟主机使用至少一个PQDN
注意:一般虚拟机不要与主机混用,因此,要使用虚拟主机,得先禁用'main'主机
禁用方法:注释中心主机的DocumentRoot指令即可
虚拟主机的配置方法;
<VirtualHost IP:PORT>
ServerName FQDN
DocumentRoot ""
</VirtualHost>
其他可以指令:
ServerAlias :虚拟主机的别名,可多次使用
ErrorLog:
CustomLog:
<Directory "">
...
</Directory>
Alias
...
基于ip的虚拟主机示例:
<VirtualHost 192.168.153.136:80>
ServerName www.nineven.com
DocumentRoot "/www/nineven/htdocs"
</VirtualHost
<VirtualHost 192.168.153.137:80>
ServerName xixi.nineven.com
DocumentRoot "/www/xixi/htdocs"
</VirtualHost
基于port的虚拟主机示例:
LISTEN 8080
LISTEN 808
<VirtualHost 192.168.153.136:8080>
ServerName www.nineven.com
DocumentRoot "/www/nineven/htdocs"
</VirtualHost
<VirtualHost 192.168.153.136:808>
ServerName xixi.nineven.com
DocumentRoot "/www/xixi/htdocs"
</VirtualHost
基于FQDN的虚拟主机:
NameVirtualHost 192.168.153.136:80
<VirtualHost 192.168.153.136:80>
ServerName www.nineven.com
DocumentRoot "/www/nineven/htdocs"
</VirtualHost
<VirtualHost 192.168.153.136:80>
ServerName xixi.nineven.com
DocumentRoot "/www/xixi/htdocs"
</VirtualHost
13,status 页面
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order deny,allow
Allow from all
</Location>
14, curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET,DICT,FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST,PUT,等方法,FTP上传,kerberos认证,HTTP上传,代理服务器,cookie,用户/密码认证,下载文件断点续传,上载文件断点续传,http代理服务器管道(proxy tunneling),甚至它还支持IPV6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大。
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]> 设置服务器的用户和密码
-O/--http 1.0 使用HTTP 1.0
elinks
elinks [options]...[URL]
-dump : 直接标准输出
15, user/group
指定以哪个用户的身份来运行httpd服务进程
User apache
Group apache
16,使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1)节约带宽,额外消耗CPU,同时,可能有些较;老的浏览器不支持
(2) 压缩适于压缩的资源,例如文本文件
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
BrowserMath ^Mozilla/4 gzip-only-text/html
#Netscape 4.06-4.08 have some more problems
BrowserMath ^Mozilla/4\.0[678] no-gzip
#MSIE masquerades as Netscape,but it is fine
BrowserMath \bMSI[E] !no-gzip !gzip-only-text/html
17 httpds,http over ssl
SSL 会话的简化过程
(1) 客户端发送可供选择的加密方式,并向服务器请求证书
(2) 服务器端发送证书以及选定的加密方式给客户端
(3) 客户端获取证书后并进行证书的验证
如果信任给其发证书的CA
(a) 验证证书来源的合法性,用CA的公钥解密证书上的数字签名
(b) 验证证书的内容的合法性,完整性验证
(c) 检查证书的有效期限
(d) 检查证书是否被吊销
(e) 证书用拥有者的名字,与访问的目标主机要一致
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
(5) 服务器用此密钥加密用户请求的资源,响应给客户端
注意:SSL会话是基于IP地址创建,所以单IP的主机上,仅可以使用一个https虚拟主机
配置httpd支持https
(1)为服务器申请数字证书
测试:通过私建CA证书
(a) 创建私有CA
(b) 在服务器创建证书签署请求
(c) CA签证
(2) 配置httpd支持使用ssl,及使用的证书
yum install -y 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]
CA:
cd /etc/pki/CA
(umast 077;openssl genrsa -out private/cakey.pem 2048)
openssl req -new -x509 -key private/cakey.pem -out cacert.pem
CN
Beijing
Beijing
nineven
ops
ca.nineven.com
caadmin@nineven.com
touch serial index.txt
echo 01 > serial
web:
cd /et/httpd/
mkdir ssl
cd ssl
(umast 077;openssl genrsa -out httpd.key 1024)
openssl req -new -key htpd.key -out httpd.csr
CN
Beijing
Beijing
nineven
ops
www.nineven.com
webadmin@nineven.com
回车
回车
scp httpd.csr ca:/tmp/
ca:
openssl ca -in /tmp/httpd.csr -out certs/httpd.crt
scp certs/httpd.crt web:/etc/httpd/ssl
web:
yum -y install mod_ssl
cd /etc/httpd/conf.d/
vim ssl.conf
DocumentRoot
SeverName
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
httpd -t
systemctl restart httpd
3) 测试基于https访问相应的主机
openssl s_client [-connect host:port] [-cert filename][-CApath directory][-CAfile filename]
openssl s_clinet -connect www.nineven.com:443 -CAfile /etc/pki/CA/cacert.pem
18,http自带的工具程序
htpasswd : basic 认证基于文件实现,用到的账号密码文件生成工具
apachectl : httpd自带的服务控制脚本,支持start和stop
apxs : 由 httpd-devel包提供,扩展httpd使用第三方模块的工具
rotatelogs : 日志滚动工具
suexec : 访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行
ab : apache bench :压力测试工具
19, httpd的压力测试工具
命令行: ab,webbench,http_load,
图形: jmeter,loadrunner
tcpcopy :网易开源了,复制生产环境中的真实请求,并将之保存下来
ab [options] [https|http]://]hostname[:port]/path
请求数:-n requests
并发数: -c concurrency
长连接:-k
http2.4
新特性
(1)MPM支持运行DSO机制,以模块需求动态加载
(2)event MPM生产环境可用
(3)异步读写机制
(4)支持每模块及每目录的单独日志级别的定义
(5)每请求相关的专用配置
(6)增强版的表达式分析式
(7)毫秒级持久连接时长定义
(8)基于FQDN的虚拟主机也不需要NameVirtualHost指令
(9)新指令,AllowOverrideList;
(10)支持用户自定义变量
(11)更低的内存消耗
新模块
(1)mod_proxy_fcgi
(2)mod_proxy_scgi
(3)mod_remoteip
安装httpd2.4
依赖于apr1.4,apr-util 1.4
apr: apache protable runtime
开发环境包组
Development Tools , Server Platform Development
开发程序包
pcre-devel
编译安装步骤
(1)apr-1.4+
(2)apr-util-1.4+
(3)httpd-2.4
./configure --prefix=/usr/local/apache24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
配置应用:
(1) 切换使用的MPM
编辑配置文件 /etc/httpd/conf.modules.d/00-mom.conf
(2) 基于IP的访问控制
允许所有主机访问 :Require all granted
拒绝所有主机访问 :Require all deny
控制特定的IP访问:
Require ip IPADDR : 授权指定来源的IP访问
Require not ip IPADDR : 拒绝指定的IP访问
控制特定的主机访问:
Require host HOSTNAMEE : 授权指定的主机访问
Require not host HOSTNAME : 拒绝指定的主机访问
HOSTNAME:
FQND : 特定的主机
domain.tld : 指定域名下的所有主机
<RequireAll>
Require all granted
Require not ip 172.16.100.2
</RequireAll>