龙之介大人

apache使用方法详解
1. httpd的特性Web服务程序httpd (apache) nginx lighttpdhttpd2.2的...
扫描右侧二维码阅读全文
14
2019/12

apache使用方法详解

1. httpd的特性

  • Web服务程序
httpd (apache)
nginx 
lighttpd
  • httpd2.2的特性
httpd: apache
    a  patchy server = apache
    ASF: apache software foundation
  • 高度模块化:core + modules

    • DSO: Dynamic Shared Object
    • MPM:Multipath Processing Modules
  • prefork:多进程模型,每个进程响应一个请求;

    • 一个主进程:负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
  • worker:多线程模型,每个线程响应一个请求;

    • 一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求;
    • m进程,n线程:m*n
  • event:事件驱动模型,每个线程响应n个请求;

    • 一个主进程:生成m个子进程,每个进程直接n个请求;
    • m*n
  • http的功能特性:

    • 虚拟主机:IP,Port,FQDN
    • 路径别名:alias
    • 用户认证:authentication

      • basic
      • digest
    • 虚拟主机:virtual host
    • 反向代理:(如负载均衡)
    • CGI:Common Gateway Interface等等。

2. httpd 2.2

  • 程序环境
配置文件:
    /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
    /usr/sbin/httpd.worker
日志文件目录:
    /var/log/httpd
        access_log: 访问日志
        error_log:错误日志
站点文档目录:
    /var/www/html
模块文件路径:
    /usr/lib64/httpd/modules
  • 配置文件组成
cat conf/httpd.conf | grep "Section"
### Section 1: Global Environment  全局配置
### Section 2: 'Main' server configuration  主服务器配置
### Section 3: Virtual Hosts    虚拟主机配置
  • 配置格式:directive value

    • directive: 不区分大小写
    • value: 为路径时,取决于文件系统

1.1 配置文件解释

### Section 1: Global Environment

#ServerTokens OS Server: Apache/2.2.12(Unix)
ServerTokens OS #此参数告知客户端我们服务器的版本和操作系统而已,不需要改动他;
                #如果不在乎你的系统信息被远程用户查询到,则可以将这个项目注释掉(不建议)

ServerRoot "/etc/httpd" #用于指定 Apache 的安装路径,
                        #安装时候自动写入其它指定的目录如果没有指定绝对路径,则目录是相对于该目录。

PidFile run/httpd.pid   #第一个httpd进程(所有其他进程的父进程)的进程号文件位置。


Timeout 60  #不论接收或发送,当持续连接等待超过60秒则该次连接就中断,
            #一般来说,此数值在300秒左右即可,不需要修改这个原始值.

KeepAlive on  #最好把默认值”Off”修改为”On”,默认是关闭状态,它是保持连接的开关,它一旦开启,下面的两个参数任意一个都会生效。

MaxKeepAliveRequests 100    #可以将默认的100改成500或更高与上一个设置的值KeepAlive有关,
#当KeepAlive的值设置为On的时候,这个数值可以决定该次连接能够传输的最大传输数量。为了提高效率则可以改大一点。0代表不限制


KeepAliveTimeout 15 #在KeepAlive设置为”On”的情况下,该次连接在最后一次传输后等待延迟的秒数,当超过该秒数的时候该连接中断。
#保持默认值即可,如果设置的值太高(等待时间较长)在较忙碌的系统上面将会有较多的Apache程序占用资源,可能有效率方面的问题。

##--BEGIN--
<IfModule prefork.c>
StartServers       8   #启动的时候,唤醒几个PID来处理服务的。Apache使用了进程预派生的技术来处理请求,大大提高了响应速度
MinSpareServers    5   #最小预备使用的PID数量
MaxSpareServers   20   #最大预备使用的PID数量
ServerLimit      256   #服务器的限制

MaxClients       256   #最多可以有多少个客户端同时连接到Apache,最大的同时连接数量,也就是process不会超过这一数值。
#这个MaxClients设置值可以控制同时连上www服务器的总连接要求数量,也可以将其看作是最高实时在线人数。
#不过要注意的是:这个值并非越大越好因为他会消耗物理内存(与process有关),所以如果你设置太高导致超出物理内存,能够容许的范围,那么效率就会大大降低(因为会跑SWAP),
#此外,MaxClients也在Apache编译的时候就指定最大值了,所以你也无法超出系统最大值,除非你重新编译

MaxRequestsPerChild  4000  #每个程序能够提供的最大传输次数要求。
#举例来说:如果有个用户连上服务器之后,要求数百个网页,当他的要求数量超过这个值的时候则该程序会被丢弃,
#另外切换一个新程序。这个设置可以有效地管理每个process在系统上存活的时间。根据观察所得,新程序的效果较好。
</IfModule>


<IfModule worker.c>
StartServers         4  #MPM的另一个模型
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75 
ThreadsPerChild     25  #每个子进程的最大并发线程数
MaxRequestsPerChild  0
</IfModule>
#上面的prefork和worker其实是两个MPM模型的参数,可能会存在第三个模型event。
#默认的项目配置对于一般中小型网站来说已经很够用了,网站的流量比较大,可以修订一下里面的数值,设置的数值越大代表系统会启动越多的程序来提供Apache的服务,反映速度就比较快。
#Redhat和CentOS将这两个模块分别放到了不同的执行文件中,分别是/usr/sbin/httpd(prefork模块);
#/usr/sbin/httpd.worker(worker模块),/etc/sysconfig/httpd 这个文件决定了Apache使用哪一个模块,
#可以通过修改这个文件来切换不同的工作模式。参数HTTPD=/usr/sbin/httpd.worker
#--END--

#--BEGIN--
#Listen指令至少一个,可重复出现多次
#Listen 12.34.56.78:80  #也可以写成 IP 地址 + 端口号的形式,用来监听特定 IP。
Listen 80   #监听的端口,如有多块网卡,默认监听所有网卡
#--END--

#--BEGIN--
#主要用于添加 Apache 一些动态模块,例如重定向模块,认证模块等。如果需要添加某些模块,只需把相关模块前面注释符号取消掉即可。
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
......
#--END--

Include conf.d/*.conf   #加载的配置文件

#ExtendedStatus On  #显示扩展信息

#--BEGIN--
<IfModule unixd_module> #可以不用IfModule括起来建议设置运行用户组
User apache #运行apache的用户名
Group apache #运行apache的用户群组
</IfModule>
#<IfModule test> ... </IfModule> 配置段用于封装根据指定的模块是否启用而决定是否生效的指令。
#也就是说,如果启用了 test 模块,那么这些配置生效,如果没有启用,则不生效。
#--END--

### Section 2: 'Main' server configuration
ServerAdmin root@localhost  #系统管理员的邮箱,当网站出现问题的时候,错误信息会显示的联系邮箱

--BEGIN--
#ServerName www.example.com:80  #默认是不需要指定的,服务器通过名字解析过程来获得自己的名字,
#但如果解析有问题(如反向解析不正确),或者没有DNS名字,也可以在这里指定IP地址,当这项不正确的时候服务器不能正常启动。
#前面启动Apache时候提示正在启动  httpd:httpd: 
#apr_sockaddr_info_get() failed forjustin httpd: Could not  reliably determine the server's fully qualified domain name, using  127.0.0.1forServerName,解决方法就是启动该项把www.example.com:80修改为自己的域名或者直接修改为localhost
#--END--

UseCanonicalName Off  #如果客户端提供了主机名和端口,Apache将会使用客户端提供的这些信息来构建自引用URL。
#这些值与用于实现基于域名的虚拟主机的值相同,并且对于同样的客户端可用。CGI变量SERVER_NAME和SERVER_PORT也会由客户端提供的值来构建

DocumentRoot "/www/html"  #主站点的网页存储位置。
#--BEGIN--站点访问控制常见机制
<Directory /> 
    Options FollowSymLinks#Options(目录参数),此设置值表示在这个目录内能够让Apache进行的操作,
    #也就是针对Apache的程序的权限设置。主要的参数值在后文解释

    AllowOverride None
</Directory> #配置后文解释

<Directory "/var/www/html">  #使用Directory指定了一个绝对路径的目录
    Options Indexes FollowSymLinks  #Options(目录参数),此设置值表示在这个目录内能够让Apache进行的操作,
    #也就是针对Apache的程序的权限设置。主要的参数值在后文解释

    AllowOverride None #允许存在于.htaccess文件中的指令类型(.htaccess文件名是可以改变的,其文件名由AccessFileName指令决定):
    #当AllowOverride被设置为None时。不搜索该目录下的.htaccess文件(可以减小服务器开销)。

    Order allow,deny #控制规则,控制在访问时Allow和Deny两个访问规则哪个优先
    Allow from all #访问规则,允许全部主机访问
</Directory>
#--END--
<IfModule mod_userdir.c>
    UserDir disabled #用户目录,默认disabled表示禁止使用用户目录,

    #UserDir public_html #表示用户家目录的目录名称
    #访问格式为:"http://Serverr_IP/~Username/"注意访问格式是在用户名前面加一个“~”符号
</IfModule>

#--BRGIN--
#<Directory /home/*/public_html>
#    AllowOverride FileInfo AuthConfig Limit
#    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#    <Limit GET POST OPTIONS>
#        Order allow,deny
#        Allow from all
#    </Limit>
#    <LimitExcept GET POST OPTIONS>
#        Order deny,allow
#        Deny from all
#    </LimitExcept>
#</Directory>
#--END--

DirectoryIndex index.html index.html.var #网站默认的首页文件的名称,如果上面的文件全部存在的话,就会按照设置的顺序显示排在最前面的首页,这个与之前在Option中谈到的Indexes有关。

AccessFileName .htaccess #指定访问控制指定的文件,一般默认在目录下的.htaccess

<Files ~ "^\.ht">  #禁止用户访问.htpasswd和。htaccess
    Order allow,deny #定义控制规则,先allow,后deny
    Deny from all #拒绝所有主机
    Satisfy All
</Files>

TypesConfig /etc/mime.types  #用于设置保存有不同MIME(描述消息内容类型的因特网标准)类型数据的文件名

DefaultType text/plain  #默认的网页的类型

<IfModule mod_mime_magic.c>  #指定判断文件真实MIME类型功能的模块
#   MIMEMagicFile /usr/share/magic.mime
    MIMEMagicFile conf/magic
</IfModule>

HostnameLookups Off #当打开此项功能时,在记录日志的时候同时记录主机名,这需要服务器来反向解析域名,增加了服务器的负载,通常不建议开启

#EnableMMAP off #是否允许内存映射:如果httpd在传送过程中需要读取一个文件的内容,它是否可以使用内存映射。
#如果为on表示如果操作系统支持的话,将使用内存映射。在一些多核处理器的系统上,这可能会降低性能,如果在挂载了NFS的DocumentRoot上如果开启此项功能,可能造成因为分段而造成httpd崩溃

#EnableSendfile off #这个指令控制httpd是否可以使用操作系统内核的sendfile支持来将文件发送到客户端。
#默认情况下,当处理一个请求并不需要访问文件内部的数据时(比如发送一个静态的文件内容),如果操作系统支持,Apache将使用sendfile将文件内容直接发送到客户端而并不读取文件


#--BEGIN--
#httpd的日志默认存放在:/var/log/httpd/目录下,error_log表示错误日志,access_log表示访问日志
ErrorLog logs/error_log  #错误日志存放的位置
LogLevel warn  #错误日志存放的位置

#logFormat 定义日志
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined  #定义的日志格式
#常用日志如下:
# %h: 客户端IP地址
# %l: 表示远程登录名,通常为"-"
# %u: 表示认证时的远程用户名,没有指定是为"-"
# %t: 表示请求的具体时间;
# \"%r"\: 表示请求报文的起始行;注意"\"符号表示转义符;
# %>s: 表示响应的状态码;
# %b: 表示响应报文的长度,单位字节;
# %{Referer}i:请求报文中"referer"首部的值;当资源的访问路口,即从哪个页面中的超链接跳转而来;
# %{User-Agent}i:请求报文中"User-Agent"首部的;即发出请求用到的应用程序;
# %{Header_name}: 记录请求报文首部的内容:Value

LogFormat "%h %l %u %t \"%r\" %>s %b" common  #定义的日志格式
LogFormat "%{Referer}i -> %U" referer  #定义的日志格式
LogFormat "%{User-agent}i" agent  #定义的日志格式
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
#信息定义格式参考:https://httpd.apache.org/docs/2.2/logs.html

#CustomLog logs/access_log common  #指定不同日志的格式
#CustomLog logs/referer_log referer
#CustomLog logs/agent_log agent

CustomLog logs/access_log combined  #说明日志记录的位置,这里面使用了相对路径,所以ServerRoot需要指出,日志位置就存放在/etc/httpd/logs
#--END--

ServerSignature On  #定义当客户请求的网页不存在,或者错误的时候是否提示apache的版本的一些信息

Alias /icons/ "/var/www/icons/"  #定义一些不在DocumentRoot下的文件,而可以将其映射到网页根目录中,这也是访问其他目录的一种方法,但在声明的时候切记目录后面加”/”
# Alias /URL/ "/PATH/TO/SOMEDIR"
#   Alias /bbs/ "/forum/htdocs"
#       http://www.xxx.com/bbs/forum/index.html
#           --> /forum/htdocs/bbs/

#--BEGIN--
#访问目录控制,参数解释如上,
<Directory "/var/www/icons">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
#--END--

<IfModule mod_dav_fs.c> #对mod_dav_fs.c模块的管理
    # Location of the WebDAV lock database.
    DAVLockDB /var/lib/dav/lockdb
</IfModule>

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"  #对CGI模块的别名,与Alias类似

<Directory "/var/www/cgi-bin">  #CGI目录访问限制
    AllowOverride None #none表示不允许.htaccess的控制
    Options None #所有属性都不启用;
    Order allow,deny #定义访问主机
    Allow from all #表示允许所有主机
</Directory>

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8 
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
#当一个HTTP请求的URL为一个目录的时候,服务器返回这个目录中的索引文件,如果目录中不存在索引文件,并且服务器有许可显示目录文件列表的时候,
#就会显示这个目录中的文件列表,为了使得这个文件列表能具有可理解性,而不仅仅是一个简单的列表,就需要前这些参数。
#如果使用了IndexOptions FancyIndexing选项,可以让服务器针对不同的文件引用不同的图标。如果没有就使用DefaultIcon定义缺省图标。同样,使用AddDescription可以为不同类型的文档介入描述

AddLanguage ca .ca  #添加语言
....

LanguagePriority en ca cs da de ...  #Apache支持的语言

ForceLanguagePriority Prefer Fallback

AddDefaultCharset UTF-8  #默认支持的语言

#AddType application/x-tar .tgz
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz #支持对以.Z和.gz.tgz结尾的文件


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 cgi-script .cgi #修改为:AddHandler cgi-script .cgi .pl 表示允许扩展名为.pl的CGI脚本运行

#AddHandler send-as-is asis

AddHandler type-map var

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml  #添加动态处理类型为server-parsed由服务器预先分析网页内的标记,将标记改为正确的HTML标识

#--BEGIN--
#当服务器出现错误的时候,返回的页
# Some examples:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#--END--

Alias /error/ "/var/www/error/"  #目录的映射,信息参考下面单独的解释

#--BEGIN--
#对/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>

#    ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var #当服务器出现错误的时候,返回的页
#    ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
#    ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
...
</IfModule>
</IfModule>
#--END

#--BEGIN--
#设置特殊的参数,以保证对老版本浏览器的兼容,并支持新浏览器的特性
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
#--END--

#--BEGIN--
#站点访问控制机制,详细解释看下面的"站点访问控制常见机制"
#<Location /server-status>
#    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .example.com
#</Location>
#<Location /server-info>
#    SetHandler server-info
#    Order deny,allow
#    Deny from all
#    Allow from .example.com
#</Location>
#--END--

#--BEGIN--
#代理访问的配置
#<IfModule mod_proxy.c>
#ProxyRequests On
#
#<Proxy *>
#    Order deny,allow
#    Deny from all
#    Allow from .example.com
#</Proxy>

#ProxyVia On
#--END--

#--BEGIN--
#代理缓存存放路径配置
#<IfModule mod_disk_cache.c>
#   CacheEnable disk /
#   CacheRoot "/var/cache/mod_proxy"
#</IfModule>
#--END--
  • 虚拟主机
信息解释后面说.
### Section 3: Virtual Hosts
#NameVirtualHost *:80  #如果启用虚拟主机的话,必须将前面的注释去掉,而且,第二部分的内容都可以出现在每个虚拟主机部分。

#<VirtualHost *:80>  #标签后面的IP定义一定要和上面NameVirtualHost定义的一致
#    ServerAdmin webmaster@dummy-host.example.com  #管理员的邮箱
#    DocumentRoot /www/docs/dummy-host.example.com #虚拟主机的网页存放目录,必须,
#    ServerName dummy-host.example.com #能被DNS或Hosts解析的完整域名,必须
#    ErrorLog logs/dummy-host.example.com-error_log  #错误日志    
#    CustomLog logs/dummy-host.example.com-access_log common  #访问日志
#</VirtualHost>

站点访问控制常见机制

  1. 客户端来源地址
  2. 用户账号
  • 文件系统路径:
<Directory "/path"> #目录限定
#限定参数
</Directory>

<File "path/file">#具体文件限定
#限定参数
</File>

<FileMatch "PATHREG">#正则表达式限定
#限定参数
</FileMatch>
  • URL路径:
<Location "URI">
#限定参数
</Location>

<LocationMatch "URIREG">
#限定参数
</Location>
  • 示例:
<FileMatch "\.(gif|jpe?|png)$">#正则表达
<File "?at.*">#通配符,?是任意的一个字符,.就是点,*是任意字符串
<Location /status>#URL
<LocationMatch "/(extra|special)/data">

Options(目录参数列表)

  • Options:后跟1个或多个以空白字符分隔的选项列表
  • Indexes:如果在此目录下找不到首页文件(默认为index.html)时,就显示整个目录下的文件名,至于首页文件名则与DirectoryIndex设置的值有关,建议注释掉Indexes
  • FollowSymLinks:Fllow Symolic Links的缩写,字面意义是让连接文件可以生效。首页的目录是在/var/www/html,既然是WWW的根目录,理论上就像被chroot一般。一般说来说被chroot的程序无法离开其目录,也就是说,默认的情况下,你在/var/www/html下面的连接文件只要链接到非此目录的其他地方,则该连接文件默认是失效的。但是使用这个设置可以让链接有效的离开本目录,默认为禁用
  • SymLinksIfOwnerMatch:在连接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件;
  • ExecCGI:让此目录具有执行CGI的权限,非常重要。举例来说,OpenWebMail使用了很多Perl程序,你要让OpenWebMail可以执行,就需要在该程序所在目录拥有ExecCGI的权限才行。但是要注意:不要让所有的目录均可以使用ExecCGI
  • Includes:让一些Server-Side Include程序可以运行。建议可以加上去
  • MultiViews:这个有点像是多国语言的支持,与语言数据有关。在错误信息的回报内容中最常见,在同一台主机中,可以依据客户端的语言而给予不同的语言显示。默认在回报信息中存在,你可以检查一下/var/www/error/目录下的数据。
  • None: 所有属性都不启用;
  • All: 所有属性都启用;

AllowOverride(目录参数列表)

  • AllowOverride None:允许覆盖参数功能,表示是否允许额外配置文件.htaccess的某些参数覆盖。我们可以在httpd.conf内设置好所有的权限,不过这样一来,若用户自己的个人网页想要修改权限时将会对管理员造成困扰。因此,Apache默认可以让用户以目录下的.htaccess文件内覆盖<Direcoty>内的某些功能参数。这个项目则是在规定.htaccess可以覆盖的权限类型有哪些。常见的有以下几种:

    • ALL:全部的权限均可以覆盖
    • AuthConfig:仅有网页认证(帐号与密码)可以覆盖
    • Indexes:仅允许Indexes方面的覆盖
    • Limits:允许用户利用Allow、DenyOrder管理可浏览的权限
    • None:不可覆盖,也就是让.htaccess文件失效
使用.htaccess会严重影响到Apache的性能,如果不是特殊需要,建议关闭

Order(权限参数列表)

order和allow,deny(HTTP2.4版本已经取消,使用别的方法代替)
  • 可以放在Directory .htaccess
  • Apache内部的Order可以处理相关权限的限制,其中有两个值,Allow和Deny
  • Order deny,allow 可以理解为拒绝所有,开放特定(类似白名单)
  • Order allow,deny 可以理解为开放所有,拒绝特定(黑名单)
当allow与deny中有重复的规则出现,则最后一条的配置起到了决定性的作用,比如
Order allow,deny    //开放所有,拒绝特定
#该行和Allow以及Deny这三行是用来控制基于IP访问的,Order主要是定义允许或是解决的次序(例如:Order Deny,Allow 表示默认规则是Allow,不过优先匹配Deny,如果不在Deny的匹配列表中就表示默认运行访问哟),
#默认设置为:Order Allow,deny 表示拒绝所有的主机访问,没有在Allow的匹配列表中的都被拒绝,但是如果Allow如果写成Allow from all表示允许所有主机访问,配合Order的优先匹配规则则表示不拒绝任何的主机,
#因为所有的规则都会走Allow的优先匹配,换句话说,Order支持最小匹配范围,它可以智能的支持最佳匹配;

allow from all        //定义了允许的规则,开放所有
deny 192.168.1.1    //定义了拒绝的规则,拒绝了一个IP,这个IP包含在第二行的all当中,所以它的权限就默认由最后一行配置决定,最后一行是deny,所以1.1被被拒之门外

#示例
allow from 10.10.1.211 //允许来自211主机访问
deny from 10.10.1.109  //拒绝来自109主机的访问
#拒绝IP可以写成以下这种形式:
#10.10.1.0
#10.10.1.0/16
#10.10.1.0/255.255.255.0

VirtualHost

在虚拟主机之上还能设置很多的功能,第二部分的内容都可以出现在每个虚拟主机部分,最精简的配置是需要有ServerName和DocumentRoot这两个配置,在添加了虚拟主机的配置之后需要把中心主机的信息也单独写成一个虚拟机的配置,(或者注销ServerName和DocumentRoot这两个配置),不然中心主机名的服务就不知道丢到哪里去了,这一步骤在Apache帮助文档中称做:取消中心主机
当然,如果你想有多个域名都指向到同一个虚拟主机是可以通过在块中配置ServerAlias功能来实现的。

  • DNS指向问题:如果你设置了别名,多个域名指向同一个虚拟主机,那么一定要保证DNS能正常解析的到
  • 段配置指定作用域的问题:你可以把其他一些指令放入段中,以更好的配置一个虚拟主机。大部分指令都可以放入这些段中以改变相应虚拟主机配置。主服务器(main server)范围内的配置指令(在所有配置段之外的指令)仅在它们没有被虚拟主机的配置覆盖时才起作用。
  • 虚拟主机名的问题:当一个请求到达的时候,服务器会首先检查它是否使用了一个能和NameVirtualHost相匹配的IP地址。如果能够匹配,它就会查找每个与这个IP地址相对应的段,并尝试找出一个与请求的主机名相同的ServerName或ServerAlias配置项。如果找到了,它就会使用这个服务器。否则,将使用符合这个IP地址的第一个列出的虚拟主机。
  • 顺序展示:
客户端发起一个访问域名的请求 —> DNS解析到目标主机 —> 检查是否开启了虚拟主机的功能 —> 检查是否能和NameVirtualHost相匹配 —> 查找出每个与该IP对应的虚拟主机段配置 —> 尝试找出与请求的完整域名相同的ServerName或ServerAlias —> 如果找到就使用这个虚拟主机的配置 —> 如果配置中与中心主机的配置不冲突则优先使用中心主机的配置,如果找不到与之相匹配的完整域名的虚拟主机配置 —> 使用符合这个IP地址的第一个虚拟主机

综上所述,第一个列出的虚拟主机充当了默认虚拟主机的角色。当一个IP地址与NameVirtualHost指令中的配置相符的时候,主服务器中的DocumentRoot将永远不会被用到。所以,如果你想创建一段特殊的配置用于处理不对应任何一个虚拟主机的请求的话,你只要简单的把这段配置放到<VirtualHost>段中,并把它放到配置文件的最前面就可以了。

3. 使用示例(http2.x)

1. 修改中心配置

#1. 修改DocumentRoot为/www/html/,访问自己自定义的页面
[root@centos6 conf]# vim httpd.conf 
DocumentRoot "/www/html" #修改为自己的目录
[root@centos6 conf]# mkdir -p /www/html/
[root@centos6 conf]# touch /www/html/index.html
[root@centos6 conf]# echo "this is new page 1" > /www/html/index.html
[root@master ~]# curl 10.10.1.211
this is new page 1

#2. 启用目录索引
[root@centos6 ~]# vim /etc/httpd/conf/httpd.conf 
    Options FollowSymLinks indexes
[root@centos6 ~]# mv /etc/httpd/conf.d/welcome.conf{,.bak}
[root@centos6 ~]# rm -rf /www/html/index.html 
[root@master ~]# elinks 10.10.1.211
                                                             Index of /                     
   [ICO]  Name    Last modified   Size Description                                                                                   
   ═══════════════════════════════════════════════                                                                                   
   [TXT] 4445.c 12-Dec-2019 15:30    0                                                                                               
   [TXT] aap.c  12-Dec-2019 15:30    0                                                                                               
   ═══════════════════════════════════════════════                                                                                   
                                                                                                                                     
    Apache/2.2.15 (CentOS) Server at 10.10.1.211 Port 80   

#3. 开启踪符号链接文件
[root@centos6 html]# vim /etc/httpd/conf/httpd.conf 
    Options FollowSymLinks indexes
[root@master ~]# elinks 10.10.1.211
                                                             Index of /                                
   [ICO]  Name    Last modified   Size Description                                                                                   
   ═══════════════════════════════════════════════                                                                                   
   [TXT] 4445.c 12-Dec-2019 15:30    0                                                                                               
   [TXT] aap.c  12-Dec-2019 15:30    0                                                                                               
   [   ] fstab  02-Dec-2019 20:13  783                                                                                               
   ═══════════════════════════════════════════════                                                                                   
                                                                                                                                     
    Apache/2.2.15 (CentOS) Server at 10.10.1.211 Port 80 
#点击结果
# /etc/fstab                                                                                                                         
# Created by anaconda on Mon Dec  2 20:13:37 2019                                                                                    
#                                                                                                                                    
# Accessible filesystems, by reference, are maintained under '/dev/disk'                                                             
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info                                                          
#                                                                                                                                    
/dev/mapper/vg_centos6-lv_root /                       ext4    defaults        1 1                                                   
UUID=fd01fe3b-4678-4e93-84d1-e753e74284b5 /boot                   ext4    defaults        1 2                                        
/dev/mapper/vg_centos6-lv_swap swap                    swap    defaults        0 0                                                   
tmpfs                   /dev/shm                tmpfs   defaults        0 0                                                          
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0                                                          
sysfs                   /sys                    sysfs   defaults        0 0                                                          
proc                    /proc                   proc    defaults        0 0  


#4. Order 访问来源限制
[root@centos6 html]# vim /etc/httpd/conf/httpd.conf
    Order allow,deny
    allow from 10.10.1.211
    deny from 10.10.1.109
#10.10.1.109的机器访问结果
[root@master ~]# elinks 10.10.1.211
                                                                                                                       403 Forbidden      
   You don''t have permission to access / on this server.                                                                             
                                                                                                                                     
   ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════   
                                                                                                                                     
    Apache/2.2.15 (CentOS) Server at 10.10.1.211 Port 80  
# 10.10.1.211本机访问
[root@centos6 ~]# elinks 10.10.1.211
                                                             Index of /                                                                               
   [ICO]  Name    Last modified   Size Description                                                                                   
   ═══════════════════════════════════════════════                                                                                   
   [TXT] 4445.c 12-Dec-2019 15:30    0                                                                                               
   [TXT] aap.c  12-Dec-2019 15:30    0                                                                                               
   [   ] fstab  02-Dec-2019 20:13  783                                                                                               
   ═══════════════════════════════════════════════                                                                                   
                                                                                                                                     
    Apache/2.2.15 (CentOS) Server at 10.10.1.211 Port 80   

#5. 自定义默认页面
[root@centos6 html]# vim /etc/httpd/conf/httpd.conf
DirectoryIndex index.html index.html.var ab.html #添加一个自定义的主页
[root@centos6 ~]# echo "this is ab.index" > /www/html/ab.html
[root@master ~]# curl 10.10.1.211
this is ab.index

#6. 路径别名设置
[root@centos6 ~]# mkdir -p /www/bbs/docs/
[root@centos6 ~]# echo "referer /bbs/ to /www/bbs/docs/" > /www/bbs/docs/index.html 
[root@master ~]# curl 10.10.1.211/bbs/
referer /bbs/ to /www/bbs/docs/

2. basic用户认证示例

  • 单用户定义
<Directory "">
    Options None
    AllowOverride None
    AuthType Basic #认证方式
    AuthName "STRING" 
    AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD" #passwd路径
    Require valid-user
</Directory>
  • 多用户
<Directory "">
    Options None
    AllowOverride None
    AuthType Basic #认证方式
    AuthName "STRING" 
    AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD" #passwd文件
    AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" #组用户文件
    Require group GROUP1 GROUP2...
</Directory>
  • 示例:
#7. 配置basic认证
[root@centos6 conf]# vim httpd.conf 
Alias /admin/ "/www/docs/admin/" #由于documentroot'目录定义的不一样所以需要用Alias映射一下目录

<Directory "/www/docs/admin"> #定义目录规则
    Options indexes #没有主页面文件时允许索引
    AllowOverride None #禁用每目录控制
    AuthType Basic #定义使用basic认证
    AuthName "root input" #WWW-Authenticate: Basic realm="root input"
    AuthUserFile "/etc/httpd/conf.d/.htpasswd" #密码文件储存位置
    Require valid-user # 允许账号中所有文件登录
#    Requie user root #表示只允许root这个用户登录
</Directory>
#测试结果
[root@centos6 www]# elinks 10.10.1.211/admin/
                                                       Authorization Required 
   This server could not verify that you are authorized to access the document requested. Either you supplied the wrong              
   credentials (e.g., bad password), or your browser doesn''t understand how to supply the credentials required.                      
   ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════   
    Apache/2.2.15 (CentOS) Server at 10.10.1.211 Port 80           
                                 ╔════════════════════════════════════════════════════════════════╗                                  
                                 ║  Authentication required for root input at http://10.10.1.211  ║                                  
                                 ║                                                                ║                                  
                                 ║     Login:______________________________                       ║                                  
                                 ║                                                                ║                                  
                                 ║  Password:______________________________                       ║                                  
                                 ║                                                                ║                                  
                                 ║                      [ OK ]   [ Cancel ]                       ║                                  
                                 ╚════════════════════════════════════════════════════════════════╝    
#创建用户账号
htpasswd [options] passwdfile usernamefile
    -c: 自动创建PassWD,
    -m: 使用md5加密用户密码
    -s: sha1加密用户密码;
    -D: 删除指定用户
#第一次添加
[root@centos6 conf]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd root
New password: 
Re-type new password: 
Adding password for user root
#第二次添加
[root@centos6 conf]# htpasswd -m /etc/httpd/conf.d/.htpasswd root2
New password: 
Re-type new password: 
Adding password for user root2

[root@centos6 conf]# htpasswd -m /etc/httpd/conf.d/.htpasswd root2
New password: 
Re-type new password: 
Adding password for user root2
#再次登录访问
[root@develop-vscode ~]# elinks 10.10.1.211/admin/
                                    http://10.10.1.211/admin/ 
   this is path '/www/docs/' basic Aut                                                                                               

#8. 基于组的basic认证
[root@centos6 ~]#vim /etc/httpd/conf/httpd.conf
Alias /admin/ "/www/docs/admin/"

<Directory "/www/docs/admin">
    Options indexes
    AllowOverride None
    AuthType Basic
    AuthName "Group Auth"
    AuthUserFile "/etc/httpd/conf.d/.htpasswd" #指定用户密码文件
    AuthGroupFile "/etc/httpd/conf.d/.htgroup" #指定组用户文件
    Require group admins #指定允许登录的用户组
</Directory>
#编辑.htgroup文件指定用户组的用户
[root@centos6 conf]# vim /etc/httpd/conf.d/.htgroup
admins: root admin1 admin2 #用户组的用户,空格分隔

虚拟主机示例:

  • 虚拟主机的三种实现方案:

基于ip:为每个虚拟主机准备至少一个ip地址;

基于port:为每个虚拟主机至少一个专用的port;实践中很少用

基于hostname:为每个主机准备至少一个专用的hostname;

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

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

  • 虚拟主机的配置方法:
<VirtualHost "IP:PORT">
    ServerName 
    DocumentRoot ""
</VirtualHost>

ServerAlias: #虚拟主机的别名:
ErrorLog #错误日志存放路径
CustomLog #访问日志的存放位置,后面接上日志定义类型

#例如:完整的虚拟主机定义格式
NameVirtualHost *:80 #使用FQDN时需要开启这个
<VirtualHost "IP:PORT">
    ServerName  hostname
    DocumentRoot ""
    <Directory> #可以单独给这个虚拟主机定义目录权限
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    CustomLog ""#日志存放目录
</VirtualHost>
  • 虚拟主机配置示例:
注意:需要关闭中心主机,否则报错!!!
#.1 基于IP的配置方式
[root@centos6 ~]# ip addr add 10.10.1.122/24 dev eth0 label 'eth0:1' #为网卡建立一个别名添加一个新ip
[root@centos6 ~]# ip link set eth0:1 down;ip link set eth0:1 up 
[root@centos6 ~]# mkdir /www/itdc.com/;echo "this server is itdc.com the path '/www/itdc.com/'" > /www/itdc.com/index.html
[root@centos6 ~]# vim /etc/httpd/conf/httpd.conf 
<VirtualHost "10.10.1.211:80">
        ServerName itab.com
        DocumentRoot "/www/itab.com/"
</VirtualHost>
<VirtualHost "10.10.1.122:80">
        ServerName itdc.com
        DocumentRoot "/www/itdc.com/"
</VirtualHost>
[root@centos6 ~]# service httpd restart 
#测试结果
[root@develop-vscode ~]# curl 10.10.1.211
this server is itab.com the path '/www/itab.com/'
[root@develop-vscode ~]# curl 10.10.1.122
this server is itdc.com the path '/www/itdc.com/'

#2. 基于端口的虚拟主机配置示例:
[root@centos6 ~]# vim /etc/httpd/conf/httpd.conf 
Listen 8080 #一定要添加一个监听端口
<VirtualHost "10.10.1.211:80">
        ServerName itab.com
        DocumentRoot "/www/html/"
</VirtualHost>

<VirtualHost "10.10.1.211:8080">
        ServerName itdc.com
        DocumentRoot "/www/docs/"
</VirtualHost>
[root@centos6 ~]# service httpd restart
[root@centos6 ~]# netstat -luntp | grep -E "(80|8080)"
tcp        0      0 :::8080                     :::*           LISTEN      6051/httpd          
tcp        0      0 :::80                       :::*            LISTEN      6051/httpd  
#测试结果
[root@develop-vscode ~]# curl 10.10.1.211:80
this page port 80
[root@develop-vscode ~]# curl 10.10.1.211:8080
this page port 8080

#3. 基于主机的配置方式示例:
[root@centos6 ~]# vim /etc/httpd/conf/httpd.conf 
NameVirtualHost *:80 #一定要开启这个

<VirtualHost "*:80">
        ServerName web1.itab.com
        DocumentRoot "/www/itab.com/"
</VirtualHost>

<VirtualHost "*:80">
        ServerName web2.itab.com
        DocumentRoot "/www/itab.com2/"
</VirtualHost>

<VirtualHost "10.10.1.122:80">
        ServerName web3.itab.com
        DocumentRoot "/www/itab.com3/"
        CustomLog "/root/web3.itab.com.access.log" combined #定义虚拟主机日志
</VirtualHost>
[root@centos6 ~]# service httpd restart
#由于是测试在本机添加host进行FQDN访问
[root@develop-vscode ~]# vim /etc/hosts  
10.10.1.211 web1.itab.com
10.10.1.211 web2.itab.com
10.10.1.122 web3.itab.com
#测试结果
[root@develop-vscode ~]# curl web1.itab.com
this is site web1.itab.com
[root@develop-vscode ~]# curl web2.itab.com
this is site web2.itab.com
[root@develop-vscode ~]# curl web3.itab.com
this is site web3.itab.com

#3. 内置的status页面的开启
<Location /server-status>
    SetHandler server-status
    Order allow,deny
    allow from all
#    Allow from .example.com
</Location>

页面压缩(mod_deflate)

  • 适用场景:

    • (1) 节约带宽,额外消耗CPU;同时,可能有 些较老浏览器不支持;
    • (2) 压缩适于压缩的资源,例如文件文件;
  • 需要开启的模块:
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
  • 配置方法:
#SetOutputFilter DEFLATE:压缩过滤器,设置支持压缩的文件类型

#  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 #压缩级别,级别越大压缩越高使用CPU周期越大


## Netscape 4.x has some problems.  #对某些浏览器进行不压缩处理或只是压缩指定的文件
#BrowserMatch ^Mozilla/4 gzip-only-text/htm

## Netscape 4.06-4.08 have some more problems
#BrowserMatch ^Mozilla/4\.0[678] no-gzi

## MSIE masquerades as Netscape, but it is fine
#BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

#定义方式:
<ifModule mod_deflate.c>
    SetOutputFilter DEFLATE
    DeflateCompressionLevel 9
    #指定压缩文件类型
    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
    #指定文件压缩
    #AddOutputfilter sh php 

    #指定不压缩图片
    #SetEnvifNocase Request_URL .(?:gif|jpe?g|png)$ no-gzip dont-vary

    BrowserMatch ^Mozilla/4 gzip-only-text/htm
    BrowserMatch ^Mozilla/4\.0[678] no-gzi
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
</ifModule>
  • 使用示例:
#1.无压缩的结果测试
[root@centos6 ~]# vim /etc/httpd/conf/httpd.conf 
<VirtualHost "10.10.1.211:80">
        ServerName web1.itab.com
        DocumentRoot "/www/html/"
        CustomLog "/root/10.10.1.211.access.log" combined
</VirtualHost>
[root@centos6 conf]# service httpd restart
[root@develop-vscode log]# curl -I 10.10.1.211 
HTTP/1.1 200 OK
Date: Fri, 13 Dec 2019 14:51:53 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 13 Dec 2019 14:47:48 GMT
ETag: "a0014-5b495-59996f20b1703"
Accept-Ranges: bytes
Content-Length: 373909 #内容大小
Content-Type: text/html; charset=UTF-8

#2. 配置使用压缩
#--BEGIN--
SetOutputfilter DEFLATE
DeflateCompressionLevel 9
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
# 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
#--END

#测试结果
[root@develop-vscode ~]# curl -I 10.10.1.211 --compressed
HTTP/1.1 200 OK
Date: Fri, 13 Dec 2019 15:06:04 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 13 Dec 2019 14:47:48 GMT
ETag: "a0014-5b495-59996f20b1703"
Accept-Ranges: bytes
Vary: Accept-Encoding
Content-Encoding: gzip #压缩方式
Content-Length: 21530 #大小对比上面大约减少了1/3
Content-Type: text/html; charset=UTF-8

4. SSL配置

  • http over ssl = https 443/tcp

    • ssl: v3
    • tls: v
  • SSL会话的简化过程

    • (1) 客户端发送可供选择的加密方式,并向服务器请求证书;
    • (2) 服务器端发送证书以及选定的加密方式给客户端;
    • (3) 客户端取得证书并进行证书验正:

      • 如果信任给其发证书的CA:

        • (a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
        • (b) 验正证书的内容的合法性:完整性验正
        • (c) 检查证书的有效期限;
        • (d) 检查证书是否被吊销;
        • (e) 证书中拥有者的名字,与访问的目标主机要一致;
    • (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
    • (5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
  • 注:关于详细的证书创建查看上几篇文章.此处不做详细说明

4.1 创建自签CA证书

CA服务器IP:10.10.1.109,主机名:master

httpd服务器ip:10.10.1.211,主机名:centos6

  • 证书生成步骤:
#1. CA服务器创建CA证书
[root@master CA]# cd /etc/pki/CA/
[root@master CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)
[root@master CA]# touch index.txt
[root@master CA]# echo 01 > serial
[root@master CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7300
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Ghuangzhou
Locality Name (eg, city) [Default City]:Ghuangzhou
Organization Name (eg, company) [Default Company Ltd]:ca send
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server''s hostname) []:ca.itab.com
Email Address []:caadmin@itab.com


#2. web服务器生成CA证书请求
[root@centos6 ssl]# (umask 077;openssl genrsa -out httpd.key 1024) #生成秘钥
Generating RSA private key, 1024 bit long modulus
........++++++
...........++++++
e is 65537 (0x10001)

[root@centos6 ssl]# openssl req -new -key httpd.key -out httpd.csr #web server创建CA证书
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:Ghuangzhou
Locality Name (eg, city) [Default City]:Ghuangzhou
Organization Name (eg, company) [Default Company Ltd]:ca send
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server''s hostname) []:web1.itab.com
Email Address []:webadmin@itab.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

[root@centos6 ssl]# scp httpd.csr root@10.10.1.109:/tmp/httpd.csr #上传CA证书到ca服务器进行签名
root@10.10.1.109''s password: 
httpd.csr                                                                                          100%  704     0.7KB/s   00:00  


#3. CA服务器对客户端发送的CA证书进行签名
[root@master CA]# openssl ca -in /tmp/httpd.csr -out certs/web1.itab.com.crt -days 365  
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Dec 14 05:36:47 2019 GMT
            Not After : Dec 13 05:36:47 2020 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Guangzhou
            organizationName          = ca send
            organizationalUnitName    = ops
            commonName                = web1.itab.com
            emailAddress              = web1admin@itab.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                CD:EB:57:33:C0:A0:D1:36:86:D7:4F:BA:D7:11:83:EC:F8:E1:8A:76
            X509v3 Authority Key Identifier: 
                keyid:0F:53:D1:7B:1C:47:21:13:46:BE:ED:A7:05:79:6C:F6:46:A3:83:13

Certificate is to be certified until Dec 13 05:36:47 2020 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

#4. CA服务器签好的证书发送会客户端
[root@master CA]# scp certs/web1.itab.com.crt root@10.10.1.211:/etc/httpd/ssl/
root@10.10.1.211''s password: 
web1.itab.com.crt                                                               100% 4627    10.5MB/s   00:00 
[root@centos6 ssl]# ll
总用量 16
-rw-r--r-- 1 root root 1062 12月 14 13:33 httpd.csr
-rw------- 1 root root 1679 12月 14 13:31 httpd.key
-rw-r--r-- 1 root root 4627 12月 14 13:37 web1.itab.com.crt

4.2 httpd配置ssl

  • 查看httpd是否安装ssl模块:
#查看是否安装ssl模块
[root@centos6 ssl]# httpd -M | grep ssl
Syntax OK

#安装ssl模块
[root@centos6 ssl]# yum install -y mod_ssl

#再次查看是否有ssl模块
[root@centos6 ssl]# httpd -M | grep ssl
 ssl_module (shared)
Syntax OK

#ssl模块安装目录
[root@centos6 ssl]# rpm -ql mod_ssl
/etc/httpd/conf.d/ssl.conf
/usr/lib64/httpd/modules/mod_ssl.so
/var/cache/mod_ssl
/var/cache/mod_ssl/scache.dir
/var/cache/mod_ssl/scache.pag
/var/cache/mod_ssl/scache.sem
  • 编辑配置文件:
#备份ssl.conf文件,以便出问题好回滚
[root@centos6 conf.d]# cd /etc/httpd/conf.d/
[root@centos6 conf.d]# cp ssl.conf{,.bak} -v
"ssl.conf" -> "ssl.conf.bak"
[root@centos6 conf.d]# ll
总用量 32
-rw-r--r--. 1 root root  392 6月  19 2018 README
-rw-r--r--  1 root root 9465 2月  19 2018 ssl.conf
-rw-r--r--  1 root root 9465 12月 14 13:45 ssl.conf.bak

#1. 编辑ssl.conf文件
[root@centos6 conf.d]# vim /etc/httpd/conf.d/ssl.conf
LoadModule ssl_module modules/mod_ssl.so #加载ssl模块
Listen 443 #监听443端口,也就是https的端口
<VirtualHost *:443> #_default_表示默认的虚拟主机,如果定义多个虚拟主机,默认访问的话会返回第一个.因此我们不指定默认访问的虚拟主机
DocumentRoot "/www/itab.com" #站点目录
ServerName web1.itab.com:443 #主机名,
ErrorLog logs/ssl_error_log #专门错误日志
TransferLog logs/ssl_access_log #传输日志
LogLevel warn #日志记录级别
SSLEngine on #是否开启ssl,on表示开启,off表示关闭
SSLProtocol all -SSLv2 #支持的ssl协议版本,all表示全部支持,-SSLv2表示出了这个全部都支持
SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES #支持的加密方式.DEFAULT表示默认的加密方式,
#!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES 表示除了前面加了!的加密方式不支持外其他都支持,+3DES表示额外还支持的加密方式
SSLCertificateFile FILE #证书文件
SSLCertificateKeyFile FILE #与证书匹配的私钥KEY文件
SSLVerifyClient require #是否验证客户端证书

#检查配置语法后重启
[root@centos6 conf.d]# httpd -t
Syntax OK
[root@centos6 conf.d]# service httpd restart

#查看80 443端口是否监听
[root@centos6 conf.d]# netstat -luntp | grep -E '(80|443)'
tcp        0      0 :::8080                     :::*                        LISTEN      1863/httpd          
tcp        0      0 :::80                       :::*                        LISTEN      1863/httpd          
tcp        0      0 :::443                      :::*                        LISTEN      1863/httpd
  • 测试ssl访问是否正确

测试基于https访问相应的主机;

openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
[root@master ~]# openssl  s_client -connect 10.10.1.211:443 -CAfile /etc/pki/CA/cacert.pem 
CONNECTED(00000003)
depth=1 C = CN, ST = Guangzhou, L = Guangzhou, O = ca send, OU = ops, CN = ca.itab.com, emailAddress = caadmin@itab.com
verify return:1
depth=0 C = CN, ST = Guangzhou, O = ca send, OU = ops, CN = web1.itab.com, emailAddress = web1admin@itab.com
verify return:1 #检验回话
---
Certificate chain
 0 s:/C=CN/ST=Guangzhou/O=ca send/OU=ops/CN=web1.itab.com/emailAddress=web1admin@itab.com
   i:/C=CN/ST=Guangzhou/L=Guangzhou/O=ca send/OU=ops/CN=ca.itab.com/emailAddress=caadmin@itab.com
---
Server certificate
-----BEGIN CERTIFICATE-----
MIID/zCCAuegAwIBAgIBATANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UEBhMCQ04x
EjAQBgNVBAgMCUd1YW5nemhvdTESMBAGA1UEBwwJR3Vhbmd6aG91MRAwDgYDVQQK
DAdjYSBzZW5kMQwwCgYDVQQLDANvcHMxFDASBgNVBAMMC2NhLml0YWIuY29tMR8w
HQYJKoZIhvcNAQkBFhBjYWFkbWluQGl0YWIuY29tMB4XDTE5MTIxNDA1MzY0N1oX
DTIwMTIxMzA1MzY0N1owfDELMAkGA1UEBhMCQ04xEjAQBgNVBAgMCUd1YW5nemhv
dTEQMA4GA1UECgwHY2Egc2VuZDEMMAoGA1UECwwDb3BzMRYwFAYDVQQDDA13ZWIx
Lml0YWIuY29tMSEwHwYJKoZIhvcNAQkBFhJ3ZWIxYWRtaW5AaXRhYi5jb20wggEi
MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzuUCZgpJak78JiUbLujxV5Alu
b2J3jtpS3y0wJviq5XCTvLiyCjVJPhqL/8RRdcfcah1T3EEoX9rIgc8dQ4OA+Tn6
AIn2CaJCE8wv3Xpu58NUzjHc4XyBBA/aRJ02Ym5hjrPFAmAyc7Hirxl6/zqVqHhr
36XVUjItjUrlYkWHrH41hlvfOBokIwYcYZwxjnl8VpKKE5pasZ1iDm3DWSSOAjnz
NDfrd3w1u74+TcUAisquRXmaK9cJzHdpN/ZySVCWPeGrQw6jDRzuZD0fsuKexhdC
iYp/BLvqBuVInjeyQy3EtouYH6S3PG+CgVsmA19XJ/MT7lpiZAWwKXG4yHDLAgMB
AAGjezB5MAkGA1UdEwQCMAAwLAYJYIZIAYb4QgENBB8WHU9wZW5TU0wgR2VuZXJh
dGVkIENlcnRpZmljYXRlMB0GA1UdDgQWBBTN61czwKDRNobXT7rXEYPs+OGKdjAf
BgNVHSMEGDAWgBQPU9F7HEchE0a+7acFeWz2RqODEzANBgkqhkiG9w0BAQsFAAOC
AQEADyrG3QkPBCvI1BVAEO02il7Cno3fI+crJ4e64iIblB0QJikTaGt/2QloVa+j
b7/8dhiC1E1IiZ31Vnm6dTEivNTboJS6hmQW38VzgM0ZzH6J7MwJ/4dvtN+A31Ix
/msRqGfR4g4TSNwwgcXToY/fS1bMJxb7UCpoGIqduxC9YbtQzSJjvCyp8LmGwSzd
87/SqHasLJKQE2oWFDcJN1gYRlWJuzzocziWwxhmCbCdbxLrMnucUzYuyyMJz0FE
/Wr2PBMwHSAl7riJ7b25oALaFu8eZAtOTfuY7kceBpsVUmEEvX7WshTCFg8jHaO/
pqosMOPbyN4vpm7yx9kWxJiEyQ==
-----END CERTIFICATE----- #证书文件信息
subject=/C=CN/ST=Guangzhou/O=ca send/OU=ops/CN=web1.itab.com/emailAddress=web1admin@itab.com
issuer=/C=CN/ST=Guangzhou/L=Guangzhou/O=ca send/OU=ops/CN=ca.itab.com/emailAddress=caadmin@itab.com
---
No client certificate CA names sent #客户端没有证书
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 1718 bytes and written 415 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-GCM-SHA384
    Session-ID: 24E1E99D615372E0CB47DEB822CDDD3F05FAD9CC0EAA13867982CAD98D5BFC86
    Session-ID-ctx: 
    Master-Key: D239EB9CE8B6D8016A2A01E71C2EA50DCC465E66F65949F38CD6528AD04A570F9A637719E5E230320CDC32FAE45D7C30
    Key-Arg   : None
    Krb5 Principal: None
    PSK identity: None
    PSK identity hint: None
    TLS session ticket lifetime hint: 300 (seconds)
    TLS session ticket:
    0000 - 7f d9 8b 70 ad f8 62 fd-6a c8 ea 1a a1 1b ac f2   ...p..b.j.......
    0010 - e2 67 e4 15 1f ce 05 41-9c 2e 48 26 0d 98 e5 d3   .g.....A..H&....
    0020 - a8 8b 19 a6 85 79 bb f3-d9 c7 c2 7d 40 af 97 1f   .....y.....}@...
    0030 - e0 34 ce 09 82 00 9d e6-82 78 75 6a b7 10 b2 b9   .4.......xuj....
    0040 - f5 06 25 2f ec f1 de 59-af 38 3b dc 4c dc bc cb   ..%/...Y.8;.L...
    0050 - a5 8a 3e 2f 27 80 50 c0-e4 3f bb 9e 0b 32 28 6a   ..>/'.P..?...2(j
    0060 - 50 35 83 fd e6 c4 6f cf-86 c0 01 98 cb 10 eb 90   P5....o.........
    0070 - b3 fe a8 dc 6c aa d2 da-ea 41 b1 c8 fa a0 57 be   ....l....A....W.
    0080 - 0b b3 d7 a9 e7 60 ef 37-af 25 d2 48 32 1d 57 5f   .....`.7.%.H2.W_
    0090 - 35 09 76 1f 5c 9c 2b a9-93 12 ac 1b 6f 23 60 e2   5.v.\.+.....o#`.
    00a0 - a3 1a c3 3c a0 82 de a4-d0 c1 b7 5e 84 cf 93 b4   ...<.......^....
    00b0 - 11 bf 28 d7 d1 a9 06 27-ce 4f bc f4 a6 b1 52 a1   ..(....'.O....R.

    Start Time: 1576306550
    Timeout   : 300 (sec)
    Verify return code: 0 (ok) #建立成功返回ok
---

httpd 2.4

  • httpd-2.4新特性:

    • (1) MPM支持运行DSO机制;以模块形式按需加载;
    • (2) 支持event MPM;
    • (3) 支持异步读写;
    • (4) 支持每模块及每个目录分别使用各自的日志级别;
    • (5) 每请求配置;
    • (6) 增强版的表达式分析器;
    • (7) 支持毫秒级的keepalive timeout;
    • (8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令;
    • (9) 支持用户自定义变量;
  • 新模块:

    • (1) mod_proxy_fcgi:快速代理协议后端程序,实现httpd以fcgi和后端php服务器相结合
    • (2) mod_ratelimit:为客户端提供带宽速率限制
    • (3) mod_remoteip:实现远端ip地址的控制
  • 修改了一些配置机制:

    • 再支持使用Order, Deny, Allow来做基于IP的访问控制;
CentOS7:可以用yum安装,yum安装比较简单不详细说
CentOS6:编译安装

httpd2.4的编译安装

  • httpd依赖:apr,apr-util,[apr-icon]

    • apr: apache portable runtime
注意:httpd依赖的apr,apr-util版本1.4+,
[root@master xiaoqi]# yum groupinstall "Development Tools"
[root@master xiaoqi]# yum install -y openssl-devel pcre-devel expat-devel

apr编译

[root@master xiaoqi]# cd apr-1.6.5/
[root@master apr-1.6.5]# ./configure --prefix=/usr/local/apr
[root@master apr-1.6.5]# make && make install 

[root@master apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@master apr-util-1.6.1]# make && make install 

httpd编译

[root@master xiaoqi]# groupadd -r apache  #-r建立系统账号
[root@master xiaoqi]# useradd -M -r -g apache apache #-M不建立家目录
[root@master httpd-2.4.41]# ./configure --prefix=/usr/local/apache --sysconf=/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=prefork
[root@master httpd-2.4.41]# make && make install 

#设置环境变量
[root@master bin]# PATH=$PATH:/usr/local/apache/bin
[root@master bin]# export PATH 
使用方法大致都一样,唯一的区别是部分配置不一样.

httpd2.4 文件目录及配置

[root@master httpd]# tree
.
|-- conf # 主配置文件
|   |-- httpd.conf
|   `-- magic
|-- conf.d #辅助配置文件
|   |-- autoindex.conf
|   |-- README
|   |-- userdir.conf
|   `-- welcome.conf
|-- conf.modules.d #模块配置文件
|   |-- 00-base.conf
|   |-- 00-dav.conf
|   |-- 00-lua.conf
|   |-- 00-mpm.conf
|   |-- 00-proxy.conf
|   |-- 00-systemd.conf
|   `-- 01-cgi.conf
|-- logs -> ../../var/log/httpd
|-- modules -> ../../usr/lib64/httpd/modules
`-- run -> /run/httpd 
# mpm:以DSO机制提供,配置文件00-mpm.conf
  • 切换使用MPM:
[root@master httpd]# vim conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
#NAME: prefork, event, worker
  • 基于IP的访问控制法则:
# 允许所有主机访问:Require all granted
# 
# 拒绝所有主机访问:Require all deny
# 控制特定IP访问:
#     Require ip IPADDR:授权指定来源地址的主机访问
#     Require not ip IPADDR:拒绝指定来源地址的主机访问
#     IPADDR:
#         IP: 172.16.100.2
#         Network/mask: 172.16.0.0/255.255.0.0
#         Network/Length: 172.16.0.0/16
#         Net: 172.16
# 控制特定主机(HOSTNAME)访问
#     Require host HOSTNAME
#     Require not host HOSTNAME
#     HOSTNAME:
#         FQDN: 特定主机
#         DOMAIN:指定域内的所有主机

<RequireAll> #单独拒绝ip访问需要定义容器
    Require all granted
    Require not ip 10.10.1.109
</RequireAll>
最后修改:2019 年 12 月 14 日 05 : 21 PM

发表评论