httpd-2.2(2)

 

14 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服务器等等,功能十分强大。

 

 

MIME:多用途互联网,主类型/次类型,p_w_picpath/png p_w_picpath/gif

 

curl [options] [URL...]

[root@y7s1 CA]# curl www.a.com

[root@yph7s conf.d]# tail -1 /var/log/httpd/access_log

172.16.59.1 - - [18/Jan/2016:11:12:23 -0500] "GET / HTTP/1.1" 403 202 "-" "curl/7.29.0"

 

 

curl的常用选项:

-A/--user-agent <string> 设置用户代理发送给服务器,例如伪装成IE6

[root@y7s1 CA]# curl -A IE6 http://172.16.59.3/index.html

[root@yph7s conf.d]# tail -1 /var/log/httpd/access_log

172.16.59.1 - - [18/Jan/2016:11:42:36 -0500] "GET /index.php HTTP/1.1" 200 - "-" "IE6"

 

--basic 使用HTTP基本认证需要提供账号和密码,如下

-u/--user <user[:password]>设置服务器的用户和密码

 

--tcp-nodelay 使用TCP_NODELAY选项

-e/--referer <URL> 来源网址,可以伪装成某网页跳转来的

[root@y7s1 CA]# curl -A IE6 -e 'www.a.com' http://172.16.59.3/index.html

172.16.59.1 - - [18/Jan/2016:11:31:04 -0500] "GET /index.html HTTP/1.1" 403 212 "www.a.com" "IE6"

 

--cacert <file> CA证书 (SSL)

--compressed 要求返回是压缩的格式,发过来压缩格式,浏览器再解压缩

-H/--header <line>自定义首部信息传递给服务器

-I/--head 只显示响应报文首部信息,请求首部和响应首部,

[root@y7s1 CA]# curl -I -A IE6  http://www.a.com/index.php

HTTP/1.1 200 OK  --------http协议版本,响应码:200为成功,OK;也可能是,403 Forbidden

Date: Mon, 18 Jan 2016 16:42:36 GMT  -------访问时间

Server: Apache/2.4.6 (CentOS) OpenSSL/1.0.1e-fips mod_fcgid/2.3.9 PHP/5.4.16 ---参与响应的服务器应用程序的种类和版本

last-Modified:服务器上一次修改的时间

ETag:扩展标签,扩展标记,可用于缓存

X-Powered-By: PHP/5.4.16

Content-Type: text/html; charset=UTF-8   ---内容类型,如果为图片,浏览器就会调用图片查看器显示,调用mp3;或者浏览器的插件显示图片。例如看视频安装flash。

 

--limit-rate <rate> 设置传输速度,下载限速

-0/--http1.0 使用HTTP 1.0版本协议,默认1.1版本

 

elinks 

全屏的文本浏览器,会过滤掉图片,只显示文本

[root@y7s1 CA]# elinks http://www.a.com ---进入全屏,浏览模式

 

-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;

[root@y7s1 CA]# elinks -dump  http://www.a.com

 

wget

lftpget

 

 

15、运行服务的用户和组

 

自己编译安装时,若没有指定应用程序的运行用户,系统就默认以daemon这个用户的身份运行。

 

指定以哪个用户的进程运行httpd服务进程

[root@yph7s conf.d]# vim /etc/httpd/conf/httpd.conf

User apache ---以apache用户身份

Group apache ---以apache组身份

 

小于1023的端口比如80端口,只有管理员能启动,管理员以root身份创建主控进程,主控进程创建诸多子进程运行响应用户请求,但这子些进程使用非管理员身份运行,防止被劫持,滥杀无辜。httpd子进程以apache用户身份运行。

但如果apache用户对某些资源无访问权限,就不能访问资源。客户端就无法访问。一些机制是给系统用户增加SUID,但是非常危险,风险很大。

SUexec:在运行指定程序时,将其切换成其他用户身份。类似SUID的机制(以程序文件的属主身份运行程序)

 

下面是httpd进程的主控进程和子进程

[root@yph7s conf.d]# ps aux |grep httpd

root       3818  0.0  1.5 408268 15556 ?        Ss   11:42   0:00 /usr/sbin/httpd -DFOREGROUND

apache    3819  0.0  0.4 258716  4168 ?        S    11:42   0:00 /usr/sbin/httpd -DFOREGROUND

apache    3821  0.0  0.9 410616  9632 ?        S    11:42   0:00 /usr/sbin/httpd -DFOREGROUND

 

 

16使用mod_deflate模块压缩页面优化传输速度,节约带宽,用时间换空间

 

适用场景:

(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;

(2) 压缩适于压缩的资源,例如文件文件;jpg,mp3本来就是压缩的,再压缩不会有多大效果,反而增加cpu负担

 

 

SetOutputFilter DEFLATE设置输出过滤器,过滤掉不适合压缩的去掉添加适合保留的

# mod_deflate configuration

# Restrict compression to these MIME types

AddOutputFilterByType DEFLATE text/plain 文本格式, 存文本, 根据内容类型执行过滤

AddOutputFilterByType DEFLATE text/html 文本格式,html

AddOutputFilterByType DEFLATE application/xhtml+xml 应用程序格式

AddOutputFilterByType DEFLATE text/xml  文本中的xml格式

AddOutputFilterByType DEFLATE application/xml  应用程序中的xml格式

AddOutputFilterByType DEFLATE application/x-javascript 

AddOutputFilterByType DEFLATE text/javascript 文本中的js文件

AddOutputFilterByType DEFLATE text/css 级联样式表

上面是过滤后能被压缩的,添加到过滤器上

 

# Level of compression (Highest 9 - Lowest 1)

DeflateCompressionLevel 9  ----指明压缩级别,9压缩比最高,但消耗cpu,根据实际情况选择,看是带宽少还是cpu不够

 

对于较老版本的浏览器,可以执行以下设定:

# Netscape 4.x has some problems.

BrowserMatch ^Mozilla/4 gzip-only-text/html ----此Mozilla浏览器只对text和html做gzip压缩

 

# Netscape 4.06-4.08 have some more problems

BrowserMatch ^Mozilla/4\.0[678] no-gzip  ---对这种浏览器不能gzip压缩

 

# MSIE masquerades as Netscape, but it is fine

BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html ---IE6浏览器,只压缩text和html

之前查看QQ空间和qq邮箱时老提醒浏览器版本低,当时用IE6,一直没升级,原来这个原因,

 

把过滤器的内容添加到/etc/httpd/conf/httpd.conf中尾部,重读文件(或者把低版本浏览器信息也复制进去)

[root@localhost html]# cp /var/log/messages ./index.html ---复制到web根目录下

[root@localhost html]# chmod +r index.html 

[root@localhost html]# curl -I http://172.16.59.1/index.html ---不显示是否压缩

在浏览器打开主页,查看元素,找到network一栏,Headers一列看到content-Encoding:gzip,使用gzip压缩

httpd-2.2(2)_其他



17、https:http over ssl,监听tcp协议443端口;然而http是80 -----------https在各大网站正如火如荼的蔓延,要不看笔记完全演示出来

 

http over ssl = https 443/tcp

ssl: v3

tls: v1

文本格式协议

https是二进制格式协议

 

TCP/IP协议站的应用层和传输层加了半层协议,调用了这半层就是https协议,在支付网站大都用https协议

一个单IP物理主机的所有虚拟主机中,只能有一个虚拟主机支持https协议

 

SSL会话的简化过程

(1) 客户端发送可供选择的加密方式,并向服务器请求证书;

(2) 服务器端发送证书以及选定的加密方式给客户端;

(3) 客户端取得证书并进行证书验正:

如果信任给其发证书的CA:

(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;

(b) 验正证书的内容的合法性:完整性验正

(c) 检查证书的有效期限;

(d) 检查证书是否被吊销;

(e) 证书中拥有者的名字,与访问的目标主机要一致;

(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;

(5) 服务用此密钥加密用户请求的资源,响应给客户端;

 

注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;

 

回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)

 

(1)创建私用CA机构

CA发证主机  172.16.59.1

[root@y7s1 ~]# cd /etc/pki/CA

创建私钥

[root@y7s1 CA]# (umask 077; openssl genrsa -out private/cakey.pem 2048)

 

CA给自己发证书

[root@y7s1 CA]# openssl req -new -x509 -key private/cakey.pem -out 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]:magedu

Organizational Unit Name (eg, section) []:ops

Common Name (eg, your name or your server's hostname) []:magedu.com

Email Address []:caadmin@magedu.com

 

创建需要的目录及文件

[root@y7s1 CA]# mkdir /etc/pki/CA/{certs,crl,newcerts}

[root@y7s1 CA]# touch /etc/pki/CA/{serial,index.txt}

[root@y7s1 CA]# echo 01 > /etc/pki/CA/serial 

 

收到httpd主机的请求后

批准证书,加工证书

[root@y7s1 CA]# openssl ca -in /tmp/httpd.csr -out certs/httpd.crt

发给申请者

[root@y7s1 CA]# scp certs/httpd.crt root@172.16.59.3:/etc/httpd/ssl/

查看证书编号及内容

[root@y7s1 CA]# openssl x509 -in certs/httpd.crt -noout -serial -subject

serial=01

subject= /C=CN/ST=beijing/O=magedu/OU=ops/CN=www.magedu.com/emailAddress=webadmin@magedu.com

 

(2)httpd服务器向CA申请证书

httpd的主机  172.16.59.3

[root@yph7s ~]# mkdir /etc/httpd/ssl

[root@yph7s ~]# cd /etc/httpd/ssl

创建私钥

[root@yph7s ssl]# (umask 077; openssl genrsa -out httpd.key 1024)

创建证书请求

[root@yph7s ssl]# openssl req -new -key httpd.key -out 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]:magedu

Organizational Unit Name (eg, section) []:ops

Common Name (eg, your name or your server's hostname) []:www.magedu.com

Email Address []:webadmin@magedu.com

 

把请求发给CA机构

[root@yph7s ssl]# scp httpd.csr root@172.16.59.1:/tmp/

 

 

(3) 配置httpd支持使用ssl,及使用的证书

[root@y7s1 CA]# yum install mod_ssl

[root@yph7s CA]# cd /etc/httpd/conf.d

 

[root@y7s1 conf.d]# cp  ssl.conf{,.bak}

 

[root@y7s1 conf.d]# vim /etc/httpd/conf.d/ssl.conf

修改四项:注意前两项要根据自己情况修改,别与之前其他配置文件冲突,否则httpd服务出错

DocumentRoot "/var/www/html" ----服务器根目录

ServerName www.magedu.com:443  ----主机名及监听端口

SSLCertificateFile /etc/httpd/ssl/httpd.crt  -----自己网站的证书,即公钥

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key ----自己网站的私钥

 

[root@y7s1 conf.d]# httpd -t

Syntax OK

[root@y7s1 conf.d]# systemctl restart httpd.service  ----因为修改了端口

[root@y7s1 conf.d]# ss -tnl | grep 443

LISTEN     0      128                      :::443                     :::*    

 

由于80端口并没有关闭,所以既可以从http协议访问又可以通过https协议

 

 

(4) 测试基于https访问相应的主机

 

把CA主机自签证书放到浏览器主机,这个证书相当于微软为每台windows准备的CA证书,

 

172.16.59.1又是CA机构。给自己发个用户签证,用给自己发的证访问https://www.a.com

172.16.59.3是httpd服务器,向CA机构申请证书,申请的证书中的主机名最好与自己域名一致

导入到浏览器的是发布CA机构的/etc/pki/CA/cacert.pem

有的浏览器可能需要重命名为cacert.crt

 

修改hosts文件

# vim /etc/hosts

172.16.59.1 www.a.com www

 

用命令行访问:

[root@yph7s ssl]# openssl s_client -connect www.magedu.com:443 -CAfile /etc/pki/CA/cacert.pem

GET /index.html HTTP/1.1 ---------https?

Host: www.a.com

 

用浏览器访问:

我是用基于FQND的虚拟主机访问的。

访问被禁止,把端口改成443,还可能是主机名与证书的主机名不一致,用ip访问不行,必须用域名,主机名

<VirtualHost *:443>

        ServerName www.a.com

        DocumentRoot /web/a.com

这下真的能访问了,浪费了我这么多精力


排错:服务无法启动,可能是刚修改了某配置文件,导致错误或冲突。

[root@y7s1 logs]# less /etc/httpd/logs/error_log 

[root@y7s1 logs]# less /etc/httpd/logs/ssl_error_log 


浏览器导入证书过程:

httpd-2.2(2)_其他_02

httpd-2.2(2)_其他_03

httpd-2.2(2)_其他_04

httpd-2.2(2)_httpd_05


 

 

18、http自带的工具程序

 

htpasswd:basic认证基于文件实现的,用到的账号密码文件生成工具

 

apachectl :httpd自的服务控制脚本,支持start和stop

 

apxs:由httpd-devel包提供,扩展httpd使用第三方模块工具

 

rotatelogs:日志滚动工具,当日志文件达到某一大小时,自动把日志保存到另一自动新建文件,防止把所有日志放到同一文件,由于内容过多而不易查看

 

suexec:访问某些有特殊权限配置资源时,临时切换至指定用户身份运行

 

19、httpd的压力测试模拟工具

ab:apache bench:服务器压力测试模拟工具

 

ab

webbench

http_load

seige

图形化压测工具

jmeter

loadrunner:功能强大到没朋友,比较难学,还有中级高,级证书,可见难度之大

 

tcpcopy:网易开发,复制生产环境中的真实请求,并将之保存下来

 

ab [options] URL

-n总请求数

-c:总并发连接数

-k:以持久连接模式测试

 

下面模拟100个用户,每人20个请求,共2000个请求

[root@y7s1 CA]# ab -c 100 -n 1000 http://172.16.59.3/index.html

 

Concurrency Level:      100 ------模拟100人同时并发请求

Time taken for tests:   0.327 seconds 

Complete requests:      1000  --------所有请求的数量

Failed requests:        0

Write errors:           0  -------发送响应的失败次数

Non-2xx responses:      1000

Total transferred:     437000 bytes -----共传输的字节数,因为只是一个html文件,比下面多的是首部

HTML transferred:       211000 bytes ------共传输的html字节数

Requests per second:    3054.41 [#/sec] (mean) -----每秒完成多少个请求

Time per request:      32.739 [ms] (mean) ------100人并发请求完成一次消耗的时间,是下面的100倍

Time per request:       0.327 [ms] (mean, across all concurrent requests)一个人请求一次,

Transfer rate:          1303.50 [Kbytes/sec] received

 

Connection Times (ms)

              min  mean[+/-sd] median   max

 

Connect:       0    2   2.0      2      10 ---建立连接的时间,太慢就是问题了

Processing:    11   29   4.3     30      37 ----服务器处理时间,时间长说明服务器处理和IO性能差

Waiting:       11   29   4.3     30      36 --客户端等待时间,从服务器发送完毕到客户端接收完毕的时间

Total:          16   31   3.9     32      42

min:这1000个请求中最短的那个请求的时间

max:这1000个请求中最长的那个请求的时间

mean:平均

 

Percentage of the requests served within a certain time (ms)

  50%     32  ---------前32毫秒完成了50%的请求

  66%     33

  75%     34

  80%     34

  90%     35

  95%     37

  98%     37

  99%     39

 100%     42 (longest request)------所有请求共用了42毫秒,后50%用了(42-32)=10ms

如果满载时候50%消耗的时间会是前50%的好多倍,