• Apache入门 篇(二)之apache 2.2.x常用配置解析


    一、httpd 2.2.x目录结构

    Cnetos 6.10 YUM安装httpd 2.2.x

      # yum install -y httpd

    程序环境
        主配置文件:
            /etc/httpd/conf/httpd.conf  #主配置文件
            /etc/httpd/conf.d/*.conf    #补充配置文件
    服务脚本: /etc/rc.d/init.d/httpd 配置文件:/etc/sysconfig/httpd
    主程序文件: /usr/sbin/httpd /usr/sbin/httpd.event 对于这种模型切换,2.2版本的切换只能重新编译 /usr/sbin/httpd.worker
    日志文件目录: /var/log/httpd access_log: 访问日志 error_log:错误日志(启动、停止、运行)
    站点文档目录: /var/www/html
    模块文件路径: /usr/lib64/httpd/modules 配置文件的组成: [root@localhost ~]# grep "Section" /etc/httpd/conf/httpd.conf ### Section 1: Global Environment ### Section 2: 'Main' server configuration ### Section 3: Virtual Hosts 配置格式:directive value directive: 不区分字符大小写; value: 为路径时,取决于文件系统;

    二、主配置文件httpd.conf常用选项说明

    [root@localhost ~]# grep -Ev "^#|^[ ]+#|^$" /etc/httpd/conf/httpd.conf 
    ServerTokens OS
    ServerRoot "/etc/httpd"       #httpd程序目录
    PidFile run/httpd.pid          #pid文件路径
    Timeout 60
    KeepAlive Off                  #长连接开启或关闭On|Off
    MaxKeepAliveRequests 100      #长连接最大请求数
    KeepAliveTimeout 15              #长连接超时时间配置
    <IfModule prefork.c>          #prefork模式配置
    StartServers       8          #服务启动时的子进程数量
    MinSpareServers    5        #最小空闲进程数
    MaxSpareServers   20        #最大空闲进程数
    ServerLimit      256        #服务器生命周期内为MaxClient所允许的最大进程数,通常相等MaxClients
    MaxClients       256        #最大并发请求数
    MaxRequestsPerChild  4000    #单个进程响应的最大请求数
    </IfModule>
    <IfModule worker.c>            #work模式配置
    StartServers         4        #服务器启动时的进程数
    MaxClients         300        #最大并发请求数
    MinSpareThreads     25        #最小空闲线程数
    MaxSpareThreads     75        #最大空闲线程数 
    ThreadsPerChild     25        #每个进程能启动的线程数
    MaxRequestsPerChild  0        #每个线程能响应的最大请求数,0表示不做限制
    </IfModule>
    Listen 80                    #监听端口,格式:Listen [IP:]PORT,省略ip表示监听本机所有IP; Listen可重复出现多次;
    LoadModule auth_basic_module modules/mod_auth_basic.so    #模块导入
    LoadModule auth_digest_module modules/mod_auth_digest.so
    LoadModule authn_file_module modules/mod_authn_file.so
    LoadModule authn_alias_module modules/mod_authn_alias.so
    LoadModule authn_anon_module modules/mod_authn_anon.so
    LoadModule authn_dbm_module modules/mod_authn_dbm.so
    LoadModule authn_default_module modules/mod_authn_default.so
    LoadModule authz_host_module modules/mod_authz_host.so
    LoadModule authz_user_module modules/mod_authz_user.so
    LoadModule authz_owner_module modules/mod_authz_owner.so
    LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
    LoadModule authz_dbm_module modules/mod_authz_dbm.so
    LoadModule authz_default_module modules/mod_authz_default.so
    LoadModule ldap_module modules/mod_ldap.so
    LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
    LoadModule include_module modules/mod_include.so
    LoadModule log_config_module modules/mod_log_config.so
    LoadModule logio_module modules/mod_logio.so
    LoadModule env_module modules/mod_env.so
    LoadModule ext_filter_module modules/mod_ext_filter.so
    LoadModule mime_magic_module modules/mod_mime_magic.so
    LoadModule expires_module modules/mod_expires.so
    LoadModule deflate_module modules/mod_deflate.so
    LoadModule headers_module modules/mod_headers.so
    LoadModule usertrack_module modules/mod_usertrack.so
    LoadModule setenvif_module modules/mod_setenvif.so
    LoadModule mime_module modules/mod_mime.so
    LoadModule dav_module modules/mod_dav.so
    LoadModule status_module modules/mod_status.so
    LoadModule autoindex_module modules/mod_autoindex.so
    LoadModule info_module modules/mod_info.so
    LoadModule dav_fs_module modules/mod_dav_fs.so
    LoadModule vhost_alias_module modules/mod_vhost_alias.so
    LoadModule negotiation_module modules/mod_negotiation.so
    LoadModule dir_module modules/mod_dir.so
    LoadModule actions_module modules/mod_actions.so
    LoadModule speling_module modules/mod_speling.so
    LoadModule userdir_module modules/mod_userdir.so
    LoadModule alias_module modules/mod_alias.so
    LoadModule substitute_module modules/mod_substitute.so
    LoadModule rewrite_module modules/mod_rewrite.so
    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
    LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
    LoadModule proxy_connect_module modules/mod_proxy_connect.so
    LoadModule cache_module modules/mod_cache.so
    LoadModule suexec_module modules/mod_suexec.so
    LoadModule disk_cache_module modules/mod_disk_cache.so
    LoadModule cgi_module modules/mod_cgi.so
    LoadModule version_module modules/mod_version.so
    Include conf.d/*.conf        #包含扩展配置文件
    User apache                    #进程运行用户配置
    Group apache
    ServerAdmin root@localhost    #管理员邮箱配置
    ServerName localhost:80        #域名配置
    UseCanonicalName Off
    DocumentRoot "/var/www/html"    #网站根目录配置
    <Directory />                #网站根访问权限配置
        Options FollowSymLinks    #允许跟踪符号链接
        AllowOverride None 
        #通常利用Apache的rewrite模块对URL进行重写,rewrite规则会写在 .htaccess 文件里。但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对.htaccess 所在目录进行配置。从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override
    </Directory>
    <Directory "/var/www/html">  #默认站点目录访问权限配置
        Options Indexes FollowSymLinks    #允许索引和跟踪符号链接
        AllowOverride None
        Order allow,deny    #访问规则,allow,deny,哪个在前先匹配哪个,这里的allow对应下面Allow from all规则
        Allow from all
    </Directory>
    <IfModule mod_userdir.c>
        UserDir disabled
    </IfModule>
    DirectoryIndex index.html index.html.var    #网站默认页面配置
    AccessFileName .htaccess    #访问入口文件名
    <Files ~ "^.ht">    #正则匹配以.ht结尾的文件访问权限配置
        Order allow,deny
        Deny from all
        Satisfy All  -->详解:http://www.fwolf.com/blog/post/341
    </Files>
    TypesConfig /etc/mime.types    #类型配置路径指定
    DefaultType text/plain    #默认类型
    <IfModule mod_mime_magic.c>
        MIMEMagicFile conf/magic
    </IfModule>
    HostnameLookups Off
    ErrorLog logs/error_log      #错误日志配置
    LogLevel warn                #错误日志级别
    LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined    #日志格式配置
    LogFormat "%h %l %u %t "%r" %>s %b" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent
    CustomLog logs/access_log combined    #访问日志配置
    ServerSignature On
    Alias /icons/ "/var/www/icons/"
    <Directory "/var/www/icons">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
    </Directory>
    <IfModule mod_dav_fs.c>
        DAVLockDB /var/lib/dav/lockdb
    </IfModule>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
    <Directory "/var/www/cgi-bin">
        AllowOverride None
        Options None
        Order allow,deny
        Allow from all
    </Directory>
    IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8
    AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
    AddIconByType (TXT,/icons/text.gif) text/*
    AddIconByType (IMG,/icons/image2.gif) image/*
    AddIconByType (SND,/icons/sound2.gif) audio/*
    AddIconByType (VID,/icons/movie.gif) video/*
    AddIcon /icons/binary.gif .bin .exe
    AddIcon /icons/binhex.gif .hqx
    AddIcon /icons/tar.gif .tar
    AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
    AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
    AddIcon /icons/a.gif .ps .ai .eps
    AddIcon /icons/layout.gif .html .shtml .htm .pdf
    AddIcon /icons/text.gif .txt
    AddIcon /icons/c.gif .c
    AddIcon /icons/p.gif .pl .py
    AddIcon /icons/f.gif .for
    AddIcon /icons/dvi.gif .dvi
    AddIcon /icons/uuencoded.gif .uu
    AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
    AddIcon /icons/tex.gif .tex
    AddIcon /icons/bomb.gif /core
    AddIcon /icons/back.gif ..
    AddIcon /icons/hand.right.gif README
    AddIcon /icons/folder.gif ^^DIRECTORY^^
    AddIcon /icons/blank.gif ^^BLANKICON^^
    DefaultIcon /icons/unknown.gif
    ReadmeName README.html
    HeaderName HEADER.html
    IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
    AddLanguage ca .ca
    AddLanguage cs .cz .cs
    AddLanguage da .dk
    AddLanguage de .de
    AddLanguage el .el
    AddLanguage en .en
    AddLanguage eo .eo
    AddLanguage es .es
    AddLanguage et .et
    AddLanguage fr .fr
    AddLanguage he .he
    AddLanguage hr .hr
    AddLanguage it .it
    AddLanguage ja .ja
    AddLanguage ko .ko
    AddLanguage ltz .ltz
    AddLanguage nl .nl
    AddLanguage nn .nn
    AddLanguage no .no
    AddLanguage pl .po
    AddLanguage pt .pt
    AddLanguage pt-BR .pt-br
    AddLanguage ru .ru
    AddLanguage sv .sv
    AddLanguage zh-CN .zh-cn
    AddLanguage zh-TW .zh-tw
    LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
    ForceLanguagePriority Prefer Fallback
    AddDefaultCharset UTF-8
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType application/x-x509-ca-cert .crt
    AddType application/x-pkcs7-crl    .crl
    AddHandler type-map var
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
    Alias /error/ "/var/www/error/"
    <IfModule mod_negotiation.c>
    <IfModule mod_include.c>
        <Directory "/var/www/error">
            AllowOverride None
            Options IncludesNoExec
            AddOutputFilter Includes html
            AddHandler type-map var
            Order allow,deny
            Allow from all
            LanguagePriority en es de fr
            ForceLanguagePriority Prefer Fallback
        </Directory>
    </IfModule>
    </IfModule>
    BrowserMatch "Mozilla/2" nokeepalive
    BrowserMatch "MSIE 4.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    BrowserMatch "RealPlayer 4.0" force-response-1.0
    BrowserMatch "Java/1.0" force-response-1.0
    BrowserMatch "JDK/1.0" force-response-1.0
    BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
    BrowserMatch "MS FrontPage" redirect-carefully
    BrowserMatch "^WebDrive" redirect-carefully
    BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
    BrowserMatch "^gnome-vfs/1.0" redirect-carefully
    BrowserMatch "^XML Spy" redirect-carefully
    BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
    View Code

    三、常用配置解析

    • (1)修改监听的IP和Port

    [root@localhost ~]# vim /etc/httpd/conf/httpd.conf
    Listen 80
    格式:Listen [IP:]PORT
    省略ip表示监听本机所有IP; Listen可重复出现多次,表示监听多个端口
    • (2)持久连接

    每个web页面都由多个资源组成,每个资源都由一个url进行访问。这也就意味着打开页面就需要对服务器请求多次。这样每次访问都需要经过三次握手,这样非常耗费资源,为了解决这问题,引入了长连接。但是如果请求一直连接,而用户不再获取资源时,会导致连接一直占用资源,这需要进行对长连接进行限制。

    Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成;那么长连接又是如何配置断开的呢?有2种方式:

    连接数量限制:100,表示最多100个连接
    连接时间限制:可配置,比如60s,不建议设置太长,尤其是并发较大的环境中

    持久连接副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应;

    持久连接折衷方案:使用较短的持久连接时间;比如5s。httpd-2.4 支持毫秒级持久时间;

    [root@localhost ~]# vim /etc/httpd/conf/httpd.conf   
    KeepAlive On   #开启|关闭长连接
    MaxKeepAliveRequests 100  #最大长连接请求数配置
    KeepAliveTimeout 15   #长连接超时时间配置
    
    测试长、短连接:
    [root@localhost apache]# yum install -y telnet
    [root@localhost extra]# telnet 192.168.56.13 80
    Trying 192.168.56.13...
    Connected to 192.168.56.13.
    Escape character is '^]'.
    GET / HTTP/1.1
    Host: 192.168.56.11
    
    HTTP/1.1 200 OK
    Date: Wed, 11 Jul 2018 08:29:49 GMT
    Server: Apache/2.2.31 (Unix)
    Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
    ETag: "2059de5-2c-3e9564c23b600"
    Accept-Ranges: bytes
    Content-Length: 44
    Content-Type: text/html
    
    <html><body><h1>It works!</h1></body></html>Connection closed by foreign host. 
     #短连接会请求完毕会直接断开(Connection closed),配置好长连接和超时,可以在第一次请求完毕后再次请求,在超过超时时间内自动断开。
    
    [root@localhost extra]# vim httpd.conf
    解除注释:
    Include conf/extra/httpd-default.conf
    
    [root@localhost extra]# telnet 192.168.56.13 80
    Trying 192.168.56.13...
    Connected to 192.168.56.13.
    Escape character is '^]'.
    GET / HTTP/1.1
    Host: 192.168.56.13
    
    HTTP/1.1 200 OK
    Date: Wed, 11 Jul 2018 08:38:17 GMT
    Server: Apache/2.2.31 (Unix)
    Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
    ETag: "2059de5-2c-3e9564c23b600"
    Accept-Ranges: bytes
    Content-Length: 44
    Content-Type: text/html
    
    <html><body><h1>It works!</h1></body></html>
    此处不会提示Connection closed,而是等待再次请求,而后超过超时时间,自动断开
    • (3)MPM

    Multipath Process Module:多道处理模块,主要有三种prefork, worker, event

    httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持;确认方法:

    [root@localhost ~]# ps axu |grep httpd
    root      1444  0.0  0.3 175456  4028 ?        Ss   Jul11   0:11 /usr/sbin/httpd
    apache    6014  0.0  0.3 175588  3184 ?        S    09:37   0:00 /usr/sbin/httpd
    apache    6015  0.0  0.3 175588  3184 ?        S    09:37   0:00 /usr/sbin/httpd
    apache    6016  0.0  0.3 175588  3184 ?        S    09:37   0:00 /usr/sbin/httpd
    apache    6017  0.0  0.3 175588  3192 ?        S    09:37   0:00 /usr/sbin/httpd
    apache    6018  0.0  0.3 175588  3128 ?        S    09:37   0:00 /usr/sbin/httpd
    apache    6019  0.0  0.3 175588  3116 ?        S    09:37   0:00 /usr/sbin/httpd
    apache    6020  0.0  0.3 175588  3180 ?        S    09:37   0:00 /usr/sbin/httpd
    apache    6021  0.0  0.3 175588  3184 ?        S    09:37   0:00 /usr/sbin/httpd
    apache    6028  0.0  0.2 175588  2860 ?        S    09:38   0:00 /usr/sbin/httpd
    root      6070  0.0  0.0 103320   880 pts/0    S+   09:49   0:00 grep httpd
    
    默认为/usr/sbin/httpd, 其使用prefork模型,如果是work会显示httpd.work 或httpd.event

    查看模块列表:

    [root@localhost apache]# httpd -l  #查看静态编译的模块
    Compiled in modules:
      core.c
      mod_authn_file.c
      mod_authn_default.c
      mod_authz_host.c
      mod_authz_groupfile.c
      mod_authz_user.c
      mod_authz_default.c
      mod_auth_basic.c
      mod_include.c
      mod_filter.c
      mod_deflate.c
      mod_log_config.c
      mod_env.c
      mod_expires.c
      mod_setenvif.c
      mod_version.c
      prefork.c
      http_core.c
      mod_mime.c
      mod_status.c
      mod_autoindex.c
      mod_asis.c
      mod_cgi.c
      mod_negotiation.c
      mod_dir.c
      mod_actions.c
      mod_userdir.c
      mod_alias.c
      mod_rewrite.c
      mod_so.c
    [root@localhost apache]# httpd -M  查看静态编译及动态装载的模块
    Loaded Modules:
     core_module (static)
     authn_file_module (static)
     authn_default_module (static)
     authz_host_module (static)
     authz_groupfile_module (static)
     authz_user_module (static)
     authz_default_module (static)
     auth_basic_module (static)
     include_module (static)
     filter_module (static)
     deflate_module (static)
     log_config_module (static)
     env_module (static)
     expires_module (static)
     setenvif_module (static)
     version_module (static)
     mpm_prefork_module (static)
     http_module (static)
     mime_module (static)
     status_module (static)
     autoindex_module (static)
     asis_module (static)
     cgi_module (static)
     negotiation_module (static)
     dir_module (static)
     actions_module (static)
     userdir_module (static)
     alias_module (static)
     rewrite_module (static)
     so_module (static)
    Syntax OK
    View Code

    解析prefork、work模式的配置

    [root@localhost apache]# vim conf/httpd.conf 
    去除注释符号"#",将mpm模式配置包含进来
    Include conf/extra/httpd-mpm.conf
    [root@localhost extra]# vim httpd-mpm.conf 
    prefork的配置:
    <IfModule prefork.c>
    StartServers       8  #服务启动时的子进程数量
    MinSpareServers    5  #最小空闲进程数
    MaxSpareServers   20  #最大空闲进程数
    ServerLimit      256  #服务器生命周期内为MaxClient所允许的最大进程数,通常相等MaxClients
    MaxClients       256  #最大并发请求数
    MaxRequestsPerChild  4000 #单个进程响应的最大请求数
    </IfModule>                
    
    worker的配置:
    <IfModule worker.c>
    StartServers         4 #服务器启动时的进程数
    MaxClients         300 #最大并发请求数
    MinSpareThreads     25 #最小空闲线程数
    MaxSpareThreads     75 #最大空闲线程数
    ThreadsPerChild     25 #每个进程能启动的线程数
    MaxRequestsPerChild  0 #每个线程能响应的最大请求数,0表示不做限制
    </IfModule>
    • (4)PV, UV的概念

    PV: Page View 有效计算的页面访问量,每一个页面链接都是一个请求
    UV: User View 用户量
    独立IP量;

    300 * 86400 = 2592 0000 架设页面有50个资源,大概就有40W+PV,从早到晚全负荷工作

    每一个PV需要多少带宽,假设一个资源需要200k,1个请求20k

    一个主站页面有100个请求,服务器最大并发300个,满负荷计算PV
    300 * 86400 = 2592 0000 /100 = 25w+ 的PV

    • (5)DSO 配置指令实现模块加载

    格式:LoadModule <mod_name> <mod_path>
    模块路径可使用相对地址,相对于ServerRoot("/etc/httpd")指向的路径而言;

     [root@localhost ~]# grep LoadModule /etc/httpd/conf/httpd.conf
      # have to place corresponding `LoadModule' lines at this location so the
      # LoadModule foo_module modules/mod_foo.so
      LoadModule auth_basic_module modules/mod_auth_basic.so
      LoadModule auth_digest_module modules/mod_auth_digest.so
      LoadModule authn_file_module modules/mod_authn_file.so
      LoadModule authn_alias_module modules/mod_authn_alias.so
      LoadModule authn_anon_module modules/mod_authn_anon.so

      ......

    • (6)定义'Main' server的文档页面路径

    [root@localhost conf]# vim httpd.conf 
    DocumentRoot "/var/www/html"
    文档路径映射:DocumentRoot指向的路径为URL路径的起始位置;
    举例: DocumentRoot
    "/var/www/html" test/index.html --> http://HOST:PORT/test/index.html
    • (7)站点访问控制

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

    文件系统路径:

    <Directory ""> </Direcotry>
    <File ""> </File>
    <FileMatch ""> </FileMatch> 正则表达式模式匹配

    URL路径:

    <Location ""> </Location>
    ...

    访问控制机制:
    基于来源地址;对ip地址访问控制
    基于账号;

    • (8)Directory中“基于来源地址”实现访问控制

    (1) Options 
    访问选项:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None, All
    
    Indexes: 索引;允许索引会把网站所有的文件列出来,很危险。当我们访问网站并未给明指定资源时,会直接返回主页面(index.html),如http://www.123.com/。但是如果没有指明主页面,启用该索引就会把网站所有的页面将会以列表形式全部展示出来。常用于下载站点,
    要禁止,去掉或在前面加上减号“-”: -Indexes
    FollowSymlinks:允许跟踪符号链接文件;假设网站下有一个软链接,可以使用该选项进行配置是否允许访问软链接。要禁止以上的选项,可以直接使用Options None [root@localhost ~]# mv /etc/httpd/conf.d/welcome.conf{,.bak} [root@localhost ~]# mkdir /www/htdocs -pv [root@localhost ~]# vim /etc/httpd/conf/httpd.conf 修改成 DocumentRoot "/www/htdocs" <Directory "/www/htdocs">
    [root@localhost ~]# service httpd reload
    [root@localhost ~]# ll /www/htdocs/ 
    total
    8
    -rw-r--r-- 1 root root 779 Jul 13 10:02 fstab.html
    -rw-r--r-- 1 root root 45 Jul 13 09:44 test.html

      [root@localhost ~]# ln -sv /etc/issue /www/htdocs/
      `/www/htdocs/issue' -> `/etc/issue'

     [root@localhost ~]# ll /www/htdocs/

     total 8
     -rw-r--r-- 1 root root 779 Jul 13 10:02 fstab.html
     lrwxrwxrwx 1 root root 10 Jul 13 10:24 issue -> /etc/issue
     -rw-r--r-- 1 root root 45 Jul 13 09:44 test.html

      当在网站根目录下没有默认的index.html主页面时,开启了Indexes会以列表形式展示所有的代码链接,而issue文件作为软链接,因为设置了FollowSymlinks,所以也可以访问到issue文件,如下图:

    (2) 基于来源地址的访问控制机制
    使用allow和deny的规则
    例如:
    Order deny,allow
    deny from all
    allow from 127.0.0.1
    判断依据如下:
    ①看Order后面的,哪个在前,哪个在后
    ②如果deny在前,那么就要先看deny from这句,然后看allow这句
    ③规则是一条一条的匹配,不管是deny在前还是allow在前,都会生效。如案列中,先是deny了所有,然后又allow了127.0.0.1,所以127.0.0.1是通过的。
    再举几个例子:
    Order allow,deny
    deny from all
    allow from 127.0.0.1
    这个就会deny所有,127.0.0.1也会被deny。因为顺序是先allow然后deny,虽然一开始allow了127.0.0.1,但后面有deny掉了。
    Order allow,deny
    deny from all
    上面的规则表明,全部都不能通
    Order deny,allow
    deny from all
    上面规则表示,全部都不能通行
    Order deny,allow
    只有顺序,没有规则,表示,全部都可以通行(默认的),因为allow在最后了
    Order allow,deny
    这个表示全部都不能通行(默认的),因为deny在最后了
    
    (1)对某个目录做限制,至允许本公司ip访问,当然这个目录可以是网站的根目录,也就是整个站点都需要做限制了
    <Directory /data/www>
        Order deny,allow
        deny from all
        allow from 127.0.0.1
    </Directory>
    说明:只允许127.0.0.1访问,其他ip全部拒绝掉
    
    (2)针对请求的uri去限制,前面安装的discuz论坛,访问后台是admin.php,那么我们就可以针对这个admin.php做限制。
    <filesmatch "(.*)admin(.*)>
          Order deny ,allow
          Deny from all
          Allow from 127.0.0.1
    </filesmatch>
    说明:这里用到了filesmatch语法,表示匹配的意思。
    • (9)定义默认主页面

    [root@localhost ~]# vim /etc/httpd/conf/httpd.conf 
    DirectoryIndex index.html index.html.var
    默认的主页面可以有很多,如index.php 、index.htm等
    •  (10)日志设定、切割以及不记录指定类型日志

    ①日志的格式设定

    [root@localhost ~]# vim /etc/httpd/conf/httpd.conf 
    
    错误日志:
    ErrorLog logs/error_log  #日志路径
    LogLevel warn #日志级别
    
    日志级别:debug, info, notice, warn, error, crit, alert, emerg
    
    访问日志:
    CustomLog logs/access_log combined  #combined为日志格式名
    LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
    
    %h:客户端IP地址;
    %l: Remote logname (from identd, if supplied). -表示为空;
    %u: Remote user,  (from auth; may be bogus if return status (%s) is 401);
    %t:Time the request was received (standard english format),服务器收到请求的时间;
    %r:First line of request,请求报文的道行信息(method url version);
    %>s: 响应状态码;
    %b: 响应报文的大小,单位是字节,不包括响应报文首部;
    %{Referer}i:请求报文当中"referer"首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来;
    %{User-Agent}i:请求报文当中"User-Agent"首部的值;即发出请求用到的应用程序;
    
    详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

    ②日志切割

    这里的日志指的是访问日志,我们每访问一次网站,那么就会记录若干条日志。当然前提是已经配置了日志,日志如果不去管理,时间长了就会越来越大。那么如何避免产生这么大的日志文件呢?Apache有相关的配置,是日志按照我们的需求进行归档,比如每天一个新日志,或者每小时更新一个日志。

    [root@localhost ~]# vim /etc/httpd/conf.d/vhosts.conf   #配置虚拟主机配置文件vhosts.conf
    <VirtualHost *:80>
        ServerName www.abc.org
        DocumentRoot "/vhosts/www/htdocs"
        ErrorLog "|usr/sbin/retatelogs -l /etc/httpd/logs/www.abc.org_error_%Y%m%d_log 86400"  #配置错误日志按天切割
        CustomLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_access_%Y%m%d_log 86400" combined  #配置访问日志按天切割
    </VirtualHost>
    
    [root@localhost ~]# apachectl -t
    Syntax OK
    [root@localhost ~]# service httpd reload
    Reloading httpd: 
    [root@localhost ~]# curl www.abc.org
    welcome to www.abc.org
    [root@localhost
    ~]# ll /etc/httpd/logs/www.abc.org_* -rw-r--r-- 1 root root 368 Jul 15 09:23 /etc/httpd/logs/www.abc.org_access_20180715_log -rw-r--r-- 1 root root 148 Jul 15 09:22 /etc/httpd/logs/www.abc.org_error_20180715log

    解析说明:ErrorLog是错误日志,CustomLog是访问日志。最前面的管道符意识是把产生的日志交给rotatelogs这个工具,而这个工具就是Apache自带的切割日志的工具。-l的作用是校准时区为UTC,也就是北京时间。最后面的86400,单位为秒,所以正好是一天,那么日志会每天切割一次,后面的combined为日志格式。

    ③apache不记录指定类型的日志

    如果一个站点的访问量过大,那么访问日志就会有很多,但有一些访问日志我们其实是可以忽略的,比如网站的一些图片,还有js,css等静态对象。而这些文件的访问往往是巨量的,而且即使记录这些日志也没什么用,那么如何忽略掉这些访问的日志呢?
    相关配置为:

    [root@localhost logs]# !vim
    vim /etc/httpd/conf.d/vhosts.conf 
    
    <VirtualHost *:80>
        ServerName www.abc.org
        DocumentRoot "/vhosts/www/htdocs"
        SetEnvIf Request_URI ".*.gif$" image-request
        SetEnvIf Request_URI ".*.jpg$" image-request
        SetEnvIf Request_URI ".*.png$" image-request
        SetEnvIf Request_URI ".*.bmp$" image-request
        SetEnvIf Request_URI ".*.swf$" image-request
        SetEnvIf Request_URI ".*.js$" image-request
        SetEnvIf Request_URI ".*.css$" image-request
        ErrorLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_error_%Y%m%d_log 86400"
        CustomLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_access_%Y%m%d_log 86400" combined env=!image
    -request
    </VirtualHost>
    [root@localhost logs]# apachectl -t
    Syntax OK
    [root@localhost logs]# service httpd reload
    Reloading httpd: 

    解析说明:在原来日志配置的基础上,增加了一些image-request的定义,比如把gif、jpg、bmp、swf、js、css等结尾的全部标记为image-request,然后再配置日志的时候加一个标记env!=image-request,这里有个叹号,表示取反,这样就可以把那些忽略了。  

    • (11)Apache配置静态缓存

    这里的静态文件指的是图片、js、css等文件,用户访问一个站点,其实大多数元素都是图片、js、css等,这些静态文件其实是会被客户端的浏览器缓存到本地电脑上的,目的就是为了下次再请求时不再去服务器上下载,这样就加快了速度,提高了用户体验,但是这些静态文件不能一直缓存,它总有一些时效性。

    [root@localhost logs]# vim /etc/httpd/conf.d/vhosts.conf 
    [root@localhost logs]# apachectl -t
    Syntax OK
    [root@localhost logs]# service httpd reload
    Reloading httpd: 
    [root@localhost logs]# 
    <VirtualHost *:80>
        ServerName www.abc.org
        DocumentRoot "/vhosts/www/htdocs"
        <IfModule mod_expires.c>
            ExpiresActive on
            ExpiresByType image/gif "access plus 1 days"
            ExpiresByType image/jpeg "access plus 24 hours"
            ExpiresByType image/png "access plus 24 hours"
            ExpiresByType text/css "now plus 2 hours"
            ExpiresByType application/x-javascript "now plus 2 hours"
            ExpiresByType application/javascript "now plus 2 hours"
            ExpiresByType application/x-shockwave-flash "now plus 2 hours"
            ExpiresDefault "now plus 0 min"
        </IfModule>
        SetEnvIf Request_URI ".*.gif$" image-request
        SetEnvIf Request_URI ".*.jpg$" image-request
        SetEnvIf Request_URI ".*.png$" image-request
        SetEnvIf Request_URI ".*.bmp$" image-request
        SetEnvIf Request_URI ".*.swf$" image-request
        SetEnvIf Request_URI ".*.js$" image-request
        SetEnvIf Request_URI ".*.css$" image-request
        ErrorLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_error_%Y%m%d_log 86400"
        CustomLog "|/usr/sbin/rotatelogs -l /etc/httpd/logs/www.abc.org_access_%Y%m%d_log 86400" combined env=!image-request
    </VirtualHost>

    说明:这里的时间单位可以是days、hours、min,要想使用这些模块,必要要查看是否支持,查看命令为:# /usr/local/apache2/bin/apachectl -M

    • (12)路径别名

    [root@localhost ~]# vim /etc/httpd/conf/httpd.conf 
    DocumentRoot "/www/htdocs"
    
    假设访问链接:http://www.192.168.56.13.com/download/bash-4.4.2-3.el6.x86_64.rpm
    --> 资源路径为:/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
    
    那么如果将访问的路径配置一个别名,将会实现一个跳转页面
    语法格式:Alias /URL/ "/PATH/TO/SOMEDIR/"
    
    举例:
    [root@localhost htdocs]# pwd
    /www/htdocs
    [root@localhost htdocs]# tree 
    .
    ├── bbs
    │   └── index.html
    ├── forum
         └── index.html
    [root@localhost htdocs]# curl http://192.168.56.13/bbs/index.html  #没有配置别名时访问
    Page At /bbs/index.html
    
    [root@localhost ~]# vim /etc/httpd/conf/httpd.conf 
    Alias /bbs/ "/www/htdocs/forum/"  #配置bbs目录的别名
    
    [root@localhost htdocs]# curl http://192.168.56.13/bbs/index.html  #配置别名时访问
    Page at /www/htdocs/forum
    • (13)基于用户的访问控制

     当访问网站页面时,会对用户的身份进行验证。这请求需要经历一下阶段:

    (1)认证质询:
    WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;

    (2)认证:
    Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源;

    客户端所用到的账号密码通过http发送,由于http是明文传输,存在安全隐患,由此引申认证类型:
    ①basic:明文,解决安全隐患,可以放在https进行传输
    ②digest:消息摘要,通过md5加密,较老的浏览器不支持
    目前来说都是以表单认证的形式

    安全域:需要用户认证后方能访问的路径;针对某一目录的认证
    应该通过名称对其进行标识,并用于告知用户认证的原因;

    那么认证的用户的账号和密码存储于何处?
    虚拟账号:仅用于访问某服务时用到的认证标识;和系统账号无关

    虚拟账号的存储方式:文本文件、SQL数据库、ldap、nis等等

     basic认证方式三步曲:

    (1) 定义安全域

    <Directory "">
        Options None
        AllowOverride None
        AuthType Basic      #认证方式
        AuthName "STRING"    #认证名称    
        AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"    #认证用户相关文件
        Require user username1 username2 ...    #指定用户
        #Require valid-user  #如果允许账号文件中的所有用户登录访问,则选用该选项
    </Directory>

    (2) 提供账号和密码存储(文本文件)

    使用htpasswd命令进行管理
        语法格式:htpasswd [options] passwordfile username
            -c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
            -m: md5加密用户密码;
            -s: sha1加密用户密码;
            -D: 删除指定用户

    (3) 实现基于组进行认证

    <Directory "">                    
        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 ...
    </Directory>    
    
    需要提供:用户账号文件和组文件;
    
    组文件需要手动创建:每一行定义一个组
    格式:GRP_NAME:user1 user2 user3 ...

    举个例子:

    [root@localhost admin]# vim /etc/httpd/conf/httpd.conf  #修改配置文件,对/www/htdocs/admin目录进行认证访问
    增加
    <Directory "/www/htdocs/admin">
        Options None
        AllowOverride None
        AuthType Basic             #认证类型为Basic
        AuthName "Administator private"   #认证提示
        AuthUserFile "/etc/httpd/conf.d/.htpasswd" #用户密码文件路径
        Require valid-user           #设置全部用户有效
    </Directory>
      
    [root@localhost admin]# apachectl -t  #测试配置文件语法
    Syntax OK
    [root@localhost admin]# service httpd reload  #重新加载httpd
    Reloading httpd: 
    
    [root@localhost admin]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom #创建第一个用户tom
    New password: 123456
    Re-type new password: 123456
    Adding password for user tom
    [root@localhost admin]# htpasswd -m /etc/httpd/conf.d/.htpasswd jack    #创建第二个用户jack
    New password: 123456
    Re-type new password: 123456
    Adding password for user jack
    [root@localhost admin]# tail /etc/httpd/conf.d/.htpasswd  #查看用户密码文件,都是以加密格式存放密码
    tom:$apr1$4GLjLGoJ$E523FFHh3hp84gU1y1X431
    jack:$apr1$gER/EINJ$G.AZHOt7D49tZkGsirVwp1
    [root@localhost admin]# apachectl -t
    Syntax OK
    [root@localhost admin]# service httpd reload
    Reloading httpd: 

    访问:http://192.168.56.13/admin/index.html,提示需要输入用户密码登陆:tom 123456

    修改配置仅限tom用户访问

    [root@localhost admin]# !vim
    vim /etc/httpd/conf/httpd.conf 
    
    <Directory "/www/htdocs/admin">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "Administator private"
        AuthUserFile "/etc/httpd/conf.d/.htpasswd"
        #Require valid-user
        Require user tom  #配置仅限tom用户访问
    </Directory>
    [root@localhost admin]# apachectl -t
    Syntax OK
    [root@localhost admin]# service httpd reload
    Reloading httpd: 

    实现基于组进行认证

    root@localhost admin]# htpasswd -m /etc/httpd/conf.d/.htpasswd kim  #增加认证用户kim
    New password: 123456
    Re-type new password: 123456
    Adding password for user kim
    [root@localhost admin]# vim /etc/httpd/conf.d/.htgroup  #手动创建组文件,将用户jack和kim归并到webadmin组
    webadmin: jack kim
    [root@localhost admin]# vim /etc/httpd/conf/httpd.conf   #修改配置文件,仅限组内用户访问
    <Directory "/www/htdocs/admin">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "Administator private"
        AuthUserFile "/etc/httpd/conf.d/.htpasswd"
        AuthGroupFile "/etc/httpd/conf.d/.htgroup"
        #Require valid-user
        #Require user tom
        Require group webadmin  #仅限webadmin组内用户访问
    </Directory>
    [root@localhost admin]# apachectl -t
    Syntax OK
    [root@localhost admin]# service httpd reload
    Reloading httpd: 
    • (14)虚拟主机

    有三种实现方案:
    基于ip:
    为每个虚拟主机准备至少一个ip地址;
    基于port:
    为每个虚拟主机准备至少一个专用port;实践中很少使用;
    基于hostname:
    为每个虚拟主机准备至少一个专用hostname;

    可混合使用上述三种方式中任意方式;

    注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
    禁用中心主机:注释DocumentRoot

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

    <VirtualHost "IP:PORT">
        SeverName
        DocumentRoot ""
    </VirtualHost>
    
        ServerAlias: 虚拟主机的别名;
        ErrorLog:错误日志
        CustomLog:访问日志
        <Directory "">    封装目录进行访问控制
        </Directory>

    ①配置基于IP虚拟主机

    (1)配置站点目录和主页文件
    [root@localhost admin]# mkdir -pv /vhosts/{www,bbs,blog}/htdocs #创建网站目录 mkdir: created directory `/vhosts' mkdir: created directory `/vhosts/www' mkdir: created directory `/vhosts/www/htdocs' mkdir: created directory `/vhosts/bbs' mkdir: created directory `/vhosts/bbs/htdocs' mkdir: created directory `/vhosts/blog' mkdir: created directory `/vhosts/blog/htdocs' [root@localhost admin]# echo "welcome to www.abc.org" > /vhosts/www/htdocs/index.html  #创建www的主页index.html [root@localhost admin]# echo "welcome to bbs.abc.org" > /vhosts/bbs/htdocs/index.html  #创建bbs的主页index.html [root@localhost admin]# echo "welcome to blog.abc.org" > /vhosts/blog/htdocs/index.html #创建blog的主页index.html
    (2)为eth0:0配置临时新ip:192.168.56.130 [root@localhost admin]#
    ifconfig eth0:0 192.168.56.130/24 up #配置虚拟网卡 [root@localhost admin]# ifconfig eth0:0 eth0:0 Link encap:Ethernet HWaddr 00:0C:29:83:73:08 inet addr:192.168.56.130 Bcast:192.168.56.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

    (3)修改主配置文件httpd.conf [root@localhost admin]# vim /etc/httpd/conf/httpd.conf <VirtualHost 192.168.56.13:80> ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" </VirtualHost> <VirtualHost 192.168.56.130:80> ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost>
    (4)检查语法,平滑重启Apache [root@localhost admin]# apachectl
    -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:

    (5)配置hosts解析,测试访问 [root@localhost admin]# vim
    /etc/hosts
    配置hosts解析:

      192.168.56.13 www.abc.org bbs.abc.org blog.abc.org

    [root@localhost admin]# curl 192.168.56.13
    welcome to www.abc.org
    [root@localhost admin]# curl 192.168.56.130
    welcome to bbs.abc.org

    ②基于端口虚拟主机

    (1)修改主配置文件httpd,配置监听端口以及多端口虚拟主机
    [root@localhost admin]# vim /etc/httpd/conf/httpd.conf Listen 80 Listen 8080 Listen 8081 <VirtualHost *:80> #配置www.abc.org监听80端口 ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" </VirtualHost> <VirtualHost *:8080>  #配置bbs.abc.org监听8080端口 ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost> <VirtualHost *:8081>  #配置blog.abc.org监听8081端口 ServerName blog.abc.org DocumentRoot "/vhosts/blog/htdocs" </VirtualHost>

    (2)检查配置文件语法,平滑重启Apache [root@localhost admin]# apachectl -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:
    (3)测试访问 [root@localhost admin]# curl www.abc.org welcome to www.abc.org [root@localhost admin]# curl bbs.abc.org:
    8080 welcome to bbs.abc.org [root@localhost admin]# curl bbs.abc.org:8081 welcome to blog.abc.org

    ③基于域名的虚拟主机

    (1)修改主配置文件httpd.conf
    [root@localhost admin]# vim /etc/httpd/conf/httpd.conf NameVirtualHost *:80  #打开注释 <VirtualHost *:80>  #配置www.abc.org域名 ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" </VirtualHost> <VirtualHost *:80>  #配置bbs.abc.org域名 ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost> <VirtualHost *:80>  #配置blog.abc.org域名 ServerName blog.abc.org DocumentRoot "/vhosts/blog/htdocs" </VirtualHost>
    (2)修改Host本地解析 [root@localhost admin]# vim
    /etc/hosts 192.168.56.13 www.abc.org bbs.abc.org blog.abc.org

    (3)检测语法,平滑重启Apache [root@localhost admin]# apachectl
    -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:

    (4)测试访问 [root@localhost admin]# curl www.abc.org welcome to www.abc.org [root@localhost admin]# curl bbs.abc.org welcome to bbs.abc.org [root@localhost admin]# curl blog.abc.org welcome to blog.abc.org
    • (15)内置的status页面

    修改主配置文件,找到server-status的注释行,打开注释。修改Allow from .example.com 为Allow from all

    该配置可以在主配置中配置,全局生效;也可以在虚拟主机内配置,局部生效,一般这种状态信息页,可以使用前面的Auth认证的方式进行打开,更为安全。

    [root@localhost admin]# vim /etc/httpd/conf/httpd.conf
    <Location /server-status>
        SetHandler server-status
        Order deny,allow
        Deny from all
        Allow from all
    </Location>
    [root@localhost admin]# apachectl -t
    Syntax OK
    [root@localhost admin]# service httpd reload
    Reloading httpd: 

    访问页面http://www.abc.org/server-status

    状态页面解析:
    Current Time: Saturday, 14-Jul-2018 06:51:47 EDT  #当前时间 Restart Time: Saturday, 14-Jul-2018 06:50:17 EDT  #重启时间 Parent Server Generation: 30 Server uptime: 1 minute 30 seconds  #服务更新时间 1 requests currently being processed, 7 idle workers   W_______........................................................ ................................................................ ................................................................ ................................................................ Scoreboard Key: "_" Waiting for Connection(正在等待连接), "S" Starting up(正在启动), "R" Reading Request(正在接收用户请求), "W" Sending Reply(正在发送响应), "K" Keepalive (read)(保持连接), "D" DNS Lookup(DNS查询), "C" Closing connection(正在关闭连接), "L" Logging(正在记录日志), "G" Gracefully finishing(优雅终止), "I" Idle cleanup of worker(空闲清理work进程), "." Open slot with no current process(打开槽位等待进程) PID Key: (从左至右的pid状态展示) 9143 in state: W , 9144 in state: _ , 9145 in state: _ 9146 in state: _ , 9147 in state: _ , 9148 in state: _ 9149 in state: _ , 9150 in state: _ ,

    如果还需要获取更加详细的信息,可以修改配置文件中的扩展状态开关: ExtendedStatus On ,开启后,可以看到下图的状态信息:

    • (16)默认虚拟主机

    在windows下修改C:windowssystem32driversetchosts或Linux的/etc/hosts下,增加一个www.222.com指向192.168.56.13保存后退出,在浏览器访问依旧可以实现访问,这样就显得很不安全。此时我们需要修改虚拟主机配置文件。

    [root@localhost admin]# vim /etc/hosts
    192.168.56.13 www.abc.org bbs.abc.org blog.abc.org www.222.com
    [root@localhost admin]# curl www.222.com
    welcome to www.abc.org

    此时,配置虚拟主机配置文件,第一个为默认虚拟主机,指向一个随意的域名和空目录,即可达到禁止随意解析

    [root@localhost conf.d]# vim /etc/httpd/conf/httpd.conf #在主配置文件中可以使用Include包含扩展配置文件,这里启用这种方式,可以更方便地管理虚拟主机
    Include conf.d/*.conf
    [root@localhost conf.d]# vim vhosts.conf #编辑虚拟主机配置文件,添加默认虚拟主机 <VirtualHost *:80> ServerName 12332.com  #任意域名 DocumentRoot "/tmp/123"  #根目录为空 <Directory /tmp/123>  #对网站根目录进行全新配置,拒绝所有访问 Order allow,deny Deny from all </Directory> </VirtualHost>
    <VirtualHost *:80> ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" </VirtualHost> <VirtualHost *:80> ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost> <VirtualHost *:80> ServerName blog.abc.org DocumentRoot "/vhosts/blog/htdocs" </VirtualHost> [root@localhost conf.d]# mkdir /tmp/123 [root@localhost conf.d]# apachectl -t Syntax OK [root@localhost conf.d]# service httpd reload Reloading httpd: [root@localhost conf.d]# curl www.222.com  #访问返回了403状态码 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>403 Forbidden</title> </head><body> <h1>Forbidden</h1> <p>You don't have permission to access / on this server.</p> <hr> <address>Apache/2.2.15 (CentOS) Server at www.222.com Port 80</address> </body></html>
    • (17)域名301跳转

    一个站点难免会有多个域名,而多个域名总的有一个主次之分,比如阿铭linux的网站可以用两个域名进行访问:www.abc.org 和www.123.com,但是不管用哪个域名进行访问,最终都会跳到www.abc.org上来。那么这个行为就叫做域名跳转,这里的301只是一个状态码,跳转除了301外还有302。下面如何配置域名跳转呢?假设配置如何让www.123.com跳转到www.abc.org

    (1)修改虚拟主机配置文件vhosts.conf,在虚拟主机内配置跳转模块规则
    [root@localhost conf.d]# vim vhosts.conf 需要注释原来的默认虚拟主机,否则实验会报错 #
    <VirtualHost *:80> # ServerName 12332.com # DocumentRoot "/tmp/123" # <Directory /tmp/123> # Order allow,deny # Deny from all # </Directory> #</VirtualHost> <VirtualHost *:80> ServerName www.abc.org DocumentRoot "/vhosts/www/htdocs" <IfModule mod_rewrite.c>  #使用rewrite模块 Options +FollowSymLinks RewriteEngine on  #开始重写模块 RewriteCond %{HTTP_HOST} ^www.123.com$  #判断条件:域名是否是www.123.com RewriteRule ^(.*)$ http://www.abc.org/$1 [R=301,L]  #跳转规则,上面条件成立,则跳转到www.abc.org </IfModule> </VirtualHost> <VirtualHost *:80> ServerName bbs.abc.org DocumentRoot "/vhosts/bbs/htdocs" </VirtualHost> <VirtualHost *:80> ServerName blog.abc.org DocumentRoot "/vhosts/blog/htdocs" </VirtualHost>
    (2)配置hosts解析 [root@localhost conf.d]# vim
    /etc/hosts 192.168.56.13 www.abc.org bbs.abc.org blog.abc.org www.123.com

    (3)检查语法,平滑重启Apache [root@localhost admin]# apachectl
    -t Syntax OK [root@localhost admin]# service httpd reload Reloading httpd:

    (4)测试页面是否跳转 [root@localhost conf.d]# curl www.
    123.com -I HTTP/1.1 301 Moved Permanently  #提示301跳转页面 Date: Sat, 14 Jul 2018 11:46:33 GMT Server: Apache/2.2.15 (CentOS) Location: http://www.abc.org// Content-Type: text/html; charset=iso-8859-1

    如果有多个域名,可以使用一下配置:

    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} ^www.123.com [OR]
        RewriteCond %{HTTP_HOST} ^www.456.com
        RewriteRule ^/(.*)$ http://www.abc.org/$1 [R=301,L] 
    </IfModule>
    或者
    <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} !^www.abc.org$
        RewriteRule ^/(.*)$ http://www.abc.org/$1 [R=301,L]
    </IfModule>
    •  (18)使用mod_deflate模块压缩页面优化传输速度

    适用场景:
    (1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
    (2) 压缩适于压缩的资源,例如文件文件;

    1)编辑主配置文件httpd.conf导入delfalte模块并在末尾添加:
    LoadModule deflate_module modules/mod_deflate.so
    
    #######deflate#######
    SetOutputFilter 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 MSI[E] !no-gzip !gzip-only-text/html

    (2)检测配置文件语法,并重载
    [root@localhost htdocs]# apachectl
    -t Syntax OK [root@localhost htdocs]# service httpd reload Reloading httpd:

    (3)页面测试 [root@localhost
    ~]# curl --compressed www.abc.org/test.html -I  #没有启用deflate模块压缩时,文本大小长度为282080 HTTP/1.1 200 OK Date: Sun, 15 Jul 2018 14:10:02 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Sun, 15 Jul 2018 14:09:28 GMT ETag: "f4f-44de0-5710a42d25bb8" Accept-Ranges: bytes Content-Length: 282080 Cache-Control: max-age=0 Expires: Sun, 15 Jul 2018 14:10:02 GMT Content-Type: text/html; charset=UTF-8 [root@localhost ~]# curl --compressed www.abc.org/test.html -I  #启用deflate模块压缩后,文本大小长度为23797 HTTP/1.1 200 OK Date: Sun, 15 Jul 2018 14:10:27 GMT Server: Apache/2.2.15 (CentOS) Last-Modified: Sun, 15 Jul 2018 14:09:28 GMT ETag: "f4f-44de0-5710a42d25bb8" Accept-Ranges: bytes Cache-Control: max-age=0 Expires: Sun, 15 Jul 2018 14:10:27 GMT Vary: Accept-Encoding Content-Encoding: gzip  #结果看到启用了gzip压缩 Content-Length: 23797   #压缩后的大小 Content-Type: text/html; charset=UTF-8
  • 相关阅读:
    Linux Shell 基本语法
    VIM选择文本块/复制/粘贴
    linux vi命令详解2
    SSH命令详解2
    JAVA调用Shell脚本
    scp命令的用法详解
    Java实践 — SSH远程执行Shell脚本
    Remote SSH: Using JSCH with Expect4j
    c++内置函数---7
    c++将引用作为函数的参数---6
  • 原文地址:https://www.cnblogs.com/linuxk/p/9305216.html
Copyright © 2020-2023  润新知