httpd基础

hpptd

http服务器应用

http服务器程序
httpd
apache
nginx
lighttpd

应用程序服务器
IIS .asp
tomcat .jsp
jetty 开源的servlet容器,基于Java的web容器
Resin CAUCHO公司,支持servlets和jsp的引擎
webshpere(IBM), weblogic(BEA), jboss,oc4j(Oracle)

市场占有率统计 www.netcraft.com

httpd
20世纪90年代初,国家超级计算机应用中心NCSA开发
1995年开源社区发布apache(a patchy server)
ASF: apache software foundation
FSF:Free Software Foundation
特性:
高度模块化:core + modules
DSO: Dynamic Shared Object 动态加/卸载
MPM:multi-processing module多路处理模块(支持多种I/O模型)

MPM工作模式

prefork:多进程I/O模型,每个进程响应一个请求,默认模型
一个主进程:生成和回收n个子进程,创建套接字,不响应请求
多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024(系统中默认并发进程数)个

worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

event:事件驱动模型(worker模型的变种)
一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力
httpd-2.2: event 测试版, centos6默认
httpd-2.4:event 稳定版,centos7默认

httpd功能特性

虚拟主机:一个物理服务器搭建多个网站
IP、Port、FQDN
CGI:Common Gateway Interface,通用网关接口
(网关:连接不同网段、不同协议之间的通信)
反向代理
负载均衡
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块

httpd安装

版本:
CentOS 6: 2.2
CentOS 7: 2.4
安装方式:
rpm:centos发行版,稳定,建议使用
编译:定制或特殊需求
CentOS 6
程序环境:httpd-2.2

配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf

检查配置语法:
httpd –t
service httpd configtest

服务脚本:
/etc/rc.d/init.d/httpd

脚本配置文件:
/etc/sysconfig/httpd

服务控制和启动:
chkconfig httpd on|off service {start|stop|restart|status|configtest|reload} httpd

站点网页文档根目录: /var/www/html

模块文件路径:
/etc/httpd/modules
/usr/lib64/httpd/modules

主程序文件:
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event

主进程文件:
/etc/httpd/run/httpd.pid

[root@CentOS6 run]#cat httpd.pid 
2367
#服务启动时自动创建,存放服务的主进程编号
#当服务停止文件自动删除

日志文件目录:
/var/log/httpd access_log: 访问日志
error_log:错误日志

帮助文档包: httpd-manual(yum下载httpd的官方文档)
下载完成以后,重新加载服务配置文件,通过浏览器访问本机的IP/manual目录。
配置文件目录树:

[root@CentOS6 ~]#tree /etc/httpd
/etc/httpd
├── conf
│   ├── httpd.conf
│   └── magic
├── conf.d
│   ├── mod_dnssd.conf
│   ├── README
│   └── welcome.conf
├── logs -> ../../var/log/httpd
├── modules -> ../../usr/lib64/httpd/modules
└── run -> ../../var/run/httpd

Httpd 2.2常见配置

修改配置文件之前,先备份

httpd配置文件的组成:

[root@CentOS6 ~]$ grep "Section" /etc/httpd/conf/httpd.conf 	 		 #主配置文件
Section 1: Global Environment			#全局环境设置
Section 2: 'Main' server configuration	#主服务器配置
Section 3: Virtual Hosts				#虚拟主机

配置格式

directive value
directive: 不区分字符大小写
value: 为路径时,是否区分大小写,取决于文件系统

1、显示服务器版本信息

关键字:ServerTokens
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

This setting applies to the entire server and cannot be enabled or disabled on a virtualhost-by-virtualhost basis. After version 2.0.44, this directive also controls the information presented by the ServerSignature directive.
建议使用:ServerTokens Prod(安全考虑不显示太详细的版本信息)

[root@CentOS6 ~]#curl -I 172.18.45.6
HTTP/1.1 200 OK
Date: Fri, 29 Sep 2017 01:42:20 GMT
Server: Apache/2.2.15 (CentOS)	#修改之前
Server: Apache		#修改结果
Last-Modified: Sat, 05 Aug 2017 11:36:50 GMT
ETag: "1a015f-3a-55600078b343c"
Accept-Ranges: bytes
Content-Length: 58
Connection: close
Content-Type: text/html; charset=UTF-8

2、修改监听IP,Port端口

Listen [IP:]PORT
(1) 省略IP表示为0.0.0.0;
(2) Listen指令至少一个,可重复出现多次 Listen 80 Listen 8080
(3) 修改监听socket,重启服务进程方可生效

3、持久连接

关键字:KeepAlive
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接 。一个TCP三次握手建立连接以后,每个资源获取完成以后不会立即断开连接,超过定义的超时时间或者超过传输的资源个数,才会断开连接状态。

断开条件:
数量限制:100
时间限制:以秒为单位, httpd-2.4 支持毫秒级 副作用:对并发访问量较大的服务器,持久连接功能会使用有 些请求得不到响应
折衷:使用较短的持久连接时间

设置: KeepAlive On|Off
KeepAliveTimeout 15 #设置超时时间
MaxKeepAliveRequests 100 #设置一次连接请求资源数量

测试:
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP

4、MPM( Multi-Processing Module)多路处理模块

prefork, worker, event(试验阶段)
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现 对不同MPM机制的支持
确认方法:
ps aux | grep httpd
默认为/usr/sbin/httpd, 即prefork模式

查看模块列表
查看静态编译的模块 httpd -l

[root@CentOS6 ~]#httpd -l |grep 'prefork'
  prefork.c		#表示正在使用的模块prefork.c

查看静态编译及动态装载的模块 httpd –M
动态模块加载:不需重启即生效
动态模块路径 /usr/lib64/httpd/modules/

更换使用的httpd程序
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.worker #默认该行被注释
重启服务生效
pstree -p|grep httpd 查看进程和线程

Httpd 2.4 与之不同 以动态模块方式提供
配置文件:/etc/httpd/conf.modules.d/00-mpm.conf
httpd –M |grep mpm
重启服务生效
pstree -p|grep httpd 查看进程和线程

prefork的默认配置: 在主配置文件中
关键字:MPM

StartServers 8 初始启动开8个子进程
MinSpareServers 5 最小空闲进程
MaxSpareServers 20 最大空闲进程
ServerLimit 256 最多进程数,最大20000
MaxClients 256 最大并发
MaxRequestsPerChild 4000 子进程最多能处理的请求 数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
</IfModule>

worker的默认配置:

StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0 无限制
</IfModule>

5、DSO: Dynamic Shared Object

关键字:LoadModule
加载动态模块配置
/etc/httpd/conf/httpd.conf
配置指定实现模块加载格式:
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径:
相对于ServerRoot(默认/etc/httpd)
模块文件路径:/etc/http/modules
添加模块可以在主配置文件中直接添加,也可以按照相应的格式在/etc/httpd/conf.d/目录下单独配置,便于管理

6、定义'Main' server的文档页面路径

关键字:DocumentRoot “/path”
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
示例: DocumentRoot "/app/data"
http://HOST:PORT/test/index.html
--> /app/data/test/index.html
注意:SELinux和iptables的状态
/etc/httpd/conf.d/welcome.conf 文件定义了当用户访问页面不存在,也就是出现403错误时默认跳转的页面。

7、定义站点主页面

关键字:DirectoryIndex
DirectoryIndex index.html index.html.var

8、站点访问控制常见机制

可基于两种机制指明对哪些资源进行何种访问控制
访问控制机制有两种:客户端来源地址,用户账号
文件路径:

<Directory  “/path">	#对于本地目录的访问控制
... 		
</Directory> 
<File  “/path/file”>	#对于本地文件的访问控制
... 
</File> 
<FileMatch "PATTERN">	#对于匹配文件的访问控制
... 
</FileMatch>

RUL路径:

<Location  "">					#对于URL的访问控制
... 
</Location> 
<LocationMatch "">				#对于匹配的URL的访问控制
... 
</LocationMatch>

示例:

<FilesMatch "\.(gif|jpe?g|png)$"> 
<Files “?at.*”>  通配符 
<Location /status> 
<LocationMatch "/(extra|special)/data">

通配符匹配比较消耗服务器的性能,客户端每次请求资源都会对资源进行比较,降低了服务器的性能,定义的规则越复杂服务器的维护也不会越难

9、中“基于源地址”实现访问控制

(1) Options:后跟1个或多个以空白字符分隔的选项列表
在选项前的+,- 表示增加或删除指定选项
常见选项:
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户 (当用户访问的URL不存在index文件时是否显示一个目录页面)
FollowSymLinks:允许访问符号链接文件所指向的源文件
None:全部禁用
All: 全部允许
示例:

[root@CentOS6 ~]#vim /etc/httpd/conf.d/test.conf
<Directory /var/www/html/test>	#受控目录
Options -Indexes		#不允许返回目录索引
Options -FollowSymLinks	#不允许访问软链接文件
</Directory>

(2) AllowOverride
与访问控制相关的哪些指令可以放在指定目录下的 .htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令
.htaccess:在指定目录中创建该文件,只控制该目录的访问
只对语句有效
AllowOverride All: 所有指令都有效
AllowOverride None:.htaccess 文件无效
AllowOverride AuthConfig Indexes 除了AuthConfig 和Indexes的其它指令都无法覆盖
(3) order和allow、deny
放在directory, .htaccess中
order:定义生效次序;写在后面的表示默认法则
Order allow,deny
Order deny,allow
Allow from, Deny from
IP (四种写法)
网络:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
示例:

<files "*.txt"> 			#控制所有*.txt文件
order deny,allow 
deny from 172.16.100.100	#拒绝该IP访问所有以.txt结尾的文件
allow from 172.16
</files>
allow,DENY DENY,ALLOW
ONLY ALLOW ALLWO ALLOW
ONLY DENY DENY DENY
BOTH DENY ALLOW
NONE DENY ALLOW

10、日志设定

日志类型:
​ 访问日志
​ 错误日志

错误日志:
​ ErrorLog logs/error_log
​ LogLevel warn loglevel 可选值:
​ debug, info, notice, warn,error crit, alert, emer

访问日志:
定义日志格式:LogFormat format strings
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined

使用日志格式:
CustomLog logs/access_log combined
参考帮助:
http://httpd.apache.org/docs/2.2/mod/mod_log_config .html#formats

%h 客户端IP地址
%l 远程用户,启用mod_ident才有效,通常为减号“-”
%u 验证(basic,digest)远程用户,非登录访问时,为 一个减号“-”
%t 服务器收到请求时的时间
%r First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本
%>s 响应状态码
%b 响应报文的大小,单位是字节;不包括响应报文http首部
%{Referer}i 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的
%{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的应用程序

11、设定默认字符集

关键字:AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030

12、定义路径别名

格式: Alias /URL/ "/PATH/"
DocumentRoot "/www/htdocs" http://www.huxiaoqi.com/download/bash.rpm ==>/www/htdocs/download/bash.rpm
Alias /download/ "/rpms/pub/" http://www.huxiaoqi.com/download/bash.rpm ==>/rpms/pub/bash.rpm http://www.huxiaoqi.com/images/logo.png ==>/www/htdocs/images/logo.png

13、基于用户的访问控制

认证质询:WWW-Authenticate:响应码为401,拒绝客户端 请求,并说明要求客户端提供账号和密码

认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源

认证方式两种:
basic:明文
digest:消息摘要认证,兼容性差

安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因

用户的账号和密码
虚拟账号:仅用于访问某服务时用到的认证标识
存储:文本文件,SQL数据库,ldap目录存储,nis等

basic认证配置示例:
(1) 定义安全域

<Directory “/path"> 
	Options None 
	AllowOverride None 
	AuthType Basic 			#验证类型
	AuthName "String“ 		#提示符
	AuthUserFile  "/PATH/HTTPD_USER_PASSWD_FILE" 
	Require  user  username1  username2 ... 
</Directory> 

允许账号文件中的所有用户登录访问:
Require valid-user
(2) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
-c:自动创建文件,仅应该在文件不存在时使用
-m:md5格式加密,默认方式
-s: sha格式加密
-D:删除指定用户

[root@CentOS6 ~]#vim /etc/httpd/conf.d/test.conf
<Directory /var/www/html/test>
authtype basic
authname "hehe"
authuserfile "/etc/httpd/conf.d/.httpusers"
require user hehe 
</Directory>

基于组账号进行认证
(1) 定义安全域

<Directory “/path"> 
	AuthType Basic 
	AuthName "String“ 
	AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE" 
	AuthGroupFile "/PATH/HTTPD_GROUP_FILE" 
	Require  group  grpname1  grpname2 ... 
</Directory> 

(2) 创建用户账号和组账号文件;
组文件:每一行定义一个组
GRP_NAME: username1 username2 ...
这里无论是用户还是组都是对于httpd服务来说的,与的用户与组linux无关

远程客户端和用户验证的控制
Satisfy ALL|Any
ALL 客户机IP和用户验证都需要通过才可以
Any客户机IP和用户验证,有一个满足即可

14、虚拟主机

站点标识: socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同;
请求报文中首部
Host: www.huxiaoqi.com

有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机使用至少一个独立的port
基于FQDN:为每个虚拟主机使用至少一个FQDN
注意:一般虚拟机不要与main主机混用;因此,要使用虚拟主机, 一般先禁用main主机
禁用方法:注释中心主机的DocumentRoot指令即可

虚拟主机配置方法:

<VirtualHost IP:PORT>
	ServerName FQDN 
	DocumentRoot “/path" 
</VirtualHost> 

建议:上述配置存放在独立的配置文件中
其它可用指令:
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog: 错误日志
CustomLog:访问日志
<Directory “/path">

Alias
基于IP的虚拟主机示例:

<VirtualHost 172.16.100.6:80> 
	ServerName www.a.com 
	DocumentRoot "/www/a.com/htdocs" 
</VirtualHost> 

<VirtualHost 172.16.100.7:80> 
	ServerName www.b.net 
	DocumentRoot "/www/b.net/htdocs" 
</VirtualHost> 

<VirtualHost 172.16.100.8:80> 
	ServerName www.c.org 
	DocumentRoot "/www/c.org/htdocs" 
</VirtualHost>

基于端口的虚拟主机:
可和基于IP的虚拟主机混和使用

listen 808 
listen 8080 
<VirtualHost 172.16.100.6:80> 
	ServerName www.a.com 
	DocumentRoot "/www/a.com/htdocs" 
</VirtualHost> 

<VirtualHost 172.16.100.6:808> 
	ServerName www.b.net 
	DocumentRoot "/www/b.net/htdocs" 
</VirtualHost> 

<VirtualHost 172.16.100.6:8080> 
	ServerName www.c.org 
	DocumentRoot "/www/c.org/htdocs" 
</VirtualHost>

基于FQDN的虚拟主机示例:

[root@CentOS6 ~]#vim /etc/httpd/conf.d/test.conf 
  1 NameVirtualHost *:80
  2 <VirtualHost *:80> 
  3         servername www.huxiaoqi.com
  4         DocumentRoot "/app/www.huxiaoqi.com/"
  5 </VirtualHost>
  6 
  7 <VirtualHost *:80> 
  8         servername mile.huxiaoqi.com
  9         DocumentRoot "/app/mile.huxiaoqi.com/"
 10 </VirtualHost>
 11 
 12 <VirtualHost *:80> 
 13         servername zhengzhou.huxiaoqi.com
 14         DocumentRoot "/app/zhengzhou.huxiaoqi.com/"
 15 </VirtualHost>

15、status页面

模块:LoadModule status_module modules/mod_status.so

<Location /server-status> 
SetHandler server-status 
Order allow,deny 
Allow from 172.16 
</Location> 
#定义的URL:/server-status不是固定不变的,可以更改

主配置文件中添加:ExtendedStatus On
在server-status中显示服务器详细信息

http协议

http协议:stateless 无状态
服务器无法持续追踪访问者来源
解决http协议无状态方法
cookie :
重cookie:服务器将用户的所有的用户信息以文本文件的形式记录下来封装生成cookie信息和一个唯一编号保留下来,然后将cookie通过http协议发送给客户端,客户端将收到了cookie保存在磁盘当中。客户端每次访问服务器都会在请求报文中携带自己的cookie上传给服务器,服务器通过cookie信息来确认用户的信息并且每次访问都会更新,添加cookie信息。这种方法有两个缺点,一个是每次用户访问网站都会上传自己的cookie信息,占用了大量的网络带宽增加了服务器负担。此外由于cookie信息保留在客户端的原因,也就以为这同一个用户如果换一台电脑去访问同样的网站,该用户的用户信息还是无法被服务器识别。所以目前,重cookie这种方式比较落后很少应用。
轻cookie:轻cookie相比重cookie的区别在于,轻量级的cookie不再存放用户的所有用户信息,而是给每个用户生成一个ID,根据用户每次访问携带的ID来进行身份确认,同时配合session将用户的用户信息与ID匹配并存放在服务器的磁盘和内存中,以此来弥补重cookie的缺陷。
session 服务端存放
http事务:一次访问的过程
请求:request
响应:response

请求报文

HTTP响应报文

报文语法格式

request报文


response报文


method: 请求方法,标明客户端希望服务器对资源执行的动作 GET、HEAD、POST等
​ GET:从服务器获取一个资源
​ HEAD:只从服务器获取文档的响应首部
​ POST:向服务器输入数据,通常会再由网关程序继续处理
​ PUT:将请求的主体部分存储在服务器中,如上传文件
​ DELETE:请求删除服务器上指定的文档
​ TRACE:追踪请求到达服务器中间经过的代理服务器
​ OPTIONS:请求服务器返回对指定资源支持使用的请求方法

协议查看或分析的工具: tcpdump, wireshark,tshark

version: 服务器版本
HTTP/.

status: 状态码,三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况
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: 响应报文Location指明资源临时新位置 Moved Temporarily
​ 304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变 ,则通过响应此响应状态码通知客户端;Not Modified
​ 401: 需要输入账号和密码认证方能访问资源;Unauthorized
​ 403: 请求被禁止;Forbidden
​ 404: 服务器无法找到客户端请求的资源;Not Found
​ 500: 服务器内部错误;Internal Server Error
​ 502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway
​ 503 – 服务不可用,临时服务器维护或过载,服务器无法处理请求
​ 504 – 网关超时

reason-phrase: 状态码所标记的状态的简要描述

headers: 每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着是一个值

entity-body:请求时附加的数据或响应时附加的数据

http协议首部

首部的分类:

通用首部
请求首部
响应首部
实体首部
扩展首部

通用首部:

Date: 报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点(代理,网关)
Cache-Control:控制缓存,如缓存时长
MIME-Version:发送端使用的MIME版本

请求首部:

Accept:通知服务器自己可接受的媒体类型
Accept-Charset: 客户端可接受的字符集
Accept-Encoding:客户端可接受编码格式,如gzip
Accept-Language:客户端可接受的语言

Client-IP: 请求的客户端IP
Host: 请求的服务器名称和端口号
Referer:跳转至当前URI的前一个
URL User-Agent:客户端代理,浏览器版本

条件式请求首部

Expect:允许客户端列出某请求所要求的服务器行为
If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改
If-Unmodified-Since:与上面相反
If-None-Match:本地缓存中存储的文档的ETag标签是否与 服务器文档的Etag不匹配
If-Match:与上面相反

安全请求首部:

Authorization:向服务器发送认证信息,如账号和密码
Cookie: 客户端向服务器发送cookie
Cookie2:用于说明请求端支持的cookie版本

代理请求首部:

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:主体的对象类型,如text 缓存相关:
ETag:实体的扩展标签
Expires:实体的过期时间
Last-Modified:最后一次修改的时间

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...]

选项:
-A/--user-agent 设置用户代理发送给服务器
-e/--referer 来源网址
--cacert CA证书 (SSL)
-k/--insecure 允许忽略证书进行 SSL 连接
--compressed 要求返回是压缩的格式
-H/--header 自定义首部信息传递给服务器
-i 显示页面内容,包括报文首部信息
-I/--head 只显示响应报文首部信息
-D/--dump-header 将url的header信息存放在指定文件中
--limit-rate 设置传输速度
--basic 使用HTTP基本认证
-u/--user <user[:password]>设置服务器的用户和密码
-L 如果有3xx响应码,重新发请求到新位置
-o 将网络文件保存为指定的文件中
-O 使用URL中默认的文件名保存文件到本地
-0/--http1.0 使用HTTP 1.0
-L 选项进行强制重定向
-C - 选项可对文件使用断点续传功能
-c/--cookie-jar 将url中cookie存放在指定文件中
-x/--proxy <proxyhost[:port]> 指定代理服务器地址
-X/--request 向服务器发送指定请求方法
-U/--proxy-user user:password 代理服务器用户和密码
-T 选项可将指定的本地文件上传到FTP服务器上
--data/-d 方式指定使用POST方式传递数据

elinks工具:

语法:
elinks [OPTION]... [URL]...
选项:
-dump: 非交互式模式,将URL的内容输出至标准输出
-source:打印源码

mod_deflate(压缩)模块

使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
(2) 压缩适于压缩的资源,例如文本文件

配置文件写法:
LoadModule deflate_module modules/mod_deflate.so #加载模块
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 只压缩text/html
BrowserMatch ^Mozilla/4 gzip-only-text/html
Netscape 4.06-08三个版本 不压缩
BrowserMatch ^Mozilla/4.0[678] no-gzip
Internet Explorer标识本身为“Mozilla / 4”,但实际上是能够处理请求的压缩。如果用户代理首部匹配字符串 “MSIE”(“B”为单词边界”),就关闭之前定义的限制
BrowserMatch \bMSI[E] !no-gzip !gzip-onlytext/html

https

https:http over ssl

SSL会话的简化过程

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

https实现

(1) 为服务器申请数字证书
测试:通过私建CA发证书
​ (a) 创建私有CA
​ (b) 在服务器创建证书签署请求
​ (c) CA签证
(2) 配置httpd支持使用ssl,及使用的证书
yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
​ DocumentRoot #主站点目录,默认会从httpd主配置文件全局设定获取
​ ServerName
​ SSLCertificateFile
​ SSLCertificateKeyFile
(3) 测试基于https访问相应的主机 openssl s_client [-connect host:port] [-cert filename] [CApath directory] [-CAfile filename]

实验:实现HTTPS,HSTS
一、实验部署:
使用三台虚拟机,一台提供DNS服务和CA,一台提供httpd服务,一台验证客户端
二、部署DNS服务:
在第一台服务器安装BIND实现DNS服务
编辑主配置文件,允许验证客户端机器访问查询

[root@CentOS6 ~]#vim /etc/named.conf
options {
        listen-on port 53 { localhost; };
        #设置本机所有IP都对53端口监听
		allow-query     { 172.18.45.7; };
		#允许验证客户端查询本机的DNS服务,只修改必要项即可
};

在区域配置文件中添加要解析的域

[root@CentOS6 ~]#vim /etc/named.rfc1912.zones 
zone "huxiaoqi.com" IN {
        type master;
        file "huxiaoqi.com.zone";
};

配置解析库文件:

[root@CentOS6 ~]#vim /var/named/huxiaoqi.com.zone
$TTL 86400      ; 1 day
@   IN   SOA    dns1.huxiaoqi.com. rname.invalid. (
                                1          ; serial
                                86400      ; refresh (1 day)
                                3600       ; retry (1 hour)
                                604800     ; expire (1 week)
                                10800      ; minimum (3 hours)
                                )
                        NS      dns1.huxiaoqi.com.
dns1                    A       172.18.45.6
www                     A       172.18.45.61
#添加A记录,将域名为www.huxiaoqi.com的IP地址解析为提供httpd服务的服务器IP地址:172.18.45.61

将验证客户端机器的DNS指向DNS服务器172.18.45.6

[root@CentOS7 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0 
#DNS1=172.18.0.1
DNS2=172.18.45.6
#注意:如果该机器之前已经设置了DNS服务器,那么需要注释掉之前配置的DNS服务器,否则系统默认使用第一个DNS服务器去解析FQDN,如果第一台DNS服务器不能解析该FQDN系统也不会去调用另外一台DNS服务器,除非第一台DNS服务器宕机系统才会主动去调用DNS2.

三、搭建CA颁发证书:
(一)创建所需要文件
touch /etc/pki/CA/index.txt 生成证书索引数据库文件
echo 01 > /etc/pki/CA/serial 指定第一个颁发证书的序列号

(二)CA自签证书

  1. 生成私钥
    cd /etc/pki/CA/
    (umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
[root@CentOS6 CA]#(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
...........................+++
e is 65537 (0x10001)
# -out /etc/pki/CA/private/cakey.pem 必须按照配置文件指定目录以及文件名 
  1. 生成自签名证书
    openssl req -new -x509 –key
    /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem
[root@CentOS6 CA]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 7300
  -key /etc/pki/CA/private/cakey.pem私钥位置
  -out /etc/pki/CA/cacert.pem自签名证书的位置以及文件名
  -req -new: 生成新证书签署请求 
  -x509: 专用于CA生成自签证书 
  -key: 生成请求时用到的私钥文件 
  -days n:证书的有效期限 
  -out /PATH/TO/SOMECERTFILE: 证书的保存路径

(三)颁发证书

  1. 在需要使用证书的主机生成证书请求给web服务器生成私钥
    (umask 066; openssl genrsa -out /etc/pki/tls/private/test.key 2048)
[root@CentOS7 certs]#(umask 066;openssl genrsa -out /etc/pki/tls/private/app.key 2048)
-out /etc/pki/CA/private/app.key #指定生成私钥位置、文件名
  1. 利用私钥生成证书申请文件
    openssl req -new -key /etc/pki/tls/private/test.key -days 365 -out etc/pki/tls/test.csr
[root@CentOS7 tls]#openssl req -new -key /etc/pki/tls/private/app.key -days 365 -out /etc/pki/tls/app.csr
-key /etc/pki/tls/private/app.key	#自己的私钥
-out /etc/pki/tls/app.csr			#申请书的位置以及文件名
  1. 将证书请求文件传输给CA
  2. CA签署证书,并将证书颁发给请求者
    openssl ca -in /tmp/test.csr –out /etc/pki/CA/certs/test.crt -days 365
[root@CentOS6 CA]#openssl ca -in /etc/pki/CA/app.csr -out /etc/pki/CA/certs/app.crt
-out /etc/pki/CA/certs/app.crt 生成证书的文件名以及路径

四、配置httpd支持使用ssl,及使用的证书
安装httpd,然后准备一个测试的默认页面,开启服务:

[root@Centos6 ~]#vim /var/www/html/index.html 
hello,world
hahahahahahaha

使用浏览器访问效果如下:

配置ssl:
首先安装httpd的ssl模块:yum -y install mod_ssl
然后编辑ssl配置文件:/etc/httpd/conf.d/ssl.conf
这里需要准备三个文件,CA的自签名证书、httpd服务器的私钥以及httpd服务的证书,在ssl的配置文件中指明这三个文件的所在位置,为了方便管理建议将这三个文件存放在一起,比如直接在/etc/httpd/conf.d,目录下创建一个ssl目录存放这三个文件。

[root@Centos6 ssl]#tree
.
├── app.crt
├── app.key
└── cacert.pem

编辑/etc/httpd/conf.d/ssl.conf 文件:

[root@Centos6 ~]#vim /etc/httpd/conf.d/ssl.conf 
SSLCertificateFile /etc/httpd/conf.d/ssl/app.crt
SSLCertificateKeyFile /etc/httpd/conf.d/ssl/app.key
SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem
#取消注释这三项并指明对应文件的对应位置

https在ssl.conf中默认定义监听443端口

[root@Centos6 ssl]#ss -tnl
State    Recv-Q Send-Q  Local Address:Port Peer Address:Port 
LISTEN   0      128              :::80            :::*     
LISTEN   0      128              :::443           :::*     
#端口开启说明配置没有错误

重启httpd服务
再次使用浏览器访问加密模式的httpd服务效果如下:

五、在浏览器中导入证书信任
证书导入受信以后的浏览效果:

至此就可以说httpd服务实现了https,但是访问时需要用户手动输入https属性,不能自动跳转。
六、实现HSTS:
在/etc/httpd/conf.d/目录下创建独立的hsts配置文件并编辑:

[root@Centos6 ~]#vim /etc/httpd/conf.d/hsts.conf
Header always set Strict-Transport-Security "maxage=15768000"
RewriteEngine on 
RewriteRule ^(/.\*)$  https://%{HTTP_HOST}$1 [redirect=301]

编辑完成以后,重读配置文件,在次访问直接输入网址就能实现https的自动跳转了

http重定向https

将http请求转发至https的URL
重定向
Redirect [status] URL-path URL
status状态:
Permanent(永久跳转):Returns a permanent redirect status (301) indicating that the resource has moved permanently
Temp(临时跳转):Returns a temporary redirect status (302). This is the default
示例:
Redirect temp / https://www.huxiaoqi.com/ #将原有的网站根目录跳转到加密的访问页面
这种跳转的方式比较简单,但是性能还有优化空间。利用这种跳转方式,用户访问未加密页面的时,首先服务器会返回给客户端一个信息,告诉客户端要访问的页面已经跳转,并返回跳转的地址。然后客户端再向跳转的页面发送访问请求。这样用户每次访问都会重复以上步骤,影响效率。HSTS技术则可以有效优化此步骤。

HSTS

HSTS:HTTP Strict Transport Security
服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部做307跳转到HTTPS。而无需任何网络过程,但是该用户第一次访问该网站时还是需要通过之前的复杂步骤。

HSTS preload list :
是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS。Firefox、Safari、 Edge浏览器也会采用这个列表
实现HSTS示例:

vim /etc/httpd/conf/httpd.conf 
Header always set Strict-Transport-Security "maxage=15768000" 
RewriteEngine on 
RewriteRule ^(/.\*)$  https://%{HTTP_HOST}$1 [redirect=301]

httpd自带的工具程序

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

httpd的压力测试工具

httpd的压力测试工具
ab, webbench, http_load, seige
Jmeter 开源
Loadrunner 商业,有相关认证
tcpcopy:网易,复制生产环境中的真实请求,并将之保存
ab [OPTIONS] URL 来自httpd-tools
-n:总请求数
-c:模拟的并行数
-k:以持久连接模式测试
ulimit –n # 调整能打开的文件数

posted @ 2017-10-09 19:48  奇哥与李妞  阅读(477)  评论(0编辑  收藏  举报