从服务器角度一次web资源请求具体过程

    建立连接:tcp三次握手

    接收请求

    处理请求

    访问资源

    构建响应报文

    发送响应

    记录日志

===================================================================

httpd工作模型

    阻塞模型,单进程模型。缺点:每次只能响应一个请求,对于现代的高并发无满足

        只有一个进程,每次只能响应一个用户的请求 。

    多进程模型,缺点:不停的创建和收回进程,进程间切换也耗费时间。

        httpd监听在套接字上,每当一个客户端请求,它会生成一个子进程来响应,子进程用连接套接字来标记与客户端的连接,处理客户端的请求。由主进程的监听套接字与客户端通信。

    多进程进程池模型,  缺点:进程间切换需要保存现场等,在内核空间耗费大量时间。

        httpd启动时会事先启动一批进程,当多个客户端发起请求时,找一个空间进程响应。当响应完成,该进程并不会回收,而是标记为空闲进程,以等待下次响应请求。有了进程池可以控制并发请求量,它可以控制最多可以启动多少个进程。

    复用的I/O机制:

        用单个线程来响应用户讲求,线程比进程更小的单位,更轻量级,属于进程内部的执行流,可以共享进程内容的资源。线程还是需要不停的切换,不用保护现场。 (linux进程很轻量级,线程和进程区分不是很明显,很多情况下这种机制并不一定会比多进程切换性能好。)

    复用的I/O机制:在进程内部使用某种算法,让一个线程可以同响应多个请求,使用事件驱动机制(event),来得出响应完成于否。这样就可以在多核心的cpu上绑定每个线程运行在一个cpu上,从而减少进程切换。所有请求都由这一个线程来响应。(nginx使用这种模型)

=============================================================  

httpd的特性

    高度模块化:核心程序与模块组成

    DSO:Dynamic Shared Object.模块可以动态装卸载

    MPM:Multipath Processing Module。多道处理模块,由多个模块组成,

        prefork:每个进程响应一个用户请求,提供一个进程池,预先生成多个空闲进程。select():这种机制最稳定,但响应并发数最少,最多只能响应1024个。

        worker:启动多个进程,每个进程生成多个线程,线程响应用户请求

        event:2.2中为实验性的版本,2.4为正式可用。启动多个线程,每个线程响应多个请求。减少了上下文切换。基于event-driven事件驱动机制,使一个进程响应多个用户请求。

    丰富用户认证

         基于认证:使用明文认证

         摘要认证:使用用户名和密码的特征码认证,应用不多,很多浏览器不支持

    支持CGI:原生支持perl CGI

    支持虚拟主机:支持ip,端口,主机名的虚拟主机

    反向代理:文件代理,二进制代理,负载均衡

    用户站点

    路径别名

    支持第三方模块

====================================================================

rpm安装httpd后,经常需要打交道的文件。

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

/etc/httpd/conf.d/*.conf         辅助配置文件

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

/etc/sysconfig/httpd                服务脚本的配置文件

/etc/rc.d/init.d/htcacheclean    httpd做为缓存服务器时,用来清理缓存的脚本

/etc/lib64/httpd/modules        httpd模块的目录,(/etc/httpd/modules是它的链接)

/usr/sbin/httpd                        httpd的主程序

/usr/sbin/apachectl                用来控制httpd服务启动关闭,和查看httpd运行状态的程序

/usr/sbin/httpd.worker            启动worker的工作模式,默认启动 prefork模式。切换模式可修改启动脚本实现。

/usr/sbin/httpd.event               启动基于event的工作模式 (2.2处于试验阶段,不推荐使用)

/var/log/httpd/                        日志文件目录,分两个一个是访问日志,一个是错误日志

        access_log:访问日志,记录用户访问日志

        error_log:错误日志,刻录程序运行时的状态,日志有记录级别。

/var/www/html                        站点文档根目录。可以在配置文件中修改。

/var/www/html/cgi-bin            cgi执行程序根目录。cgi方式一般很少使用,安全性比较差。

====================================================================

常用命令组合

#httpd -l       查看当前http进程加载的主要模块

clipboard

#httpd -D DUMP_MODULES   #查看http进程都加都了那此模块

#httpd -M   #查看http进程都加都了那此模块

htpasswd  用户创建认证用户的

    -c    创建用户时顺便把保存用户名和密码的文件也创建好,只在第一次创建用户没有保存用户的文件时使用

    -m   密码使用md5加密密码

    -s    使用sha加密密码

    -p    不加密密码

    -D    删除用户

      示例:  # htpasswd -m /etc/httpd/conf/.htpasswd wukui

========================================== 

定义httpd的工作特性的主配置文件,有三段组成,第一段全局配置段,定义httpd进程的工作特性,和各虚拟主机共同的工作特性,第二段,网站主服务器的配置,第三段为虚拟主机的配置,第二段和第三段一般不会同时使用,默认启动主服务器配置段。配置文件不区分大小写,但linux文件系统区分大小写。

-----全局配置-----------------------------------------------------------

ServerTokens OS        如果没有访问到页面,服务器会给客户端发本机是操作系统信息,httpd程序版本信息。不安全,应当注释掉。

ServerRoot    "/etc/httpd"     程序的运行目录,定义了此路径后,下面使用的其它相对路径都是相对它的

PidFile    "run/httpd.pid"    PID保存的文件,相对于上面定义的路径

Timeout 60          等待tcp三次握手超时时间,超过后就直接断开。           

KeepAlive {On|off}  是否支持持久连接,服务器繁忙时启动反而降低性能了。

MaxKeepAliveRequests 100    在使用持久连接时,请求资源最多请个数。

KeepAliveTimeout  15    在使用持久连接时,最大请求时间,以秒为单位。与请求资源个数谁先满足谁先生效

EnableSendfile off

<IfModule prefork.c>             prefork模型工作的特性  

StartServers 8                         在程序启动时就启动8个响应用户的进程

MinSpareServers 5                 最少空闲进程,无论任何时候都要有这么多空闲进程。

MaxSpareServers 20               最多空闲进程不应该小于StartServer

ServerLimit 256                       为MaxClinets最多启动进程个数,不应当大于MaxClient

MaxClients 256                        最多同时允许多少个客户端连接,

MaxRequestsPerChild 4000    每个子进程在生命周期内,最多允许处理多少个请求,完成最大数后子进程会被销毁,再创建新进程

</IfModule>                             封装

<IfModule worker.c>               worker工作模式的特性

StartServers 4                           服务启动时就启动4个进程 

MaxClients 300                        最大用户并发请求

MinSpareThreads 25               最少空闲线程数

MaxSpareThreads 75               最多空闲线程数

ThreadsPerChild 25                  每个子进程最多可以启动多少个线程

MaxRequestsPerChild 0            每个线程最多可以处理多少个请求,0表示不做限定

</IfModule>

Listen    80            默认监听的端口,如果这里不写ip表示监听所有ip。Listen可以出现多次。比如下面

Listen 8080            如果修改端口必须重启服务才能生效,重新加载配置无法生效。

LoadModule auth_basic_module modules/mod_auth_basic.so      指定要加载的模块。格式 LoadModule 模块名称  模块文件名。这里使用相对路径,相对ServerRoot指定的路径。

Include conf.d/*.conf        指定主配置文件还有其它文件

User apache                      进程以那个用户身份运行

Group apache                   进程以那个组身份运行

-----主服务器配置-----------------------------------------

特别说明:

<Directory  />                尽量使用<Directory> 而非<Location>

</Directory>                上面与这个directory是成对出现的,每对为一个容器,每个容器是对某个对像做访问控制的。这个容器就是对/做访问控制的。Directory是对文件系统访问路径做访问控制。可以使用通配符,如<Directory ~ "/">

<Location   /server-status>   Location是对请求的URL做访问控制的。把控制的选项写到与标签中,就对/server-status生效了。

</Location>

<File /var/www/html/index.html>     用来控制单个文件的

</File>

ServerAdmin  wukui@wukui.net.cn     指定管理员邮箱,在网页请求出错时,页面会显示

#ServerName   www.wukui.net.cn        指定当前系统的主机名,默认没有启动。它会获取当前主机名,它会反解ip后与当前主机名对比。这时启动服务时会报个错误,主要用来指定系统主机名称的。

UseCanonicaName      Off                   

DocumentRoot "/var/www/html"       指定站点根目录,如果使用虚拟主机。这一项需要注释掉

DirectoryIndex  index.html  index.php      定义页面访问的默认文件,优先级自左而右

站点路径访问控制

    基于本地文件系统路径做访问控制

        <Directory />   定义一个封装容器,这个容器用来对根做访问控制。

         Options FollowSymLinks

        AllowOverride None

        </Directory>

        <Directory />

        <Directory "/var/www/html">

                Options Indexes FollowSymlinks    Options用来定义选项的.

                          Indexes 用来定义如果没有默认页面,会把当前目录下所有文件都例出来。

                          FollowSymlinks  跟踪符号链接文件,如果站点目录下有链接文件,会找到原文件发送给客户端。

                          ExecCGI    是否允许执行CGI脚本                         

                AllowOverride None    是否执行.htaccess文件中的指令,None表示不启用任何指令 All表示执行

                        默认httpd2.2版本,在站点的每个目录下可以创建.htaccess文件,在这个文件中可以定义每个目录的访问权限,可以定义每个目录和文件的访问权限。一般不使用,因为比较影响httpd的性能。

                Order allow,deny    做访问控制,allow为白名单,deny为黑名单,这里表示如果白名单没有匹配到,黑名单生效。

                Allow  from all    白名单为任何为

                       使用格式:Allow from 172.16.0.0/16  白名单为172.16.0.0网络所有主机

                       使用格式:Deny form 192.168.0.1表示拒绝192.168.0.1,黑名单优先级高于白名单。

        </Directory>

    基于URL访路径做访问控制

ErrorLog logs/error_log 定义错误日志文件名

LogLevel  warn    定义记录日志的级别。级别有:debug, info, notice, warn, error, crit, alert, emerg

自定义日志记录的内容和格式

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined  定义的日志格式和名称

        %h  客户端主机ip地址

        %l    远程登陆名  通常为-

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

        %t     服务器收到用户请求时的时间

        \"       表示使用隐号,"有特殊意义\表示转义

        %r     请求报文的起始行,有<method><request-URL><version>三部分组成

        %>s   响应状态码,如404,503等

        %b     响应报文的长度

        %{Referer}i    记录请求由那个url链接过来的,如果为空表示直接打开的。

        %{User-Agent}i   记录用户使用的浏览器类型

        %{HEADER_NAME}i   记录指定首部对应的值

LogFormat "%h %l %u %t \"%r\" %>s %b" common

LogFormat "%{Referer}i -> %U" referer

LogFormat "%{User-agent}i" agent

customLog logs/access_log combined  自定义访问日志文件位置。和使用的日志格式。格式由上面的LogFormat定义

KeepAlive  {Off|On}                                定义是否支持持久连接

KeepAliveTimeout   15                            如果开启了持久连接,客户端如果没有数据传输最少多少时间内不断开

Alias /URL/  "/path/to/somewhere/"  路径别名,如果请求的url中的 包含了alias定义的/URL/,则会映射到/path/to/somewhere/。它不会局限于DocumentRoot定义的站点根目录。别名的优先级高于站点根目录。

AddDefaultCharset UTF-8   设置字符集。常用的中文字符集有GB2312  GB18030   GBK等

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"   定义CGI脚本脚本的URL别名,当请求的URL带有/cgi-bin/时,httpd程序会自动定位到/var/www/cgi-bin/目录下

<Directory "/var/www/www1">   定义一个容器,对/var/www/www1目录做特性

Options none                                没有任何指定开放的功能

AllowOverride AuthConfig            表示做要做认证相关的配置

AuthType Basic                               认证类型为Basic

AuthName "Admin Area."              认证名称,再提示用户输入用户名和密码的时候提示的信息

AuthUserFile /etc/httpd/conf/.htpasswd        存储用户名和密码的地方,此文件可以用htpasswd命令生成

AuthBasicProvider  file                                     指定用户认证时使用存储用户名和密码的类型,有文件,和sql数据库和ldap等,如果不写默认使用文件。

Require valid-user                                            允许指定文件中那些用户登陆,valid-user表示.htpasswd文件中所有用户可以登陆。

#Require user wukui                                        只允许某些用户登陆的写法,多个用户间用空格隔开。

AuthGroupFile /etc/httpd/conf/.htgroup       使用组认证时指明组文件的位置。(组文件内容写法。group1: user1 user2)

Require group  group1                                    给指定的组授权,组认证时必须把require user这个选项注释掉。

</Directory>

配置虚拟主机前需要把DocumentRoot注释掉,因为虚拟主机需要自己定义站点根目录。虚拟主机可以基于ip,端口,主机名做。三者可以同时存在,但要理清三者之间占用套接字的关系。

NameVirtualHost *:80                     设定虚拟主机使用的ip。*为使用全部。如果这里只指定一个ip,那么这个ip是给基于主机名的虚拟主机使用的。基于ip的虚拟主机可以自己定义单独ip,不受这里控制。

<VirtualHost *:80>                                            定义虚拟主机的容器,并指定此虚拟主要监听的ip和端口

        ServerName www2.stu2.com                    定义虚拟主机的名称,基于主机名的虚拟主机必须有。

        DocumentRoot /var/www/www2             定义虚拟主机的站点根目录

        LogLevel warn                                           定义虚拟主机的错误日志记录级别

        ErrorLog /var/log/httpd/www2.err            定义虚拟主机的错误目录名称,每个虚拟主机都就有自己独立的日志文件

        CustomLog /var/log/httpd/www2.access combined       虚拟主机的访问日志文件

        SetHandler server-status                               为此虚拟主机启用apache的内部处理器server-status               

</VirtualHost>

<Location /server-status>                        定义url /server-status的访问控制选项

SetHandler server-status                          开启apache的内核处理器server-status,用来监视httpd程序的运行状态,可以在浏览器访问看到

Order allow,deny                         定义白名单和黑名单的优先级

Allow from 172.16.0.0/16          白名单的地址。

</Location>

------传输数据压缩配置---------------------------------------

# LoadModule deflate_module modules/mod_deflate.so   前提要确认此模块是否起用

  SetOutputFilter DEFLATE                                           启用输出的过滤器为DEFLATE

  # mod_deflate configuration

  # Restrict compression to these MIME types

  AddOutputFilterByType DEFLATE text/plain           对纯文本的内容启动DEFLATE过滤器启动压缩功能            

  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    对于Mozilla4这样的浏览器只启用gzip算法的压缩

  # Netscape 4.06-4.08 have some more problems

  BrowserMatch ^Mozilla/4\.0[678] no-gzip                    对于Mozilla4.06, 4.07, 4.08启用no-gzip的算法压缩

  # MSIE masquerades as Netscape, but it is fine

  BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html        对于ie6不使用no-gzip和gzip-only-text/html压缩。ie6不支持。