本文使用的httpd安装包为:httpd-2.2.15-29.el6.centos.x86_64

httpd的配置文件说明:

    主配置文件
    Apache的配置文件是包含若干指令的纯文本文件,主配置文件名称通常为httpd.conf,可以用Include指令和通配符附加许多其他配置文件。任何配置文件都可以使用任何指令。只有在启动或重新启动Apache后,主配置文件的更改才会生效。服务器还会读取一个包含MIME文件类型的文件,其文件名由TypesConfig指令确定,默认值是/etc/mime.types(mod_mime)

    配置文件的语法
    Apache配置文件的每一行包含一个指令,在行尾使用反斜杠"\"可以表示续行,但是反斜杠与下一行之间不能有任何其他字符(包括空白字符)。
    配置文件中的指令是不区分大小写的,但是指令的参数(argument)通常是大小写敏感的。以"#"开头的行被视为注解并被忽略。空白行和指令前的空白字符将被忽略,因此可以采用缩进以保持配置层次的清晰。
    可以用 apachectl configtest 或者命令行httpd -t 、apachectl -t 检查配置文件中的错误,而无须启动Apache服务器。

    模块
    Apache是模块化的服务器,这意味着核心中只包含实现最基本功能的模块。扩展功能可以作为模块动态加载。默认情况下,只有base组的模块被编译进了服务器。如果服务器在编译时包含了DSO模块,那么各模块可以独立编译,并可随时用LoadModule指令加载;否则,要增加或删除模块必须重新编译整个Apache。用于特定模块的指令可以用<IfModule>指令包含起来,使之有条件地生效。

    指令的作用域
    主配置文件中的指令对整个服务器都有效。如果你只想改变某一部分的配置,你可以把指令嵌入到<Directory>、<DirectoryMatch>、<Files>、<FilesMatch>、<Location>、<LocationMatch>配置段中,这样就可以限制指令的作用域为文件系统中的某些位置或特定的URL。这些配置段还可以进行嵌套,以进行更精细的配置。

       # grep "Section" httpd.conf
      ### Section 1: Global Environment                # 全局环境参数
      ### Section 2: 'Main' server configuration        # “主”服务器配置
      ### Section 3: Virtual Hosts                        # 虚拟主机

      主服务器和虚拟主机一般不同时使用;默认仅启用了主服务器;
       指令参数:指令不区分字符大小写,但指令的参数(argument)通常是大小写敏感的。

1、持久连接

    KeepAlive {On|Off}        # 启用|关闭HTTP持久链接
    MaxKeepAliveRequests 100    # 一个持久链接中允许的最大请求数量
    KeepAliveTimeout 15        # 持久链接中服务器在两次请求之间等待的秒数

2、MPM参数:

<IfModule 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   # 保有的最大工作线程数目
    ThreadsPerChild     25     # 每个服务进程中的工作线程数
    MaxRequestsPerChild  0   # 服务进程中允许的最大请求数目
</IfModule>   

3、监听指定的地址和端口
    Listen [IP:]PORT

    Listen指令告诉服务器接只受来自特定端口(或地址+端口的组合)的请求。
    如果Listen指令仅指定了端口,则服务器会监听所有的IP地址;
    如果指定了地址+端口的组合,则服务器只监听来自此特定地址上特定端口的请求。
    可以使用多个Listen指令,可以指定在多个地址和端口上进行监听。
    要实现虚拟主机VirtualHost,首先必须告诉服务器需要监听哪些地址和端口;
    如果将<VirtualHost>段设置为服务器没有监听的地址和端口,则相应的虚拟机不生效。

4、DSO机制装载的模块
    显示:# httpd -D DUMP_MODULES
        等价于:httpd -M
        LoadModule Module_Name /path/to/Module_File   

5、指定站点根目录

    DocumentRoot directory-path 
    指定DocumentRoot时不应包括最后的"/"。目录通常为绝对路径。
    如果服务器有多个虚拟主机,使用每个虚拟主机自己的DocumentRoot来组成文件系统路径

6、站点路径访问控制
    基于本地文件系统路径:
        <Directory "/path/to/somewhere">

        </Directory>

    基于URL访问路径做访问控制
        <Location "/path/to/URL">
        </Location>   

7、于Directory中可用的访问控制
    (1) Options
    Options指令控制了在特定目录中将使用哪些服务器特性。
      All     # 除MultiViews之外的所有特性。这是默认设置。
      Indexes    # 如果一个映射到目录的URL被请求,而此目录中又没有DirectoryIndex(例如:index.html),那么服务器会返回由mod_autoindex生成的一个格式化后的目录列表(将所有资源以列表形式呈现给用户);危险,慎用;
      FollowSymLinks        # 服务器允许在此目录中使用符号连接。(跟踪符号链接)
      ExecCGI        # 允许使用mod_cgi执行CGI脚本。
        注意:即使服务器会使用符号连接,但它不会改变用于匹配<Directory>段的路径名。如果此配置位于<Location>配置段中,则此设置会被忽略。
      Includes    # 允许使用mod_include提供的服务器端包含。
      SymLinksIfOwnerMatch        服务器仅在符号连接与其目的目录或文件的拥有者具有相同的uid时才使用它。

     (2) AllowOverride
      支持在每个页面目录下创建.htaccess用于实现对此目录中资源访问时的访问控制功能。但不可以出现在Location控制域中

8、基于IP做访问控制
    Order allow,deny
    Deny from 172.16.100.17
    Allow from 172.16.0.0/16

    from后面能接受的地址格式:
        IP, Network Address
    网络地址格式较为灵活:
        172.16
        172.16.0.0
        172.16.0.0/16
        172.16.0.0/255.255.0.0

9、定义默认的主页面    DirectoryIndex
   当客户端请求一个目录时寻找的资源列表,可以指定多个URL,服务器将返回最先找到的那一个。若一个也没有找到,并且那个目录设置了Indexes选项,服务器将会自动产生一个那个目录中的资源列表。指定的文档不一定必须位于被请求的目录下,也可以指定一个绝对URL来指向其他位置
       例:  DirectoryIndex index.html index.php /cgi-bin/index.sh

10、配置日志功能
    ErrorLog "/path/to/error_log"
    LogLevel {debug|info|notice|warn|error|crit|alert|emerg}

    LogFormat
    CustomLog "/path/to/access_log" LogFormat_Name

        %h: 客户端地址
        %l: 远程登录名,通常为-
        %u: 认证时输入用户名,没有认证时为-
        %t: 服务器收到 用户请求时的时间
        %r:请求报名的起始行
        %>s: 响应状态码
        %b: 响应报文的长度,单位是字节
        %{HEADER_NAME}i: 记录指定首部对应的值

11、路径别名(访问DocumentRoot以外的文件)

    可以在文件系统的DocumentRoot目录下放置符号连接以访问其外部文件,
    考虑到安全问题,这种方法仅在相应目录的Options指令中设置了FollowSymLinks或SymLinksIfOwnerMatch时才有效。
    使用Alias指令可以将文件系统的任何部分映射到网络空间中

    AliasMatch ,使用正则表达式映射URL到文件系统,这个指令与Alias等效
    AliasMatch ^/icons(.*) /usr/local/apache/icons$1

    实现URL路径的映射,从而所访问的资源不再依赖于站点根目录;
     Alias /URL/ "/path/to/somewhere/"

12、设定默认字符集
     AddDefaultCharset UTF-8
    字符集:GB2312, GB18030, GBK        UTF

13、CGI脚本
    CGI脚本路径别名

    /var/www/cgi-bin/
       
http://server/cgi-bin/

    bash写CGI脚本:
        所有文本都使用命令输出:echo, printf, cat
        执行程序:命令引用

        Content-Type: text/html
        <pre>
       
        FastCGI: 协议

14、基于用户访问控制
    用户认证:
        基本认证: Basic
        摘要认证:digest

    虚拟用户:仅用于访问某服务或获取某资源的凭证;
        文本文件:.htpasswd
        SQL数据库
        dbm: 数据库引擎,提供API
        ldap:

    authentication provider: 账号和密码的存储机制;
        authn

    authorization provider: 授权

    案例:基于文件做访问控制

    (1) 基于用户进行认证

        <Directory "/var/www/html/admin">
             Options none
             AllowOverride AuthConfig
             AuthType Basic
             AuthName "Admin Area."
             #AuthBasicProvider file
             AuthUserFile /etc/httpd/conf/.htpasswd
             Require valid-user
        </Directory>

            Require valid-user: 文件中所有用户均可访问
            Require user USERNAME, ...

    (2) 提供认证文件
        htpasswd
          -c: 如果此文件事先不存在,则创建;注意,只能在创建第一个用户时使用;
          -m:以md5的格式编码存储用户的密码信息
          -D:删除指定用户

    (3) 组认证
        <Directory "/var/www/html/admin">
             Options none
             AllowOverride AuthConfig
             AuthType Basic
             AuthName "Admin Area."
             #AuthBasicProvider file
             AuthUserFile /etc/httpd/conf/.htpasswd
             AuthGroupFile /etc/httpd/conf/.htgroup
             Require group GROUP_NAME
        </Directory>           

        组文件:
            组名:user1 user2 user3

15、虚拟主机

     虚拟主机:使用单个Apache实例提供多个网站。使用不同访问路径.
     是指在一个机器上运行多个网站(比如:
www.a.com和www.b.com)。
     如果每个网站拥有不同的IP地址,则虚拟主机可以是"基于IP"的;
     如果只有一个IP地址,也可以是"基于主机名"的,其实现对最终用户是透明的。

    (1) 使用虚拟的前提:取消主服务器
        注释主服务器的站点根路径指定:DocumentRoot
       
NameVirtualHost addr[:port];为一个基于域名的虚拟主机指定一个IP地址(和端口)。
       注意:
<VirtualHost>指令的参数必须与NameVirtualHost指令的参数完全匹配。

(2) 定义虚拟主机
     NameVirtualHost IP:PORT

        <VirtualHost IP:PORT>
            ServerName     # 指令来指定伺服哪个主机
            DocumentRoot  # 来说明这个主机的内容位于文件系统的什么地方
            ServerAlias
            ErrorLog          
            CustomLog
        </VirtualHost>

    配置文件语法检查:
        httpd -t
        service httpd configtest

    文本浏览器测试:elinks
        -dump: 获取到页面数据后直接退出进程;

16、https协议    
    ssl(安全的套接字层), tls(传输层安全)

    http协议:文本编码

        验正:使用telnet发请求

验正:使用telnet发请求

1 验正:使用telnet发请求 2 3 # telnet 172.16.100.7 80 4 Trying 172.16.100.7... 5 Connected to 172.16.100.7. 6 Escape character is '^]'. 7 GET /index.html HTTP/1.0 8 Host: www.b.org 9 10 HTTP/1.1 200 OK 11 Date: Fri, 08 Aug 2014 03:03:51 GMT 12 Server: Apache/2.2.15 (CentOS) 13 Last-Modified: Fri, 08 Aug 2014 02:14:52 GMT 14 ETag: "e0009-12-50014c53e753f" 15 Accept-Ranges: bytes 16 Content-Length: 18 17 Connection: close 18 Content-Type: text/html; charset=UTF-8 19 20 <h1> Host B </h1> 21 Connection closed by foreign host.


    httpd: ssl       
        ssl模块
            单独成包

    ssl会话基于IP地址创建,所以,每一个IP仅创建一个SSL会话;

    ssl握手要完成的工作:
        交换协议版本号
        选择双方都支持的加密方式
        客户端对服务器端实现身份验正
        密钥交换

    https协议: 基于SSL二进制编码, 443/tcp
        openssl s_client

    客户端验正服务器端证书:
        有效性检测:证书是否仍然在有效期内
        CA的可信度检测:
        证书的完整性检测:
        持有者的身份检测

    配置httpd工作于https:
    (1) 安装mod_ssl模块
    # yum install mod_ssl

    (2) 为服务端生成私钥,并为其提供证书;

     详细参考之前的OpenSSL搭建私有OA流程。
    # 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

    签署后的证书为:/etc/httpd/ssl/httpd.crt

    (3) 配置使用https的虚拟主机;

    SSLCertificateFile
    SSLCertificateKeyFile

    <VirtualHost IP:443>
        DocumentRoot
        ServerName
    </VirtualHost>

    (4) 重新装载配置

    (5) 测试
    # openssl s_client -connect IP:PORT -CAfile /path/to/ca_certificate

17、status页面
    httpd内嵌有handler,其中有一个handler用于输出当前httpd服务相关状态信息

        handler: server-status       

        启用handler要使用SetHandler指令
            handler: 当文件被调用时,apache内部表示形式;一般每种文件类型都有其隐式处理器

18、访问属性配置总结
    配置文件系统访问路径:
    <Directory [~] "">
    </Directory>

    <File [~] "">
    </File>

    配置URL访问路径:
    <Location [~] "">  #模式匹配
    </Location>

    <LocationMatch "">  #正则表达式匹配
    </LocationMatch>

19、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


20、使用mod_deflate模块压缩页面优化传输速度

SetOutputFilter DEFLATE

1 # mod_deflate configuration 2 3 4 # Restrict compression to these MIME types 5 AddOutputFilterByType DEFLATE text/plain 6 AddOutputFilterByType DEFLATE text/html 7 AddOutputFilterByType DEFLATE application/xhtml+xml 8 AddOutputFilterByType DEFLATE text/xml 9 AddOutputFilterByType DEFLATE application/xml 10 AddOutputFilterByType DEFLATE application/x-javascript 11 AddOutputFilterByType DEFLATE text/javascript 12 AddOutputFilterByType DEFLATE text/css 13 14 # Level of compression (Highest 9 - Lowest 1) 15 DeflateCompressionLevel 9 16 17 # Netscape 4.x has some problems. 18 BrowserMatch ^Mozilla/4 gzip-only-text/html 19 20 # Netscape 4.06-4.08 have some more problems 21 BrowserMatch ^Mozilla/4\.0[678] no-gzip 22 23 # MSIE masquerades as Netscape, but it is fine 24 BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html


示例:

实现对server-status的用户访问控制

1 <Location /server-status> 2 SetHandler server-status 3 Order deny,allow 4 Allow from 172.16.19.0/16 5 </Location> 6 7 <Location /server-status> 8 # Options none 9 # AllowOverRide AuthConfig #此选项不可以出现在Location里面 10 AuthType Basic 11 AuthName "Admin Area." 12 # AuthBasicProvider file # 此选项可有可无 13 AuthUserFile /etc/httpd/conf/.htpasswd 14 Require user www1 15 </Location>

分别实现基于IP、域名、端口的虚拟主机

1 # DocumentRoot "/var/www/html" 2 Listen *80 3 Listen 172.16.19.28080 4 5 NameVirtualHost 172.16.19.2 6 7 <VirtualHost 172.16.19.2:80> 8 ServerName www1.stu19.com 9 DocumentRoot /web/vhosts/www1 10 ErrorLog /var/log/httpd/www1.err 11 CustomLog /var/log/httpd/www1.access combined 12 </VirtualHost> 13 14 <VirtualHost 172.16.19.2:8080> 15 ServerName www2.stu19.com 16 DocumentRoot /web/vhosts/www2 17 ErrorLog /var/log/httpd/www2.err 18 CustomLog /var/log/httpd/www2.access combined 19 </VirtualHost> 20 21 <VirtualHost 172.16.19.3:80> 22 ServerName www.c.com 23 DocumentRoot /web/vhosts/www3 24 ErrorLog /var/log/httpd/www3.err 25 CustomLog /var/log/httpd/www3.access combined 26 </VirtualHost>