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文件中均有相关的配置项

 如果加载prefork.c模块

StartServers  8   启动时工作进程数

MinSpareServers 5 最少空闲工作进程数

MaxSpareServers 20  最多空闲工作进程数

ServerLimit 256 最多工作进程数

MaxClients  256 允许最多的客户端连接

MaxRequestsPerChild 4000  每个工作进程服务的最大请求数,超过此数值进程会被重启?





StartServers  4   启动时工作进程数

MaxClients  300   工作进程数最大值

MinSpareThreads 25  最少空闲进程数

MaxSpareThreads 75  最大空闲进程数

ThreadPerChild  25  每个进程允许启动的线程数

MaxRequestsPerChild 0  每个工作进程服务的最大请求数,0表示无限制

上述配置会导致进程启动是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

模块路径可以相对路径,相对于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上则无需修改。


⑥站点访问控制

可基于两种类型的路径指明对哪些资源进行访问控制

a.文件系统路径:

 

  对单个文件控制

  文件正则表达式,尽量不使用,因为匹配文件比较耗费系统资源?

b.URL路径:

 

 

  

访问控制机制:

  基于来源地址,ip容易伪装

  基于账号


⑦在Directory中基于来源地址实现访问控制

  Options Indexes FollowSymLinks

      用户对该目录的访问属性,具体的属性值在Options文档上面的注释内容中,例如Indexes FollowSymLinks等等

      Indexes:索引,当用户访问站点没有指明指定页面文件时返回的页面,默认页面在DirectoryIndex指令中指明。DirectoryIndex可以指定的多个默认页面则会从左到右查找。而如果都没有的话,则会返回目录下的所有文件,也就把整个网站源码暴露给别人了,这是非常危险的。除非在下载网站中可以使用。

      测试时,修改的指向为DocumentRoot,需要移除welcome.conf和index.html文件,才能看到indexes的网页文件列表效果

      -Indexes表示不启用该项

      

      FollowSymLinks:当DocumentRoot含有链接文件且被访问时,是否允许访问链接指向文件,这是危险的!不建议使用

      有一个相似的选项SymLinksifOwnerMatch,如果链接文件的属主和目标文件属主是同一个则允许?

      ExecCGI是否允许执行CGI脚本

      MultiViews多视图,显示中文?性能差有风险

      Includes?

      

      测试时使用All,生产环境时使用None      

      

  AllowOverride None

      是否允许此处定义的访问规则去覆盖指明目录的所有字母下的.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




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.定义安全域

 

    Options None

    AllowOverride None

    AuthType Basic

    AuthName "String"

    AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"

    Require user username1 username2

    #Require valid-user 允许账号文本中的所有用户 

 

  

  vim [DocumentRoot]/admin/index.html

  配置文件/etc/http/conf/httpd.conf任意位置添加

 

    Options None

    AllowOverride None

    AuthType Basic

    AuthName "for admin only"

    AuthUserFile "/etc/httpd/conf.d/.htpasswd"

    #Require user tom

    Require valid-user

 

  退出编辑重载服务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任意位置添加

 

    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 允许账号文本中的所有用户

 


  要提供用户账号文件和组文件

  用户帐号文件使用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

 

    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

 

  

  重载服务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

  

  每个虚拟主机都有专用配置

 

    ServerName

    DocumentRoot ""

   

  

  ServerAlias: 虚拟主机别名

  

  ErrorLog

  CustomLog

 

 


先注释中心主机:DocumentRoot

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

  ServerName web1.magedu.com

  DocumentRoot "/vhosts/web1/htdocs/"


  ServerName web2.magedu.com

  DocumentRoot "/vhosts/web2/htdocs/"


检查配置文件是否出错

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:修改配置基于端口访问

  ServerName web1.magedu.com

  DocumentRoot "/vhosts/web1/htdocs/"


  ServerName web2.magedu.com

  DocumentRoot "/vhosts/web2/htdocs/"


  ServerName web3.magedu.com

  DocumentRoot "/vhosts/web3/htdocs/"


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则不需要

  ServerName web1.magedu.com

  DocumentRoot "/vhosts/web1/htdocs/"


  ServerName web2.magedu.com

  DocumentRoot "/vhosts/web2/htdocs/"


  ServerName web3.magedu.com

  DocumentRoot "/vhosts/web3/htdocs/"


#注意:所有虚拟主机使用的都是相同的ip地址


重载服务


windows修改hosts文件

IP hostname1 hostname2 hostname3


使用主机名来访问得到不同的页面内容

curl http://web1.magedu.com

curl http://web2.magedu.com

curl http://web3.magedu.com


修改配置


  ServerName web1.magedu.com

  DocumentRoot "/vhosts/web1/htdocs/"

  CustomLog logs/web1_access_log combined


  ServerName web2.magedu.com

  DocumentRoot "/vhosts/web2/htdocs/"

  CustomLog logs/web2_access_log combined


  ServerName web3.magedu.com

  DocumentRoot "/vhosts/web3/htdocs/"

  CustomLog logs/web3_access_log combined


  ServerName web4.magedu.com

  DocumentRoot "/vhosts/web4/htdocs/"

  CustomLog logs/web4_access_log combined



httpd -t

reload服务



⒁内置的status页面

开启配置即可

  SetHandler server-status

  Order deny,allow

  Deny from all

  Allow from 172.16


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搭建案例即可


以上两种都可以,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 设置用户代理发送给服务器

    -basic 使用HTTP基本认证

    --tcp-nodelay 使用TCP_NODELAY选项

    -e/--referer 来源网址

    --cacert CA证书 (SSL)

    --compressed 要求返回是压缩的格式

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

    -I/--head 只显示响应报文首部信息

    --limit-rate 设置传输速度

    -u/--user 设置服务器的用户和密码

    -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