httpd-2.2基础配置
回顾:
MPM机制:多路处理模块,有以下三种类型
prefork:多进程模型,一个进程响应一个请求
worker:多进程多线程模型,一个进程生成多个线程,一个线程响应一个请求
event:事件驱动模型,异步,回调方式响应用户请求,一个进程响应多个请求
并发服务器响应用户请求:
单进程IO模型
多进程IO模型
复用的IO模型:多线程模型,事件驱动
复用的多进程IO模型
新内容
配置服务过程中
关闭selinux
关闭iptables
httpd安装使用(2)
centos6的rpm包是2.2(event测试版)
centos7的rpm包是2.4(event可生产使用)
安装方式:光盘的rpm包,编译安装(经过编译后的rpm包的功能未必符合需要)
程序生成的文件环境
rpm -ql httpd 程序的全部文件
rpm -qc httpd 程序的配置文件
/etc/httpd/是httpd程序运行的根目录
rpm -qd httpd 网页文档
centos6上httpd程序环境
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
主程序文件:rpm -ql httpd | grep bin
/usr/sbin/{httpd,httpd.event,httpd.worker}
httpd=httpd.prefork,默认,可在/etc/sysconfig/httpd文件中切换
日志文件目录:/var/log/httpd/,日志文件有两类
access_log:访问日志,可以导入到大数据处理平台中做实时系统分析,分析用户的行为
error_log:启动、停止的错误信息或者运行过程的错误、警告信息
站点文档目录:存放网页的目录,向外输出提供访问的
默认:/var/www/html/
配置文件组成部分详解:
grep -i "Session" /etc/http/conf/httpd.conf
配置格式:配置指令 值
配置指令:不区分大小写
值:为路径时,取决于文件系统
/etc/httpd/conf/httpd.conf配置文件有三部分:
1、全局配置
①指明监听端口和IP
Listen [IP:]80 省略IP表示监听所有IP的80端口,Listen指令可以出现多次,可以Listen 80 8080这样子写吗?
Listen 1.2.3.4:8080 修改监听端口只能restart??貌似reload也可以
②持久连接和非持久连接
连接建立后,第一个资源获取完成后不会断开连接而是继续等待其他的请求完成。
链接建立后应该何时断开?这是一个非常重要的问题——控制标准有两种,数量限制(默认获取100个资源就会断开)和时间限制
副作用:对并发访问量较大的服务器,持久连接功能或使得有些请求得不到响应
关闭持久链接会增加网络带宽的压力
折中方案:使用较短的持久连接时间,比如5S。httpd2.4支持毫秒级持久时间
非持久连接,httpd1.0默认是非持久的,httpd1.1默认是持久连接
持久连接的相关配置项及默认值如下
KeepAlive Off
MaxKeepAliveRequests 100 默认请求100个资源就会断开
KeepAliveTimeout 15 连接超时断开时长15秒
telnet IP PORT 明文的文本格式都可以telnet
GET / HTTP/1.1 指明请求资源
Host: IP 指明服务器IP
[enter]
[enter]
文本传输完成后,立刻断开,因为默认是短链接。现在修改配置为长连接
KeepAlive On
reload服务
telnet IP PORT 明文的文本格式都可以telnet
GET / HTTP/1.1 指明请求资源(/index.html)和协议
Host: IP/HOSTNAME 指明服务器IP
[enter]
[enter]
此时连接不断开,但超时会断开
③MPM,multipath process module
配置多道处理模块,其实有十几种,httpd上有3种prefork,worker,event
httpd-2.2不支持同时编译多个模块,编译时只能选定一个;但rpm安装时提供了三种二进制程序文件,分别用于实现对不同MPM机制的支持;而httpd-2.4则可以同时编译三种处理模块,可以在运行时切换。
查看使用MPM哪种模式
httpd-2.2查看方式
ps aux | grep httpd,如果使用/usr/sbin/httpd则表示使用了prefork,httpd.worker,httpd.event则代表另外两种模式
查看模块列表
httpd -h
httpd -l 查看静态编译的模块,这些功能模块在启动httpd时就会一定会启用。
core.c 核心模块
prefork.c prefork模块
http_core.c http的功能模块
mod_so.c 支持模块装卸载的接口
httpd -M 还有另外一部分的模块是动态装卸载的,此命令查看静态编译和动态装卸载的模块。
===
更换httpd程序
把httpd-->httpd.worker
vim /etc/sysconfig/httpd编辑此文件
启用HTTPD=/usr/sbin/httpd.worker
(HTTPD=/usr/sbin/httpd.event)
此时更换为httpd.worker了
(备注:httpd.event在httpd-2.2中是测试使用的)
然后重启服务
ps aux | grep httpd
可以查看到使用httpd.worker/httpd.event
httpd.worker -l
httpd.event -l
httpd和httpd.worker在/etc/http/conf/httpd.conf文件中均有相关的配置项
<IfModule prefork.c> 如果加载prefork.c模块
StartServers 8 启动时工作进程数
MinSpareServers 5 最少空闲工作进程数
MaxSpareServers 20 最多空闲工作进程数
ServerLimit 256 最多工作进程数
MaxClients 256 允许最多的客户端连接
MaxRequestsPerChild 4000 每个工作进程服务的最大请求数,超过此数值进程会被重启?
</IfModule>
<IfModule worker.c>
StartServers 4 启动时工作进程数
MaxClients 300 工作进程数最大值
MinSpareThreads 25 最少空闲进程数
MaxSpareThreads 75 最大空闲进程数
ThreadPerChild 25 每个进程允许启动的线程数
MaxRequestsPerChild 0 每个工作进程服务的最大请求数,0表示无限制
</IfModule>
上述配置会导致进程启动是4个工作进程,然后有一个进程会被杀死
worker并发请求300*25=7500
每个请求处理需要1s
一分钟可以处理7500*60=450000次连接
一个小时可以处理450000*60=27000000次连接
每天高峰访问8个小时27000000*8=216000000次连接
每个页面平均需要100次连接处理
那么每天PV就是216000000/100=2160000=216万
④DSO机制:动态装卸载模块
httpd安装时把模块都安装在此路径下:/usr/lib64/httpd/modules/*.so
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
模块路径可以相对路径,相对于ServerRoot(/etc/httpd/),该目录下有链接文件modules指向/usr/lib64/httpd/modules/。不过建议使用绝对路径
httpd -M可以查看已经装在的所有模块
/etc/http/conf/httpd.conf文件中有众多LoadModule指令指明加载了哪些模块,将其注释则表示不加载此模块
reload重载服务生效
⑤定义主服务器main server文档页面路径
只提供一个网站服务
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
DocumentRoot "/var/www/html/"
http://HOST:PORT/test/index.html --> /var/www/html/test/index.html
mkdir -p /www/htdocs/
vim /www/htdocs/index.html
修改/etc/http/conf/httpd.conf文件中DocumentRoot指明的路径为
DocumentRoot "/www/htdocs/"
修改完成后,重载服务reload
修改DocumentRoot后还需要修改站点访问控制以授权用户访问新目录,在httpd-2.4上要求如此。在httpd-2.2上则无需修改。
<Directory "/var/www/html">
⑥站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
a.文件系统路径:
<Directory ""></Directory>
<File ""></File> 对单个文件控制
<FileMatch ""></FileMatch> 文件正则表达式,尽量不使用,因为匹配文件比较耗费系统资源?
b.URL路径:
<Location ""></Location>
<LocationMatch ""></LocationMatch>
访问控制机制:
基于来源地址,ip容易伪装
基于账号
⑦在Directory中基于来源地址实现访问控制
<Directory "/var/www/html/">
Options Indexes FollowSymLinks
用户对该目录的访问属性,具体的属性值在Options文档上面的注释内容中,例如Indexes FollowSymLinks等等
Indexes:索引,当用户访问站点没有指明指定页面文件时返回的页面,默认页面在DirectoryIndex指令中指明。DirectoryIndex可以指定的多个默认页面则会从左到右查找。而如果都没有的话,则会返回目录下的所有文件,也就把整个网站源码暴露给别人了,这是非常危险的。除非在下载网站中可以使用。
测试时,修改<Directory "">的指向为DocumentRoot,需要移除welcome.conf和index.html文件,才能看到indexes的网页文件列表效果
-Indexes表示不启用该项
FollowSymLinks:当DocumentRoot含有链接文件且被访问时,是否允许访问链接指向文件,这是危险的!不建议使用
有一个相似的选项SymLinksifOwnerMatch,如果链接文件的属主和目标文件属主是同一个则允许?
ExecCGI是否允许执行CGI脚本
MultiViews多视图,显示中文?性能差有风险
Includes?
测试时使用All,生产环境时使用None
AllowOverride None
是否允许此处定义的访问规则去覆盖<Directory "">指明目录的所有字母下的.htaccess,None表示不覆盖
httpd-2.2支持每目录访问控制,只需在目录下创建.htaccess即可
基于地址来源的访问控制机制
Order allow,deny
表示检查次序,先检查deny指令后检查allow指令;Order deny,allow则表示先检查allow,后检查deny。
Allow from all,from后面
具体IP
网段 1.2
1.2.0.0
1.2.0.0/16
1.2.0.0/255.255.0.0
配置示例
Order allow,deny
Deny from 1.2.3.4
Allow from 1.2
elinks -dump http://IP/test.html
</Directory>
2、主服务配置(只提供一个站点,和③冲突,不能同时启用)
3、虚拟主机(提供多个站点,和②冲突,不能同时启用)
⑧日志功能的设定
httpd的日志主要有两个——访问日志和错误日志,相关的配置指令详解如下:
ErrorLog logs/error_log
这个相对路径是相对于ServerRoot(/etc/httpd/)而言,其绝对路径应该是/etc/httpd/logs/error_log,而/etc/httpd/logs/是指向/var/log/httpd/error_log?目录的链接文件
错误日志应该设定日志记录级别,低于某个级别的日志不应该记录,否则日志量会非常大且不必要。错误日志的级别有以下:
debug, info, notice, warn, error, crit, alert, emerg
级别的等级自左往右升高。debug, info, notice出于排错的目的,否则不应该记录的。默认是warn,那么warn和比warn级别高的日志都应该记录
LogLevel warn
访问日志
CustomLog logs/access_log combined
combined是一种日志格式,在某个LogFormat指令中进行定义了。所以,可以修改其默认的日志定义格式。
%h,%l,%u都是宏,会被替换为具体信息
%h:客户端ip
%l:登录用户名,大多数为空,用-表示
%u:用户认证时的用户名,基于basic或digest的认证登录,-表示为空
%t:服务器收到页面请求时的时间
\":表示就是显示"
%r:请求报文的首行信息——请求方法,URL,协议版本
%>s:请求状态码,比如200,304,502
%b:响应报文的字节数(不包含响应报文首部)
%{Referer}i:请求报文中"Referer"首部的值,表示,链接到此页面的跳转地址。-表示为空,空表示浏览器直接键入地址,不是通过其他链接跳转的。
%{User-Agent}i:请求报文中"User-Agent"首部的值,表示,发出请求的应用程序,比如浏览器,curl,elinks,ab(压力测试),爬虫程序等。
详情请查看官方文档
http://httpd.apache.org/docs/2.2/logs.html
查看日志文件 /var/log/httpd/access_log
⑩路径别名
DocumentRoot "/www/htdocs/"
http://www.abc.com/download/bash-4.4.5.el6.x86_64.rpm --> /www/htdocs/download/bash-4.4.5.el6.x86_64.rpm
Alias /URL/ "/PATH/TO/SOMEDIR/"
注意两个/必须对应有或者没有
Alias /bbs/ "/forum/htdocs/"
http://www.abc.com/bbs/index.html -->
/forum/htdocs/index.html
bbs/index.html不再从DocumentRoot开始了
Alias /bbs/ "/forum/" 当访问URL中包含/bbs/则到/forum/目录下查找相关页面文件
当访问http://www.abc.com/bbs/index.html时,做别名之前访问的是[DocumentRoot]/bbs/index.html,做了别名后其实访问的是/forum/index.html
⑾设定默认字符集
网站编码格式
UTF8编码——支持全球访问
中文——GBK,GB2312
例如,网站源文件编码是GBK,设定web服务器对其解码时,应该也要支持GBK。而且浏览器也应该支持GBK。
如何设定默认字符集
AddDefaultCharset UTF-8
GBK,GB2312,GB18030
⑿基于用户的访问控制
当用户访问特定资源/敏感资源时,需要先做用户认证质询,用户输入凭证后发还给服务器,服务器验证通过后才把用户请求的内容发过来
认证质询:
WWW-Authenticate:响应码为401,拒绝客服端请求,并要求用户提供账号密码
认证:
Authorization,客户端用户填入账号和密码后再次发送请求报文,认证通过后服务器发送响应的资源
认证时的认证方法:
basic:明文认证方案,存在安全风险
可以放在https中进行
digest:基于消息摘要认证,客户端发给服务器端的报文是经过md5的摘要信息
老版本的浏览器不支持digest
以上两种认证都是http协议辅助完成的认证。而现在大多数认证都是表单认证,认证的内容是web服务器中的程序完成的,而不是借助http协议完成的认证。
这种认证方式应用场景:比如访问[DocumentRoot]/admin/目录下存在敏感的页面资源,而web端又没有表单认证的应用程序时,才借助http的认证辅助完成。[DocumentRoot]/admin/这个目录称为安全域。
basic认证机制存储
用户的账号和密码存储于何处?
虚拟账号:仅用于访问某服务时用到的认证标识。
账号存储:文本文件,mysql数据库,ldap轻量目录访问协议,nis
演示:
basic基于文本存储认证
a.定义安全域
<Directory "/PATH/TO/SOME/DIR/">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2
#Require valid-user 允许账号文本中的所有用户
</Directory>
vim [DocumentRoot]/admin/index.html
配置文件/etc/http/conf/httpd.conf任意位置添加
<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "for admin only"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
#Require user tom
Require valid-user
</Directory>
退出编辑重载服务reload
b.提供账号和密码存储(文本文本)
使用htpasswd工具来进行管理
man htpasswd 查看帮助文档
htpasswd [options] passwordfile username
-c:自动创建passwordfile,仅在创建第一个用户时使用
-m:使用md5加密用户密码
-s:使用sha1加密用户密码
-D:删除指定用户
htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom
输入密码:
htpasswd -m /etc/httpd/conf.d/.htpasswd jerry
输入密码:
然后重在服务reload
访问http://IP/admin/
输入用户和密码即可登陆
c.基于组进行认证
配置文件/etc/http/conf/httpd.conf任意位置添加
<Directory "/PATH/TO/SOME/DIR/">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2 ...
#Require user username1 username2
#Require valid-user 允许账号文本中的所有用户
</Directory>
要提供用户账号文件和组文件
用户帐号文件使用htpasswd命令来创建
组文件:每一行定义一个组
GROUP_NAME: user1 user2 user3 ... 这些用户必须存在于用户账号文件中
演示组认证:
添加第三个用户,把其中两个用户构建成组
htpasswd -m /etc/httpd/conf.d/.htpasswd obama
vim /etc/httpd/conf.d/.htgroup
webadmin: tom obama
修改配置文件/etc/http/conf/httpd.conf
<Directory "/www/htdocs/admin">
Options None
AllowOverride None
AuthType Basic
AuthName "for admin only"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmin
#Require user tom
#Require valid-user
</Directory>
重载服务reload
访问页面: tom和obama是可以的
可以用到nagios监控页面中
⒀虚拟主机
访问一个页面需要的元素 hostname,ip,port
http://hostname(ip):port/
基于主机名访问web服务时,主机名会被替换为ip地址的,所以主机名如何才能传到web服务呢?报文需要添加http首部,tcp首部,ip首部,帧首部。在http首部中定义了很多键值对形式的首部(名称 值),其中的Host就是对应主机名信息的。所以web服务是可以获取到浏览器中键入的到底是什么主机名的。所以这个主机名的传输是在应用层首部实现的,并且在通信过程中不能发挥作用。
三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址,时很少使用
基于port:为每个虚拟主机准备至少一个专用port,对外公开时很少使用
基于hostname:为每个虚拟主机准备至少一个专用hostname
可混合使用上述三种方式的任意方式:
注意:一半虚拟主机莫与中心主机混用,所以要使用虚拟主机,先禁用中心主机,方法是注释DocumentRoot
每个虚拟主机都有专用配置
<VirtualHost "IP:PORT">
ServerName
DocumentRoot ""
</VirtualHost>
ServerAlias: 虚拟主机别名
ErrorLog
CustomLog
<Directory "">
</Direcotry>
先注释中心主机:DocumentRoot
示例1:基于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>
检查配置文件是否出错
service httpd configtest
httpd -t
mkdir -pv /vhosts/{web1,web2,web3,web4}/htdocs/
vim /vhosts/web1/htdocs/index.html
vim /vhosts/web2/htdocs/index.html
vim /vhosts/web3/htdocs/index.html
vim /vhosts/web4/htdocs/index.html
reload服务
ifconfig
eth0 172.16.100.6
eth0添加多一个地址
ip addr add 172.16.100.7/16 dev eth0
此时访问
http://172.16.100.7
http://172.16.100.6
示例2:修改配置基于端口访问
<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>
<VirtualHost 172.16.100.7:8080>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs/"
</VirtualHost>
Listen 80
Listen 8080
#Listen 80 8080这样子写可否?
重启服务
http://172.16.100.7:8080
http://172.16.100.7
http://172.16.100.6
示例3:基于主机名
http-2.2需要启用NameVirtualHost 172.16.100.6:80,http-2.4则不需要
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs/"
</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>
#注意:所有虚拟主机使用的都是相同的ip地址
重载服务
windows修改hosts文件
IP hostname1 hostname2 hostname3
使用主机名来访问得到不同的页面内容
curl http://web1.magedu.com
curl http://web2.magedu.com
curl http://web3.magedu.com
修改配置
<VirtualHost 172.16.100.6:80>
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs/"
CustomLog logs/web1_access_log combined
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs/"
CustomLog logs/web2_access_log combined
</VirtualHost>
<VirtualHost 172.16.100.6:80>
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs/"
CustomLog logs/web3_access_log combined
</VirtualHost>
<VirtualHost 172.16.100.7:80>
ServerName web4.magedu.com
DocumentRoot "/vhosts/web4/htdocs/"
CustomLog logs/web4_access_log combined
</VirtualHost>
httpd -t
reload服务
⒁内置的status页面
开启配置即可
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16
</Location>
httpd -t
reload服务
http://IP/server-status
这个页面要做用户账号的basic认证
===
使用mod_deflate模块压缩网页,节约带宽,提升网站响应速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
(2) 压缩适于压缩的资源,例如文件文件;
需要指令加载该模块吗?要的,默认是启用的
LoadModule deflate_module modules/mod_deflate.so
#调用DEFLATE的输出过滤器,这个过滤器默认动作就只有压缩?
SetOutputFilter DEFLATE
#向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.
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
http -t 检查语法
httpd -M | grep deflate 检查是否装载此模块
重载服务
可以在谷歌浏览器中F12查看响应报文的首部
Content-Encoding: gzip
curl -I --compressed http://IP
指明支持压缩,这样响应报文就是压缩格式的
===
https
基于ssl协议完成的http传输
ssl是安全套接字层
ssl多数是使用tls版本1.0
https事务——详细的通讯过程
1、客户端连接服务器TCP/443端口
2、基于TCP连接建立SSL安全参数握手,协商加密算法,客户端验证服务器证书
3、在SSL上发送HTTP请求/在TCP上发送已加密的请求
4、在SSL上发送HTTP响应/在TCP上发送已加密的响应
5、SSL关闭通知
6、TCP连接关闭
客户端验证站点证书有效性,步骤如下:
1、日期检测
2、签名颁发者可信度检测
3、签名检测
4、站点身份检测
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 -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]
查看https搭建案例即可
<VirtualHost *.443>
<VirtualHost IP.443>
以上两种都可以,SSL只能基于IP
===
httpd自带的工具程序
rpm -ql httpd | grep bin
/usr/sbin/apachectl 是一个shell脚本,可以控制httpd程序的启动和停止。比如apachectl stop;apachectl restart;没有服务启动脚本时可以借助它完成服务的控制
apxs:辅助使用httpd的第三方模块,比如编译第三方模块,很少手动使用该工具
yum install httpd-devel
rotatelogs: 日志滚动工具
access.log --> access.log, access.1.log -->
access.log, access.1.log, access.2.log
suexec: 用户切换运行
/var/log/secure来做演示
当apache用户对某个页面文件没有读取权限,用户通过URL请求该文件时,访问是被禁止的。当apache无权访问某文件时,suexec可以切换到指定用户来访问之。
===
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的常用选项:
-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
用法:curl [options] [URL...]
curl http://IP,FQDN
curl -A "IE11" http://IP,FQDN 可以伪装成其他客户端类型/其他的浏览器
curl -e "http://www.google.com.hk/search" http://IP,FQDN 可以伪装成由谷歌搜索跳转访问的
-H/--header 可以自定义首部信息传输给服务器
-I 只请求响应首部的内容
elinks
yum install elinks
elinks http://IP,FQDN 进入全屏界面
elinks -dump http://IP,FQDN
===
http压力测试工具
命令行工具
ab: apache benchmark,测试效果有限,httpd程序自带,只能对单个URL做测试,并不能真正模拟生产环境的访问
webbench,测试效果有限
http_load,测试效果有限
专业级测试工具
需要自定义测试逻辑,自行编写测试文件
jmeter:开源工具
loadrunner:商业工具,功能异常强大,测试工程师的专业工具,有相关认证
tcpcopy
网易研发,工作原理:把对旧服务器的访问流量保存在一个文件中,tcpcopy可以读取该文件的访问条目,并对新机器做访问重放。真正实现了模拟生产环境的访问。
ab [OPTION] URL
-n: 总的请求数
-c:模拟的并发数
-k:以持久连接模拟测试
ulimit -n #:调整当前用户所同时打开的文件数
ulimit -n 65535
yum install httpd
ab -c 100 -n 100000 http://URL