如果你的网站访问量不是非常大,很轻量级,那么单独放在一台服务器上对服务器来说是一种浪费,电费也会很多,所以有了虚拟主机这个问题就可以解决了,虚拟主机可以实现一台主机维护多个网站。

有三种实现方案:
    基于ip:为每个虚拟主机准备至少一个ip地址;
    基于port:为每个虚拟主机准备至少一个专用port;实践中很少使用;
    基于hostname:为每个虚拟主机准备至少一个专用hostname;
    可混合使用上述三种方式中任意方式;

注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机:注释DocumentRoot

实现机制:请求报文中封装了我们在浏览器中键入的主机名,服务器接收到请求后解封装会拿到这个主机名用于虚拟主机之间对应
    每个虚拟主机都有专用配置:
    <VirtualHost "IP:PORT">
    SeverName
    DocumentRoot ""
    </VirtualHost>

    ServerAlias: 虚拟主机的别名;
    ErrorLog
    CustomLog
    <Directory "">
    </Directory>

案例一:虚拟主机实现

1.基于ip的虚拟主机:

禁用中心主机:注释DocumentRoot

httpd虚拟主机,压缩机制,https实现,压力测试_MPM

更改配置文件:

httpd虚拟主机,压缩机制,https实现,压力测试_MPM_02

创建页面文件存放目录:

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_03

创建页面文件:

httpd虚拟主机,压缩机制,https实现,压力测试_https_04

2.基于端口的虚拟主机:

httpd.conf文件:

httpd虚拟主机,压缩机制,https实现,压力测试_MIME_05

创建页面文件:

httpd虚拟主机,压缩机制,https实现,压力测试_https_06

3.基于主机名的虚拟主机:

修改配置文件:(httpd2.2需要启用NameVirtualHost   httpd2.4不需要)

httpd虚拟主机,压缩机制,https实现,压力测试_https_07

注意上下IP地址应该对应

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_08

重载httpd服务测试

修改/etc/hosts文件:

httpd虚拟主机,压缩机制,https实现,压力测试_https_09

测试发现成功:

httpd虚拟主机,压缩机制,https实现,压力测试_MIME_10
对于虚拟主机自定义日志文件存放位置:

httpd虚拟主机,压缩机制,https实现,压力测试_MIME_11

重启服务后发现生成了虚拟主机各自的日志文件:

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压力测试_12

配置内置的status页面

httpd虚拟主机,压缩机制,https实现,压力测试_https_13

发现输出了主机信息:(这种做法不安全) 可以定义在中心主机上也可以定义在虚拟主机中

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压力测试_14

可以开启更详细的status信息:

配置文件中将#ExtendedStatus On注释去掉

下面,我们来介绍一个很好用的工具-----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 [options] [URL...]
    curl的常用选项:
    -A/--user-agent <string> 设置用户代理发送给服务器

伪装浏览器访问网站:

httpd虚拟主机,压缩机制,https实现,压力测试_MPM_15

查看日志:发现伪装浏览器成功

httpd虚拟主机,压缩机制,https实现,压力测试_MPM_16

    -basic 使用HTTP基本认证
    --tcp-nodelay 使用TCP_NODELAY选项
    -e/--referer <URL> 来源网址

伪装来源网址访问

httpd虚拟主机,压缩机制,https实现,压力测试_https_17

    --cacert <file> CA证书 (SSL)
    --compressed 要求返回是压缩的格式
    -H/--header <line>自定义首部信息传递给服务器
    -I/--head 只显示响应报文首部信息

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压力测试_18

    --limit-rate <rate> 设置传输速度
    -u/--user <user[:password]>设置服务器的用户和密码
    -0/--http1.0 使用HTTP 1.0   


案例二:httpd实现传输数据压缩

使用mod_deflate模块压缩页面优化传输速度
适用场景:
    (1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;CPU空闲比例较大时使用,最好只压缩纯文本格式文档,图片压缩性价比不高
    (2) 压缩适于压缩的资源,例如文件文件;
压缩过滤器:SetOutputFilter DEFLATE----指定对那些MIME类型压缩(MIME机制实现了http协议可以传输非文本数据,中间会经过MIME把非文本数据转换为文本数据,把文本数据转换为非文本数据)

    # mod_deflate configuration
       
    # Restrict compression to these MIME types-----指定对那些MIME类型压缩
    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   定义火狐浏览器4使用gzip压缩,但仅压缩文本格式数据            
    # 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    定义老版本IE不压缩(不支持)


实验:

创建测试页面并修改权限:

httpd虚拟主机,压缩机制,https实现,压力测试_MPM_19

配置httpd.conf文件设定压缩属性

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_20

需要有deflate模块支持压缩

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压力测试_21

重载httpd服务后请求页面发现报文中content-Encoding类型是gzip,说明压缩了

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_22

使用curl命令输出相应头部信息,观察Content-length两次的变化,从7097变成了800,压缩成功

httpd虚拟主机,压缩机制,https实现,压力测试_MIME_23

案例三:https(较高并发场景下使用https会占用带宽,影响CPU性能)
https其实就是http+ssl实现安全传输的一种协议,使用tcp443端口,ssl在之前的博客中有讲解,这里不再缀余。

    SSL会话的简化过程
        (1) 客户端发送可供选择的加密方式,并向服务器请求证书;
        (2) 服务器端发送证书以及选定的加密方式给客户端;
        (3) 客户端取得证书并进行证书验正:
    如果信任给其发证书的CA:
        (a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
        (b) 验正证书的内容的合法性:完整性验正
        (c) 检查证书的有效期限;
        (d) 检查证书是否被吊销;
        (e) 证书中拥有者的名字,与访问的目标主机要一致;
    (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
    (5) 服务用此密钥加密用户请求的资源,响应给客户端;
    注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;

    配置httpd支持https:
        (1) 为服务器申请数字证书;
            测试:通过私建CA发证书
            (a) 创建私有CA

            #touch index.txt
            # echo 01 > serial

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压力测试_24

            创建CA证书:

httpd虚拟主机,压缩机制,https实现,压力测试_MIME_25

            (b) 在服务器创建证书签署请求

            生成私钥:

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压力测试_26

            生成请求:

httpd虚拟主机,压缩机制,https实现,压力测试_MPM_27

            请求发送到CA服务器:

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_28

            (c) CA签证

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压力测试_29

            查看并发送签署好的证书给客户端

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_30

        (2) 配置httpd支持使用ssl,及使用的证书;
            # yum -y install mod_ssl
            配置文件:/etc/httpd/conf.d/ssl.conf
                DocumentRoot
                ServerName
                SSLCertificateFile
                SSLCertificateKeyFile

ssl.conf文件配置:

httpd虚拟主机,压缩机制,https实现,压力测试_https_31

SSLCertificateFile /etc/pki/tls/certs/localhost.crt给客户端发的证书的位置

SSLCertificateKeyFile /etc/pki/tls/private/localhost.key与这个证书所匹配的私钥

        重启httpd查看443端口已被占用:

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_32

        (3) 测试基于https访问相应的主机;
        # openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile                     filename]

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压力测试_33

使用windows测试:将CA的证书cacert.pem发送到windows主机上重命名为cacert.crt双击安装证书

注意通过IP地址访问还是会报错,因为会检查证书内容中额主机名和是否正确

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压力测试_34

修改hosts文件,通过域名访问:

httpd虚拟主机,压缩机制,https实现,压力测试_MIME_35

这样报错的问题就解决了

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_36

上面的disuz是作者之前做实验安装的,此处仅用来测试


其他的命令,提供一些小功能:

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:
    访问某些有特殊权限配置的资源时,临时切换至指定用户运行;


案例四:压力测试

http压力测试工具
    ab
    webbench
    http_load
    jmeter
    loadrunner
    tcpcopy:保存生产环境中流量到一个文件,可以实现压力重放
    

    ab [OPTIONS] URL
        -n: 总的请求数
        -c:模拟的并发数(多个用户同时请求),每个并发都需要一个套接字文件

        -k: 以持久连接模式测试
    ulimit -n #: 调整当前用户所同时打开的文件数;在模拟的并发较多时经常需要调整,默认每个用户只能打开1024个文件

例:使用100个并发生成10000个请求测试

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_37

httpd虚拟主机,压缩机制,https实现,压力测试_httpd压缩机制_38

上面的两个time per second分别代表:第一个是10000个请求中每100个同时完成经过的时间取平均值

第二个是每个请求的响应速度

Concurrency level:并发数

每个请求时间

transfer rate * 8 是带宽需求,此处大概是5.8M

connection times是统计的相关连接建立时间,处理请求,发送响应报文耗时相关信息,total指完整请求耗时

min:最短 mean:平均 max:最长

这里测试结果是满载测试结果,但是生产环境中不可能满载,所以仅供参考