首页 > 代码库 > httpd配置.md

httpd配置.md

httpd-2.2 配置

监听端口和IP

配置文件:

Listen  [IP:]PORT
  • 省略IP表示为0.0.0.0

  • Listen指令可重复出现多次

  • 修改监听socket,重启服务进程方可生效

  • 可以监听在指定的IP地址的端口上,但这么操作必须重启服务

持久连续

我们知道http是无状态、无连接的,无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了提高httpd服务器的响应速度我们可以把服务器设置成持久连接的,这样tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行。但是这么操作就会出现一个问题就是如何断开?在设置中我们可以通过时间限制和数量限制来实现,下面是httpd服务的相关配置。

KeepAlive Off
MaxKeepAliveRequests 100
KeepAliveTimeout 30
  • KeepAlive:是否打开持续连接。

  • MaxKeepAliveRequests:在持续连接期间允许的最大请求数,设置为0允许无限量。

  • KeepAliveTimeout:同一个客户端在同一个连接上最大请求的时间。
    下面我们把KeepAlive给打开并且在浏览器中查看响首部中的内容:

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Length:19
Content-Type:text/html; charset=UTF-8
Date:Sun, 20 Nov 2016 11:18:20 GMT
ETag:"2c74-13-54131563ee60b"
Keep-Alive:timeout=30, max=100
Last-Modified:Sun, 13 Nov 2016 16:37:19 GMT
Server:Apache/2.2.15 (CentOS)

那个在服务器中该如何设置此参数呢?下面一篇文章是有关此参数的介绍,通过查阅此文章在根据实际情况进行设置。总结是:如果网站没有做动静分离就不要设置此参数了,如果做了则在动态服务中关闭此功能,而在存静态的内容中打开此功能,但是实际的参数设置还是需要看网站的情况。(我也不会.....)
KeepAlive和TimeOut参数解析

MPM多道处理模块

在httpd-2.2中不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不同的MPM机制的支持;如果想切换则可以在/etc/sysconfig/httpd 中进行配置,由于event在httpd-2.2中还不是很成熟,所以只能选择使用prefork或者worker模型。下面是参数介绍:

prefork

<IfModule prefork.c>
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>
  • StartServers # 服务器启动时建立的子进程数量。

  • MinSpareServers # 空闲子进程的最小数量;如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。

  • MaxSpareServers #空闲子进程的最大数量;如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程会杀死多余的子进程。

  • ServerLimit #最大活动进程数。

  • MaxClients #限定服务器同一时间内客户端最大接入的请求数量;任何超过了MaxClients限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务,如果要增大这个数值,必须先增大 ServerLimit。

  • MaxRequestsPerChild #每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。 这里建议设置为非零,注意原因:

    • 能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。

    • 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。

通过下面查看httpd进程就可以看到机器默认启动5个工作进程,还有一个是master进程主要负责调度的。

# ps aux |grep httpd |grep -v grep
root      9884  0.0  0.3 183856  3724 ?        Ss   19:18   0:00 /usr/sbin/httpd
apache    9888  0.0  0.3 183992  3128 ?        S    19:18   0:00 /usr/sbin/httpd
apache    9889  0.0  0.2 183856  2460 ?        S    19:18   0:00 /usr/sbin/httpd
apache    9890  0.0  0.2 183856  2460 ?        S    19:18   0:00 /usr/sbin/httpd
apache    9892  0.0  0.2 183856  2460 ?        S    19:18   0:00 /usr/sbin/httpd
apache    9893  0.0  0.2 183856  2460 ?        S    19:18   0:00 /usr/sbin/httpd

worker

<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>
  • StartServers #服务器启动时建立的子进程数量。

  • MaxClients #限定服务器同一时间内客户端最大接入的请求数量。

  • MinSpareThreads #空闲子进程的最小数量,默认25

  • MaxSpareThreads #空闲子进程的最大数量,默认75

  • ThreadsPerChild #每个子进程产生的线程数量,默认是25

  • MaxRequestsPerChild #每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。 这里建议设置为非零,注意原因:

    • 能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。

    • 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。

DSO模块的加载方式

若在httpd中加载新的或者取消相对应的模块,首先在配置文件添加模块的路径,然后在重新载入httpd程序就行了,这里在配置文件中添加模块时模块的路径可以是绝对路径也可以是相对路径(对于ServerRoot所定义的位置而言,默认路径为:/etc/httpd)。若取消则在配置文件注释并重新载入httpd系统即可。

相对路径:LoadModule foo_module modules/mod_foo.so
绝对路径:LoadMoudule php5_module /usr/lib64/httpd/modules/php.so

配置站点根目录

DocumentRoot  "/path/to/somewhere"

DoucmentRoot指向的路径为URL路径的起始位置,其相当于站点URL的根路径;系统默认的根目录为/var/www/html,若想更改为别处则在配置文件中更改此选项。

站点访问控制

可基于两种机制指明对哪些资源进行何种访问控制:

  • 文件系统路径

<Directory  "">
...
</Directory>

<File  "">
...
</File>

<FileMatch  "PATTERN">
...
</FileMatch>
  • URL路径

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

<LocationMatch "">
...
</LocationMatch>

<Directory>中“基于源地址”实现访问控制

  1. Options

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

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

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

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

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

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

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

  • None:全部禁用。

  • All:全部启用。

  1. AllowOverride
    与访问控制相关的那些指令可以放在.htaccess文件(每个目录下都可以有一个)中;不建议使用,默认并没有使用。

  • All:都放进去。

  • None:都不放进去。

  1. order和allow、deny
    order:定义生效次序;写在后面的表示默认法则

定义站点主页面

在搭建lamp中解析php文件需要配置此项。

DirectoryIndex  index.html  index.html.var

定义路径别名

格式:Alias  /URL/  "/PATH/TO/SOMEDIR/"

当我们访问 http://www.example.com/image/1.jpg 这个资源,我们可以这么配置 Alias /image/ "/opt/image/" 那么在访问是就会访问到系统中的/opt/image/1.jpg 的资源。配置时一定要注意 / 一定要前后一致!

设定默认字符集

AddDefaultCharset  UTF-8

日志设定

错误日志

ErrorLog  logs/error_log

日志级别:debug, info, notice, warn, error, crit, alert, emerg.

访问日志

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog  logs/access_log  combined

各选项简要说明,详细说明请见:日志格式

  • %h:客户端IP地址;

  • %l:Remote User, 通常为一个减号(“-”);

  • %u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;

  • %t:服务器收到请求时的时间;

  • %r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;

  • %>s:响应状态码;

  • %b:响应报文的大小,单位是字节;不包括响应报文的http首部;

  • %{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;

  • %{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;

基于用户的访问控制

认证在http中有个认证质询的状态:WWW-Authenticate 其响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;在认证中客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;

基于basic用户名认证配置示例

  1. 定义安全域

<Directory "/opt/image/">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "Please enter the account password"
        AuthUserFile  "/etc/httpd/conf/.htpasswd"
        Require  user  bols
</Directory>

Require valid-user:允许账号文件中的所有用户登录访问。

  1. 提供账号和密码存储

# htpasswd -cm /etc/httpd/conf/.htpasswd bols

选项说明:

  • -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;

  • -m:md5格式加密

  • -s: sha格式加密

  • -D:删除指定用户

  1. 测试

# curl -I http://192.168.0.210/image/15161610a24bc4b0f22393.jpg
HTTP/1.1 401 Authorization Required
Date: Sun, 20 Nov 2016 13:40:09 GMT
Server: Apache/2.2.15 (CentOS)
WWW-Authenticate: Basic realm="Please enter the account password"
Content-Type: text/html; charset=iso-8859-1

# curl -I  --user bols:bols http://192.168.0.210/image/15161610a24bc4b0f22393.jpg 
HTTP/1.1 200 OK
Date: Sun, 20 Nov 2016 13:39:51 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Tue, 15 Nov 2016 08:16:10 GMT
ETag: "2c78-16c1a-5415291a22680"
Accept-Ranges: bytes
Content-Length: 93210
Content-Type: image/jpeg

基于basic用户组认证配置示例

1.定义安全域
<Directory "/opt/image/">
Options None
AllowOverride None
AuthType Basic
AuthName "Please enter the account password"
AuthUserFile "/etc/httpd/conf/.htpasswd"
AuthGroupFile "/etc/httpd/conf/.group"
Require group Japanese

2.创建用户账号和组账号文件

# htpasswd -m .htpasswd longls
# cat .group 
Japanse:longls

3.测试

# curl -I --user bols:bols http://192.168.0.210/image/15161609cbeba0dea26125.jpg
HTTP/1.1 401 Authorization Required
Date: Sun, 20 Nov 2016 13:52:17 GMT
Server: Apache/2.2.15 (CentOS)
WWW-Authenticate: Basic realm="Please enter the account password"
Content-Type: text/html; charset=iso-8859-1

# curl -I --user longls:longls http://192.168.0.210/image/15161609cbeba0dea26125.jpg
HTTP/1.1 200 OK
Date: Sun, 20 Nov 2016 13:52:05 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Tue, 15 Nov 2016 08:16:09 GMT
ETag: "2c79-159f5-541529192e440"
Accept-Ranges: bytes
Content-Length: 88565
Content-Type: image/jpeg

上面的例子中由于bols没有加入到Japanese组所以不能访问资源。

虚拟主机

前面在浏览器测试httpd的配置文件是否生效时,我们是基于IP:端口进行通信的,但是只能当成一个中心主机使用,然而日常中一个物理服务器可以提供多个站点,为避免不必要的浪费在一个httpd配置文件中定义使用多个虚拟主机,同时在使用虚拟主机前先取消中心主机 ,不然虚拟主机无法使用。使用虚拟主机可分为以下三类:

  • 基于不同的IP实现不同的虚拟主机 (需要有等多个IP,公网IP有限不建议使用)

  • 基于不同的port实现不同的虚拟主机(只需一个IP地址就行,但客户端需要手动输入端口,用户体验差不建议使用)

  • 基于不同主机名实现不同的虚拟主机(变化ServerName的值,使用方便符合需求)

注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用‘main‘主机;禁用方法:注释中心主机的DocumentRoot指令即可;

基于主机名的虚拟主机示例

<VirtualHost 192.168.0.210:80>
        ServerName www.a.com
        DocumentRoot "/opt/a.com/htdocs"
</VirtualHost>
<VirtualHost 192.168.0.211:80>
        ServerName www.b.org
        DocumentRoot "/opt/b.org/htdocs"
</VirtualHost>

上面只是简单的配置基于主机名的访问,请注意在配置后在测试系统的host 文件写好IP 地址和主机名的解析。

status页面

将status 页面所需要的模块开启:

LoadModule  status_module  modules/mod_status.so

下面在进行配置:

<Location /server-status>
        SetHandler server-status
        Order allow,deny
        Allow from 192.168.0
</Location>

测试:
下面在浏览器输入 http://IP/server-status 就可以查看这台机器的httpd服务的状态了,注意实际使用中请做好权限,不要让外网能够访问到此页面!

user/group

指定以哪个用户的身份运行httpd服务进程;

User apache
Group apache

mod_deflate模块

实际使用中我们为了节约带宽可以用mod_deflate模块压缩页面优化传输速度,以下是适用场景:

  • 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持。

  • 压缩适于压缩的资源,例如文件文件。
    配置:

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 \bMSI[E]  !no-gzip !gzip-only-text/html

在浏览器进程刷新页面测试:

Accept-Ranges:bytes
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:13221
Content-Type:text/html; charset=UTF-8
Date:Sun, 20 Nov 2016 15:13:10 GMT
ETag:"2c7a-494c6-541bce34dc6a3"
Keep-Alive:timeout=30, max=99
Last-Modified:Sun, 20 Nov 2016 15:06:46 GMT
Server:Apache/2.2.15 (CentOS)
Vary:Accept-Encoding

https 访问设置

简介

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

作用

主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询 。

SSL会话的简化过程

  1. 客户端发送可供选择的加密方式,并向服务器请求证书;

  2. 服务器端发送证书以及选定的加密方式给客户端;

  3. 客户端取得证书并进行证书验正:
    如果信任给其发证书的CA:
    a. 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
    b. 验正证书的内容的合法性:完整性验正
    c. 检查证书的有效期限;
    d. 检查证书是否被吊销;
    e. 证书中拥有者的名字,与访问的目标主机要一致;

  4. 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;

  5. 服务用此密钥加密用户请求的资源,响应给客户端;

配置httpd支持https

1.为服务器申请数字证书

[root@example.com ~]# cd /etc/pki/CA
[root@example.com CA]# (umask 077; openssl genrsa 2048 > private/cakey.pem)
Generating RSA private key, 2048 bit long modulus
............................................................+++
...........+++
e is 65537 (0x10001)
[root@example.com ~]# vim /etc/pki/tls/openssl.cnf
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = CN   
countryName_min                 = 2
stateOrProvinceName             = State or Province Name (full name)
#stateOrProvinceName_default    = Default Province
stateOrProvinceName_default     = Henan

localityName                    = Locality Name (eg, city)
localityName_default    = Xinyang

0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Companyname

# we can do this but it is not needed normally :-)
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = World Wide Web Pty Ltd

organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
organizationalUnitName_default  = Linuxer
[root@example.com CA]# openssl req -new -x509 -key private/cakey.pem -days 3655 -out cacert.pem
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) [CN]:
State or Province Name (full name) [Henan]:
Locality Name (eg, city) [Xinyang]:
Organization Name (eg, company) [Companyname]:
Organizational Unit Name (eg, section) [Linuxer]:
Common Name (eg, your name or your server‘s hostname) []:ca.example.com
Email Address []:caadmin@example.com
[root@example.com CA]# touch index.txt serial crlnumber 
[root@example.com CA]# echo 01 > serial 
[root@example.com ~]# cd /etc/httpd/conf
[root@example.com conf]# mkdir ssl
[root@example.com conf]# cd ssl/
[root@example.com ssl]# (umask 077 ;openssl genrsa 2048 > httpd.key)
Generating RSA private key, 2048 bit long modulus
.................................+++
..............+++
e is 65537 (0x10001)
[root@example.com ssl]# openssl req -new -key httpd.key -out httpd.csr
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) [CN]:
State or Province Name (full name) [Henan]:
Locality Name (eg, city) [Xinyang]:
Organization Name (eg, company) [Companyname]:
Organizational Unit Name (eg, section) [Linuxer]:
Common Name (eg, your name or your server‘s hostname) []:www.example.com
Email Address []:webadmin@example.com

Please enter the following ‘extra‘ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@example.com ssl]# openssl ca -in httpd.csr -out httpd.crt
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: Aug  3 07:41:04 2015 GMT
            Not After : Aug  2 07:41:04 2016 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Henan
            organizationName          = Companyname
            organizationalUnitName    = Linuxer
            commonName                = www.example.com
            emailAddress              = webadmin@example.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                D7:C1:F8:CB:97:DE:B0:A3:EB:C0:1B:82:B5:5B:10:A0:CB:A1:5B:6D
            X509v3 Authority Key Identifier: 
                keyid:C4:67:DE:CF:AD:0B:94:03:C0:ED:5D:86:90:DE:36:B4:AE:DF:B1:2F

Certificate is to be certified until Aug  2 07:41:04 2016 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
[root@example.com ssl]# ll
总用量 16
-rw-r--r-- 1 root root 4659 8月   3 15:41 httpd.crt
-rw-r--r-- 1 root root 1070 8月   3 15:38 httpd.csr
-rw------- 1 root root 1675 8月   3 15:36 httpd.key

2.安装mod_ssl模块及SSL配置文件

[root@example.com ~]# yum install -y mod_ssl
[root@example.com ~]# vim /etc/httpd/conf.d/ssl.conf 
DocumentRoot "/var/www/html"       //取消注释
ServerName www.example.com:443    //取消注释    

SSLCertificateFile /etc/httpd/conf/ssl/httpd.crt     //更改为服务器证书路径
SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key   //更改为服务器证书路径
[root@example.com ~]# cat /var/www/html/index.html
<h1>/var/www/html/:www.example.com</h1>

3.重启httpd服务

[root@example.com ~]# service httpd restart
[root@example.com ~]# ss -tunl |grep -E "80|443"
tcp    LISTEN     0      128                   :::443                  :::*     
tcp    LISTEN     0      128                   :::80                   :::* 

4.浏览器导入证书并测试
将linux系统的/etc/pki/CA/cacert.pem文件导入到windows系统中,并将cacert.pem文件名改为cacert.crt,在windows系统中点击此文件按提示将其安装到windows系统的受信任的根证书颁发机构中。

基于命令行进行测试:
[root@example.com ~]# vim /etc/hosts  //添加解析地址
192.168.1.8 www.example.com
[root@example.com ~]# openssl s_client -connect www.example.com:443 -CAfile /etc/pki/CA/cacert.pem 
***************************************
---
GET /index.html http/1.1
Host: www.example.com

HTTP/1.1 200 OK
Date: Mon, 03 Aug 2015 08:31:50 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Mon, 03 Aug 2015 07:49:31 GMT
ETag: "22f94-28-51c6368f30e15"
Accept-Ranges: bytes
Content-Length: 40
Connection: close
Content-Type: text/html; charset=UTF-8

<h1>/var/www/html/:www.example.com</h1>
closed

日志切割工具rotatelogs

语法

rotatelogs [ -l ] logfile [ rotationtime [ offset ]] | [ filesizeM ]

选项

  • -l :使用本地时间代替GMT时间作为时间基准。注意:在一个改变GMT偏移量(比如夏令时)的环境中使用-l会导致不可预料的结果。

  • logfile :它加上基准名就是日志文件名。如果logfile中包含"%",则它会被视为用于strftime()的格式字符串;否则它会被自动加上以秒为单位的".nnnnnnnnnn"后缀。这两种格式都表示新的日志开始使用的时间。

  • rotationtime :日志文件滚动的以秒为单位的间隔时间。

  • offset :相对于UTC的时差的分钟数。如果省略,则假定为"0"并使用UTC时间。比如,要指定UTC时差为"-5小时"的地区的当地时间,则此参数应为"-300"。 在中国的服务器一般都是在东八区,所以在配置的时候会设置成480,这个需要注意。

  • filesizeM :指定以filesizeM文件大小滚动,而不是按照时间或时差滚动。

举例

rotatelogs是一个配合Apache管道日志功能使用的简单程序。举例:

CustomLog "|bin/rotatelogs /var/logs/logfile 86400" common 

此配置会建立文件"/var/logs/logfile.nnnn",其中的nnnn是名义上的日志启动时的系统时间(此时间总是滚动时间的倍数,可以用于cron脚本的同步)。在滚动时间到达时(在此例中是24小时以后),会产生一个新的日志。

 CustomLog "|bin/rotatelogs /var/logs/logfile 5M" common

此配置会在日志文件大小增长到5兆字节时滚动该日志。

ErrorLog "|bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M"

此配置会在错误日志大小增长到5兆字节时滚动该日志,日志文件名后缀会按照如下格式创建:errorlog.YYYY-mm-dd-HH_MM_SS 。

CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d%H.log 86400" combined
ErrorLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_%Y%m%d%H.log 86400"

按天轮询:使用绝对路径

CustomLog "|/usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_%Y%m%d%H.log 3600" combined

按小时轮询

ApacheBench命令

ab命令会创建很多的并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,既可以用来测试Apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。
ab命令对发出负载的计算机要求很低,既不会占用很高CPU,也不会占用很多内存,但却会给目标服务器造成巨大的负载,其原理类似CC攻击。自己测试使用也须注意,否则一次上太多的负载,可能造成目标服务器因资源耗完,严重时甚至导致死机。

命令参数:

  • -A:指定连接服务器的基本的认证凭据;

  • -c:指定一次向服务器发出请求数;

  • -C:添加cookie;

  • -g:将测试结果输出为“gnuolot”文件;

  • -h:显示帮助信息;

  • -H:为请求追加一个额外的头;

  • -i:使用“head”请求方式;

  • -k:激活HTTP中的“keepAlive”特性;

  • -n:指定测试会话使用的请求数;

  • -p:指定包含数据的文件;

  • -q:不显示进度百分比;

  • -T:使用POST数据时,设置内容类型头;

  • -v:设置详细模式等级;

  • -w:以HTML表格方式打印结果;

  • -x:以表格方式输出时,设置表格的属性;

  • -X:使用指定的代理服务器发送请求;

  • -y:以表格方式输出时,设置表格属性。

使用举例:

参数很多,一般我们用 -c 和 -n 参数就可以了。例如:

[root@node2 bin]# ./ab -n 4000 -c 1000 http://localhost/index.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 400 requests
Completed 800 requests
Completed 1200 requests
Completed 1600 requests
Completed 2000 requests
Completed 2400 requests
Completed 2800 requests
Completed 3200 requests
Completed 3600 requests
Completed 4000 requests
Finished 4000 requests


Server Software:        Apache/2.2.31
Server Hostname:        localhost
Server Port:            80

Document Path:          /index.html
#测试的页面
Document Length:        44 bytes
#页面大小

Concurrency Level:      1000
#测试的并发数
Time taken for tests:   1.551 seconds
#整个测试持续的时间
Complete requests:      4000
#完成的请求数量
Failed requests:        0
#失败的请求数量
Write errors:           0
Total transferred:      1201500 bytes
#整个过程中的网络传输量
HTML transferred:       176220 bytes
#整个过程中的HTML内容传输量
Requests per second:    2578.29 [#/sec] (mean)
#最重要的指标之一,相当于LR中的每秒事务数,后面括号中的mean表示这是一个平均值
Time per request:       387.853 [ms] (mean)
#最重要的指标之二,相当于LR中的平均事务响应时间,后面括号中的mean表示这是一个平均值
Time per request:       0.388 [ms] (mean, across all concurrent requests)
#每个连接请求实际运行时间的平均值
Transfer rate:          756.30 [Kbytes/sec] received
#平均每秒网络上的流量,可以帮助排除是否存在网络流量过大导致响应时间延长的问题

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   50 205.7      1    1004
Processing:     0   57 185.5     26    1426
Waiting:        0   56 185.6     25    1426
Total:         20  107 290.3     26    1547
#网络上消耗的时间的分解,各项数据的具体算法还不是很清楚

Percentage of the requests served within a certain time (ms)
  50%     26
  66%     28
  75%     29
  80%     30
  90%    110
  95%   1094
  98%   1103
  99%   1541
 100%   1547 (longest request)

整个场景中所有请求的响应情况。在场景中每个请求都有一个响应时间,其中50%的用户响应时间小于26毫秒,66%的用户响应时间小于28毫秒,最大的响应时间小于1547毫秒。对于并发请求,cpu实际上并不是同时处理的,而是按照每个请求获得的时间片逐个轮转处理的,所以基本上第一个Time per request时间约等于第二个Time per request时间乘以并发请求数。
说明:-n后面的4000代表总共发出4000个请求;-c后面的1000表示采用1000个并发(模拟1000个人同时访问),后面的网址表示测试的目标URL。

httpd 命令

httpd为Apache HTTP服务器程序。直接执行程序可启动服务器的服务。httpd是Apache超文本传输协议(HTTP)服务器的主程序,它被设计为一个独立运行的后台进程,会建立一个处理请求的子进程或纯种的池。通常,httpd不应该被直接调用,而应该由apachectl调用。

参数

  • -d serverroot :将ServerRoot指令设置初始值为serverroot。它可以被配置文件中的ServerRoot指令所覆盖。其默认值是/usr/local/apache2 。

  • -f config:在启动中使用config作为配置文件。如果config不以"/"开头,则它是相对于ServerRoot的路径。其默认值是conf/httpd.conf 。

  • -k start|restart|graceful|stop|graceful-stop:发送信号使httpd启动、重新启动或停止。更多信息请参见停止Apache 。

  • -C directive:在读取配置文件之前,先处理directive的配置指令。

  • -c directive:在读取配置文件之后,再处理directive的配置指令。

  • -D parameter:设置参数parameter ,它配合配置文件中的<IfDefine>段,用于在服务器启动和重新启动时,有条件地跳过或处理某些命令。

  • -e level:在服务器启动时,设置LogLevel为level 。它用于在启动时,临时增加出错信息的详细程度,以帮助排错。

  • -E file:将服务器启动过程中的出错信息发送到文件file 。

  • -R directory:当在服务器编译中使用了SHARED_CORE规则时,它指定共享目标文件的目录为directory 。

  • -h:输出一个可用的命令行选项的简要说明。

  • -l:输出一个静态编译在服务器中的模块的列表。它不会列出使用LoadModule指令动态加载的模块。

  • -L:输出一个指令的列表,并包含了各指令的有效参数和使用区域。

  • -M:输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块。

  • -S:显示从配置文件中读取并解析的设置结果(目前仅显示虚拟主机的设置)

  • -t:仅对配置文件执行语法检查。程序在语法解析检查结束后立即退出,或者返回"0"(OK),或者返回非0的值(Error)。如果还指定了"-DDUMP_VHOSTS",则会显示虚拟主机配置的详细信息。

  • -v:显示httpd的版本,然后退出。

  • -V:显示httpd和APR/APR-Util的版本和编译参数,然后退出。

  • -X:以调试模式运行httpd 。仅启动一个工作进程,并且服务器不与控制台脱离。

htpasswd命令

htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。

选项

  • -c:创建一个加密文件;

  • -n:不更新加密文件,只将加密后的用户名密码显示在屏幕上;

  • -m:默认采用MD5算法对密码进行加密;

  • -d:采用CRYPT算法对密码进行加密;

  • -p:不对密码进行进行加密,即明文密码;

  • -s:采用SHA算法对密码进行加密;

  • -b:在命令行中一并输入用户名和密码而不是根据提示输入密码;

  • -D:删除指定的用户。

httpd-2.4

新特性

(1) MPM支持运行为DSO机制;以模块形式按需加载;
(2) event MPM生产环境可用;
(3) 异步读写机制;
(4) 支持每模块及每目录的单独日志级别定义;
(5) 每请求相关的专用配置;
(6) 增强版的表达式分析式;
(7) 毫秒级持久连接时长定义;
(8) 基于FQDN的虚拟主机也不再需要NameVirutalHost指令;
(9) 新指令,AllowOverrideList;
(10) 支持用户自定义变量;
(11) 更低的内存消耗;

新模块

(1) mod_proxy_fcgi
(2) mod_proxy_scgi
(3) mod_remoteip

访问控制配置

在使用httpd-2.4时需要注意的目录下的页面只有显式授权才能被访问,以下列出访问控制相关的配置:
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny

控制特定的IP访问

Require ip IPADDR:授权指定来源的IP访问;
Require not ip IPADDR:拒绝

控制特定的主机访问

Require host HOSTNAME:授权指定来源的主机访问;
Require not host HOSTNAME:拒绝

虚拟主机配置

<VirtualHost *:80>
    ServerName www.b.net
    DocumentRoot "/apps/b.net/htdocs"
    <Directory "/apps/b.net/htdocs">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

httpd配置.md