HTTPHyper Text Transfer Protocol超文本传输协议

HTMLHyper Text Mark-up Language超文本标记语言

URIUniform Resource Identifier统一资源提示符

URLUniform Resource Locator统一资源定位符


http协议的版本:

    http0.9只能传输html文档,1991年

    http1.0支持多媒体数据的处理,保持连接。有缓存功能

    http1.1支持更多的请求方法,更加精细的缓存控制,持久连接


MIME:Multipurpose Internet Mail Extensions多用途互联网邮件扩展

  base64:将二进制数据编码成文本发送,并能够让接受方还原回原来的格式


MIME:多媒体类型

   major/minor

       HTMLtext/html

       ASCIItext/plagin

       JPEGimage/jpeg

       GIFimage/gif

       QuickTime(流媒体)video/quicktime


HTTP事务:一次请求以与其对应的响应

HTTP方法:GET、PUT、HEAD、POST、DELETE


HTTP请求:request

    HTTP请求报文

       报文格式:

         <method><request-url><version>

         <headers>

         <entity-body>


HTTP响应:response

    HTTP响应报文

    报文格式:

       <version><status><reason-phrase>

       <headers>

       <entity-body>


     <method>请求方法,希望服务器端执行的动作,如GET、HEAD、POST等

     <request-url>请求的资源,可以是相对路径,也可以是完整的URL

     <version>协议版本,格式HTTP/<major>.<minor>,如http/1.0

     <headers>HTTP首部

     <status>状态码

     <reason-phrase>原因短语,数字状态码易读信息

     <entity-body>主体部分


http协议:是一种stateless(无状态)协议一次HTTP事务结束后,链接自行断开

加速方式:并行请求、持久连接


HTTP的请求方法:GET、HEAD、POST、PUT、DELETE、OPTIONS、TRACE

      扩展方法:LOCK、MKCOL、COPY、MOVE


     GET请求获取一个资源,需要服务器发送

     HEAD跟GET相似,但其不需要服务发送资源而仅传回响应首部

     POST支持HTML表单提交,表单中有用户填入的数据,这些数据会发送到服务器端,由服务器存储至某位置(例如发送处理程序)

     PUT与GET相反,向服务写入文档,如发布系统

     DELETE请求删除URL指向的资源

     OPTIONS探测服务器端对某资源所支持的请求方法

     TRACE追踪请求资源要经过的防火墙、代理或网关等


响应报文代码

   1XX:信息性状态码

   2XX:成功状态码

       200:OK

       201:(已创建)请求成功并且服务器创建了新的资源

   3XX:重定向状态码

       301:Moved Permanebtly 永久重定向,在响应报文中使用首部“Location:URL”指定资源现在所在的位置

       302:Found 临时重定向,在响应报文中使用首部“Location:URL”指定临时资源位置

       304:Not Modified,条件式请求中使用

   4XX:客户端的错误

       403:Forbidden,请求被服务器拒绝

       404:Not Found,服务器无法找到请求的URL

       405:Method Not Allowed,不允许使用此方法请求响应的URL

   5XX:服务器类的错误

       500:Internal Server Error,服务器内部错误

       502:Bad Gateway:代理服务器从上游收到一条伪响应

       503:Service Unavailable,服务器此时无法提供服务,但将来可能可用


HTTP首部

    通用首部:请求和响应都可以使用的

    请求首部:请求报文使用

    响应首部:响应报文使用

    实体首部:用于指定实体属性

    扩展首部:非标准首部,可能是由程序开发者创建的,例如X-Forward-For


通用首部:

    Connection定义C/S之间关于请求/响应的有关选项,对于http/1.0,Connection为keep-alive

    Via显示了报文经过的中间节点

    Cache-Control缓存指示,通过指定首部字段Cache-Control,就能操作缓存的工作机制

    Pragma只用在客户端发送的请求中,所有的中间服务器不返回缓存的资源


请求首部:

    Cilent-IP         请求端I地址

    Host请求的主机名和端口号,虚拟主机环境下用于不同的虚拟主机

    Referer指明了请求当前资源的原始资源的URL

    User-Agent用户代理,使用什么工具发出的请求


Accept首部:用户标明客户自己更倾向于支持使用的能力

    Accept指明服务器能发送的媒体类型

    Accept-Charset支持使用的字符集

    Accept-Encoding支持使用的编码方式

    Accept-Language支持使用的语言


条件请求首部:

    Expect客户端使用首部字段Except来告知服务器,期望出现的某种指定行为

    If-Modified-Since是否在指定的时间以来修改过此资源

    If-None-Match该字段值得实体标记值与请求资源的ETag不一致时,它就告知服务器处理该请求


跟安全相关的请求首部:

    Authorication客户端提交给服务端的认证数据,如账号和密码

    Cookie客户端发送给服务器端身份标识

    Cookie2客户端发送给服务器端身份标识


响应首部:

    Age响应持续的时间

    Server向客户端标明服务器程序名称和版本


协商首部:

    Accept-Ranges对当前资源来讲,服务器所能够接受的范围类型

    Vary首部列表,服务器会根据列表中的内容挑选出最适合的版本发送给客户端


跟安全相关的响应首部

    Set-Cookie服务器端在某客户端第一次请求时发给的令牌

    Set-Cookie2服务器端在某客户端第一次请求时发给的令牌

    WWW-Authenication质询,即要求客户端提供账号和密码


实体首部:

    Location资源的新位置

    Allow允许对此资源使用的请求方法


内容首部:

    Content-Encoding告知客户端服务器对实体的主体部分选用的内容编码方式

    Content-Language告知客户端,实体主体使用的自然语言

    Content-Length表明了实体主体部分的大小

    Content-type说明了实体主体内对象的媒体类型,该字段用type/subtype形式赋值

    Content-Range针对范围请求,返回响应时使用的首部字段,能告知客户端作为相应返回的实体的哪个部分符合范围请求

    Content-Location给出与报文主体返回资源对应的URI


缓存首部:

    ETag实体标签

    Expires过期标签

    Last-Modified上一次的修改时间


一个Web请求的基本过程

   建立连接

   接收请求

   处理请求

   访问资源

   构建响应

   发送响应

   记录日志


Web服务器的输入输出结构

    单线程I/O结构

    多线程I/O结构

    复用的I/O结构(一个进程响应多个请求)

    复用多线程I/O结构:多个线程,每个线程响应多个请求


httpd:高度模块化

   core+modules

   DSO:Dynamic Shared Object 动态模块对象

   MPM:Multipath Processing Module,多道处理模块,非一个模块,而是对一种特性的称谓

       prefork一个进程一个请求(预先创建好),

       worker一个进程多个线程,一个线程一个请求

       event一个进程响应多个请求,不生成线程

       event-driven事件驱动,主要目的在于实现单线程响应多个请求


http版本

   http-1.3

   http-2.0

   http-2.2,不支持event

   http-2.4


httpd的功能特性:

   路径别名:alias

   用户认证:authentication

   虚拟主机:virtual host

   反向代理:

       负载均衡:

    用户站点:

    CGI:Common Gateway Interface


安装httpd

yum -y install  httpd

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

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

运行目录/etc/httpd

主配置文件/etc/httpd/conf/httpd.conf

扩展配置/etc/httpd/conf.d/*.conf

文档根目录/var/www/html

CGI/var/www/cgi-bin/

Docroot:文档根目录


配置文件:

    /etc/httpd/conf/httpd.conf

    配置参数 值

    配置指令不区分字符大小写

    值有可能区分大小写

    有些指令可以重复出现多次

   

    配置文件格式

     全局配置

     主机配置用于仅提供一个站点时

     虚拟主机配置用于提供多个站点时

     

    配置文件语法测试

    service httpd configtest

    httpd -t


    绝大多数配置修改后,可以用过service httpd reload 来生效,如果修改了监听的地址或端口,必须重启服务才能生效


1.监听套接字

  Listen [IP:]port

    此指令可以出现多次,用于指定监听多个不同的套接字

       Listen 80

       Listen 172.16.100.7:8080

       

2.配置使用Keepalive

KeepAlive {On|Off}

KeepAliveTimeout 2超时时间

MaxKeepAliveRequests 50 最大连接

未设置keepalive时,一次HTTP事务结束后,链接自行断开。设置keepalive后,超时时间和最大连接只要任一个达到最大值,链接自行断开

设置keepalive前(访问完立即自行断开)

[root@localhost ~]# telnet 192.168.130.121 80

Trying 192.168.130.121...

Connected to 192.168.130.121.

Escape character is '^]'.

GET /index.html HTTP/1.0

HOST:192.168.130.121

HTTP/1.1 200 OK

Date: Wed, 20 Sep 2017 02:04:32 GMT

Server: Apache/2.2.15 (CentOS)

Last-Modified: Wed, 20 Sep 2017 02:04:10 GMT

ETag: "a09cd-72-55995643f9126"

Accept-Ranges: bytes

Content-Length: 114

Connection: close

Content-Type: text/html; charset=UTF-8

<html>

<head>

       <title>httpd学习</title>

</head>

<body>

       <h1>kaiyuandiantang.blog.51cto.com</h1>

</body>

</html>

Connection closed by foreign host.

                                   

设置keepalive后(超时时间和最大连接只要任一个达到最大值,链接自行断开)

[root@localhost html]# telnet 192.168.130.121 80

Trying 192.168.130.121...

Connected to 192.168.130.121.

Escape character is '^]'.

GET /index.html HTTP/1.1

HOST:192.168.130.121

HTTP/1.1 200 OK

Date: Wed, 20 Sep 2017 02:07:31 GMT

Server: Apache/2.2.15 (CentOS)

Last-Modified: Wed, 20 Sep 2017 02:04:10 GMT

ETag: "a09cd-72-55995643f9126"

Accept-Ranges: bytes

Content-Length: 114

Content-Type: text/html; charset=UTF-8

<html>

<head>

       <title>httpd学习</title>

</head>

<body>

       <h1>kaiyuandiantang.blog.51cto.com</h1>

</body>

</html>

Connection closed by foreign host.

3.MPM(多道处理模块)

  httpd -l 查看编译进内核的模块

  想使用不同的机制,修改配置文件即可 /etc/syconfig/httpd文件

  

 <IfModule preforck.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最大空闲线程数

ThreadsPerChild     25每个子进程生成的线程数

MaxRequestsPerChild  0 每个子进程在声明周期内最大允许服务的最多请求个数

</IfModule>

preforck工作机制

[root@localhost html]# ps -elfH | grep httpd

0 S root      25835  25683  0  80   0 - 25817 pipe_w 10:16 pts/2    00:00:00         grep httpd

1 S root      25809      1  0  80   0 - 43848 poll_s 10:06 ?        00:00:00   /usr/sbin/httpd

5 S apache    25811  25809  0  80   0 - 43881 inet_c 10:06 ?        00:00:00     /usr/sbin/httpd

5 S apache    25812  25809  0  80   0 - 43881 inet_c 10:06 ?        00:00:00     /usr/sbin/httpd

5 S apache    25813  25809  0  80   0 - 43848 inet_c 10:06 ?        00:00:00     /usr/sbin/httpd

5 S apache    25814  25809  0  80   0 - 43848 inet_c 10:06 ?        00:00:00     /usr/sbin/httpd

5 S apache    25815  25809  0  80   0 - 43848 inet_c 10:06 ?        00:00:00     /usr/sbin/httpd

5 S apache    25816  25809  0  80   0 - 43848 inet_c 10:06 ?        00:00:00     /usr/sbin/httpd

5 S apache    25817  25809  0  80   0 - 43848 inet_c 10:06 ?        00:00:00     /usr/sbin/httpd

5 S apache    25818  25809  0  80   0 - 43848 inet_c 10:06 ?        00:00:00     /usr/sbin/httpd

[root@localhost html]# 

worker工作机制

[root@localhost html]# ps -elfH | grep httpd

0 S root      26106  25683  0  80   0 - 25817 pipe_w 10:18 pts/2    00:00:00         grep httpd

1 S root      25991      1  0  80   0 - 43900 poll_s 10:18 ?        00:00:00   /usr/sbin/httpd.worker

5 S apache    25993  25991  0  80   0 - 129965 pipe_w 10:18 ?       00:00:00     /usr/sbin/httpd.worker

5 S apache    25994  25991  0  80   0 - 146349 pipe_w 10:18 ?       00:00:00     /usr/sbin/httpd.worker

5 S apache    25997  25991  0  80   0 - 146349 pipe_w 10:18 ?       00:00:00     /usr/sbin/httpd.worker

[root@localhost html]# 


4、DSO模块的加载方式

   LoadModule module_name /path/to/module

      如果使用相对路径,则对于ServerRoot所定义的位置而言

      LoadMoudule php5_module /usr/lib64/httpd/modules/php.so

      让服务重载配置文件方能生效

   

   httpd -m 列出与加载到所有DSO模块与非DOS模块

      取消 注释掉即可

      

5、配置站点根目录

    DocumentRoot /path/to/somewhere


6、页面访问属性

    <Direcotry "/path/to/somewhere">

       Options 选项

          Indexes缺少指定的默认页面时,允许将目录中的所有文件以列表形式返回给用户:危险:慎用

          FollowsymLinks允许跟随符号链接所指向的原始文件

          None所有都不启用

          All所有的都启用

          ExecCGI允许使用mod_cgi模块执行CGI脚本

          Includes允许使用mod_include模块实现服务器端包含(SSI)

          IncludesNOEXEC允许包含但不允许执行脚本

          MultiViews允许使用mod_negotiation实现内容协商

          SymLinksIfOwnerMatch在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号连接所指向的原始文件

       AllowOverride

    </Direcotry>

     可以使用正则表达式,使用~


7.基于主机的访问控制

   <Direcotry "/path/to/somewhere">

     Options 

     AllowOverrideNone 不禁用下面

     orderallow,deny没有允许的都拒绝

     orderdeny,allow没有拒绝的都允许

     Allow from允许来至指定主机访问

     Deny from拒绝来至指定主机访问

    </Direcotry>


   如果都匹配或都不匹配时以默认为准

   否则则以匹配到的为准

    Allow from

    Deny from

       IP,Network Address

       172.16

       172.16.0.0

       172.16.0.0/16

       172.16.0.0/255.255.0.0


8.定义默认主页面

   DirectoryIndex 依次查找


9.用户目录

    如果期望让每个用户都可以创建个人站点:http://Server_IP/~Username/

    userdir disablied禁止用户目录

    userdir public_html启用用户目录

          public_html是用户家目录下的目录名称,所有位于此目录中的文件均可通过前述的访问路径进行访问

          用户的家目录得赋予进行httpd进程的用户拥有执行权限

       setfacl -m u:apache:x /home/Username

    

    修改配置文件

    userdir public_html

    service httpd restart

    

    创建用户及目录

    useradd test

    mkdir /home/test/public_html

    

    修改权限

    setfacl -m u:apache:x /home/test

    

    测试

    http://192.168.130.121/~test

    


10、配置日志功能

   /var/log/http/

       access.log访问日志,其需要记录的内容需要自定义

       error.log错误日志

      

      访问日志:

        CustomLog "/path/to/log_file" LogFormat

        LogFormat定义日志格式

        "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""

        %h客户端地址

        %l远程的登录名,通常为-

        %u认证时的远程用户名,通常为-

        %t接收到的请求时的时间,为标准英文格式时间+时区

        \"转义,显示""

        %r请求报文的起始行

        %>s响应状态码

        %b以字节响应报文的长度,不包含http报文

        %{Header_Name}i记录指定请求报文首部的内容(value)

        %u请求的URL

        

     详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats


11、路径别名

   Alias /alias/ "/path/to/somewhere"

    意味着访问http://Server_IP/alias时,其页面文件来自于/path/to/somewhere中


12、指定默认的字符集

     AddDefaultCharset 


13.脚本路径别名(CGI接口)

   URL-->FileSystem Directory

   CGI:Common Gateway Interface(通用网关接口)使WEB可以跟一个应用程序进行通信,从通信环境中获得结果。

   CGI是不安全的,在第一行写入"echo “Content-Type:text/html"

   mod_alias,mod_cgi

   ScriptAlias /URL/ "/path/to/somewhere" somewhere下的文件可以被执行,也可以在目录中实现


  [root@localhost ~]# cat /var/www/cgi-bin/test

#!/bin/bash

cat << EOF

Content-Type:text/html

<pre>

       <h1> The hostname is : `hostname`.</h1>

       The time is : `date`.

</pre>

EOF

[root@localhost ~]#  

[root@localhost ~]# cd /var/www/cgi-bin/

[root@localhost cgi-bin]# chmod +x test

http://192.168.130.121/cgi-bin/test

14.基于用户的访问控制

  虚拟用户:不是系统用户,只是为了获取某种资源类型的一种虚拟的用户

  文件/etc/httpd/conf/.htpasswd

  SQL数据库

  dbm

  ldap轻量级目录访问协议

  认证类型(auth):

      basic基本认证,账号和密码明文发送

      digest摘要认证,hash编码之后发送

  认证提供者(authentication provider):账号和密码的存放位置

  授权机制(authorization)根据什么进行授权

  

  

  案例:基于文件,做基本认证根据用户和组进行授权

  1、编辑配置文件,为需要认证的目录配置认证机制

  <Directory "/www/htdocs/fin">A

      options None

      AllowOverride AuthConfig     使用认证配置

      AuthType Basic                        使用基本认证

      AuthName "Private Area"     质询时标题

      AuthUserFile /etc/http/conf/.htpasswd 密码的存放位置

      Require vaild-user                    可访问的用户

  </Directory>

  

  2、使用htpsswd命令生成认证库

    htpasswd 

    -c 创建密码,创建第一个用户时使用

    htpasswd -c -m /etc/http/conf/.htpasswd tom

    -m MD5格式存放

    -b 批量模式

    -D 删除用户

    

  3、基于组认证

  <Directory "/www/htdocs/fin">

      options None

      AllowOverride AuthConfig使用认证配置

      AuthType Basic 使用基本认证

      AuthName "Private Area"                 质询时标题

      AuthgroupFile /etc/http/conf/.htpasswd  密码的存放位置

      Require group GroupName         可访问的用户

  </Directory>

  

  先创建用户,在创建组

  组文件:

    组名:用户1 用户2 用户3


 15.虚拟主机

     一个物理服务器提供多个站点;使用虚拟主机得先取消中心主机

     基于不同的IP实现不同的虚拟主机

        变化IP

     基于不同的port实现不同的虚拟主机

        变化port

     基于不同主机名实现不同的虚拟主机

        变化ServerName的值

    通过请求报文中的HOST来实现不同的虚拟主机访问

    <VirtualHost IP:port>

      SeverName

      DocumentRoot ""

      <Directory "">

      </Directory>

      ServerAlias

      ServerAdmin

    </VirtualHost>

    将全局中的DocumentRoot""注释掉


基于IP实现虚拟主机

<VirtualHost 192.168.130.121:80>

        ServerName www.a.com

        DocumentRoot "/var/www/html/a.com"

</VirtualHost>

<VirtualHost 192.168.130.122:80>

        ServerName www.b.com

        DocumentRoot "/var/www/html/b.com"

</VirtualHost>

基于端口实现虚拟主机

Listen 80

Listen 8080

<VirtualHost 192.168.130.121:80>

       ServerName www.a.com

       DocumentRoot "/var/www/html/a.com"

</VirtualHost>

<VirtualHost 192.168.130.121:8080>

       ServerName www.b.com

       DocumentRoot "/var/www/html/b.com"

</VirtualHost>


    基于主机名实现虚拟主机

    NameVirtualHost *:80

<VirtualHost *:80>

       ServerName www.a.com

       DocumentRoot "/var/www/html/a.com"

</VirtualHost>

<VirtualHost *:80>

       ServerName www.b.com

       DocumentRoot "/var/www/html/b.com"

</VirtualHost>

<VirtualHost *:80>

       ServerName www.c.com

       DocumentRoot "/var/www/html/c.com"

</VirtualHost>                                             

                                                

16.https协议

     x509.3证书格式

         证书格式的版本号

         证书序列号

         证书签名算法

         证书颁发者

         有效期

         持有者的名称

         持有者的公钥

         CA的ID

         持有者的ID

         其他扩展信息

              基本约束

              证书策略

              密钥的使用限制

         CA签名

    ssl握手要完成的工作

         交换协议版本号

         选择一个双方都支持的加密方式

         对两端实现身份验证

         密钥交换

    http文本协议 80/tcp

    https二进制格式的协议 443/tcp


    SSL会话基于IP地址进行:不支持在基于主机名的虚拟主机上实现


    客户端验证服务器端证书时:

          日期检查:证书是否在有效期内

          证书颁发者的可信度

          证书的签名检测

          持有者的身份检测




  可以在/etc/pki/tls/certs

  openssl s_client 

  -connet:验证的地址:端口

  -CAfile:CA证书的路径

  

  

httpd:基于mod_ssl模块实现对ssl的支持

1)、安装httpd

yum -y install httpd


2)、准备好服务器的私钥和证书


用openssl实现私有CA:

生成密钥对儿:

cd /etc/pki/CA

(umask 077; openssl genrsa -out private/cakey.pem 2048)

如果想查看公钥:

openssl rsa -in private/cakey.pem -pubout -text

生成自签证书:

openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655

创建需要的文件:

touch index.txt serial crlnumber

用openssl实现证书申请:

在主机上生成密钥,保存至应用此证书的服务的配置文件目录下, 例如:

mkdir /etc/httpd/ssl

cd /etc/httpd/ssl

(umask 077; openssl genrsa -out httpd.key 1024)

生成证书签署请求:

openssl req -new -key httpd.key -out httpd.csr 

将请求文件发往CA;

CA签署证书:

签署:

openssl ca -in /path/to/somefile.csr -out /path/to/somefile.crt -days DAYS

将证书传回请求者

吊销证书:

openssl ca -revoke /path/to/somefile.crt

3)、安装mod_ssl模块

yum -y install mod_ssl

4)、配置/etc/httpd/conf.d/ssl.conf

配置实用ssl的虚拟主机

ServerName

DocunmentRoot

配置证书和私钥

SSLCertificatFile 证书文件

SSLCertificatKeyFile 密钥文件

DocumentRoot "/var/www/html"

ServerName www.kaiyuandiantang.com:443

SSLCertificateFile /etc/httpd/ssl/httpd.crt

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

5)、重启httpd服务

httpd -t

service httpd restart

6)、测试

     openssl s_client -connet验证的地址:端口  -CAfile CA证书的路径

     

     openssl s_client -connect 192.168.130.121:443 -CAfile /etc/pki/CA/cacert.pem 


https://www.kaiyuandiantang.com   

17、使用mod_deflate模块压缩页面优化传输速度,可以写为一行,也可以写多行,默认为gzip


SetOutputFilter DEFLATE


# mod_deflate configuration

<IfModule mod_deflate.c>

 

# 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)默认为6

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


</IfModule>


18、资源限定

    软限制:可以超出的限制,但仅能超出一定时长

    硬限制:绝对不能超出的限制

    ulimit:只能修改软限制

       -n [N]:显示或限制能打开的最大的文件句柄数,

       -u [N]:所能够打开的最大进程数

    如果修改硬限制

      /etc/security/limits.conf,扩展配置etc/security/limits.d/*.conf

对谁进行限定    类型  要限定的选项 值


apache hard nofile65535

apache hard nproc30000


19、ab工具的初步使用

    -c 模拟的并发数

    -n 模拟的总请求数

   一般并发数应该小于等于请求数

   http_load webbench seige(只做参考)

   tcp_copy


20、httpd-2.4 编译安装

依赖于更高版本的apr和apr-util。apr全称为apache portable runtime 


(1) 解决依赖关系 

# yum -y install pcre-devel expat-devel openssh-devel

# yum -y groupinstall "Development tools" "Server Platform Development"

(2) 编译安装apr-1.5.2

# tar xf apr-1.5.2.tar.bz2

# cd apr-1.5.2

# ./configure --prefix=/usr/local/apr

# make && make install


(3) 编译安装apr-util-1.5.4

# tar xf apr-util-1.5.4.tar.bz2

# cd apr-util-1.5.4

# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/

# make && make install


httpd-2.4新特性:

1) MPM支持在运行时装载;

--enable-mpms-shared=all --with-mpm=event

2) 支持event

3) 异步读写

4) 在每模块及每目录上指定日志级别

5) 每请求配置;<If>, <Elseif>

6) 增强版的表达式分析器

7) 毫秒级的keepalive timeout

8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令

9) 支持使用自定义变量


新增了一些模块:mod_proxy_fcgi, mod_ratelimit, mod_request, mod_remoteip


对于基于IP的访问控制做了修改,不再支持使用order, allow, deny这些机制;而是统一使用require进行


(4) httpd编译安装

# tar xf httpd-2.4.27.tar.bz2

# cd httpd-2.4.27

# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=event

# make && make install

(5)测试

# cd /usr/local/apache/bin

# ./apachectl start


(6)服务启动脚本



[root@localhost ~]# cat /etc/init.d/httpd 

#!/bin/bash

#

# httpd        Startup script for the Apache HTTP Server

#

# chkconfig: - 85 15

# description: Apache is a World Wide Web server.  It is used to serve \

#        HTML files and CGI.

# processname: httpd

# config: /etc/httpd/conf/httpd.conf

# config: /etc/sysconfig/httpd

# pidfile: /var/run/httpd.pid


# Source function library.

. /etc/rc.d/init.d/functions


if [ -f /etc/sysconfig/httpd ]; then

        . /etc/sysconfig/httpd

fi


# Start httpd in the C locale by default.

HTTPD_LANG=${HTTPD_LANG-"C"}


# This will prevent initlog from swallowing up a pass-phrase prompt if

# mod_ssl needs a pass-phrase from the user.

INITLOG_ARGS=""


# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server

# with the thread-based "worker" MPM; BE WARNED that some modules may not

# work correctly with a thread-based MPM; notably PHP will refuse to start.


# Path to the apachectl script, server binary, and short-form for messages.

apachectl=/usr/local/apache/bin/apachectl

httpd=${HTTPD-/usr/local/apache/bin/httpd}

prog=httpd

pidfile=${PIDFILE-/var/run/httpd.pid}

lockfile=${LOCKFILE-/var/lock/subsys/httpd}

RETVAL=0


start() {

        echo -n $"Starting $prog: "

        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS

        RETVAL=$?

        echo

        [ $RETVAL = 0 ] && touch ${lockfile}

        return $RETVAL

}


stop() {

  echo -n $"Stopping $prog: "

  killproc -p ${pidfile} -d 10 $httpd

  RETVAL=$?

  echo

  [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}

}

reload() {

    echo -n $"Reloading $prog: "

    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then

        RETVAL=$?

        echo $"not reloading due to configuration syntax error"

        failure $"not reloading $httpd due to configuration syntax error"

    else

        killproc -p ${pidfile} $httpd -HUP

        RETVAL=$?

    fi

    echo

}


# See how we were called.

case "$1" in

  start)

  start

  ;;

  stop)

  stop

  ;;

  status)

        status -p ${pidfile} $httpd

  RETVAL=$?

  ;;

  restart)

  stop

  start

  ;;

  condrestart)

  if [ -f ${pidfile} ] ; then

    stop

    start

  fi

  ;;

  reload)

        reload

  ;;

  graceful|help|configtest|fullstatus)

  $apachectl $@

  RETVAL=$?

  ;;

  *)

  echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"

  exit 1

esac


exit $RETVAL

[root@localhost ~]# 


[root@localhost ~]# cat /etc/httpd24/httpd.conf | grep ^PidFile 

PidFile "/var/run/httpd.pid" 

[root@localhost ~]# chkconfig --add httpd

[root@localhost ~]# chkconfig httpd on

[root@localhost ~]# chkconfig --list httpd

                                   

后续的配置:

1) 导出头文件

# ln -sv /usr/local/apache/include  /usr/include/httpd


2) 导出库文件

# ldconfig

# ldconfig -p


3) 导出man手册

vim /etc/man_db.conf

MANDATORY_MANPATH /usr/local/apache2/man


4) 输出二进制程序

# vim /etc/profile.d/httpd.sh

export PATH=/usr/local/apache/bin:$PATH


练习:配置CGI、虚拟主机、https、mod_deflate、mod_status;


基于IP访问控制:

允许所有主机访问:Require all granted

拒绝所有主机访问:Require all deny


控制某主机的访问:

Require ip IPADDR

Require not ip IPADDR

IPADDR:

单个IP地址, 例如172.16.100.7

Network/Netmask, 例如172.16.0.0/255.255.0.0

Network/Length, 例如172.16.0.0/16

Net: 172.16


Require ip 172.16.0.0/16


Require host HOSTNAME

Require not host HOSTNAME

HOSTNAME:

FQDN:具体的主机

DOMAIN: 域名, 例如.kaiyuandiantang.com