HTTPD的常用配置

  • HTTPD 的主配置文件
    • HTTPD 的配置文件
    • HTTPD 主配置文件`etc/httpd/conf/httpd.conf`
    • HTTPD 主配置文件的常用参数
  • HTTPD 常用配置
    • 1、修改监听的IP和PORT
      • 语法格式
      • 注意事项
    • 2、持久连接
      • 语法格式
      • 示例
    • 3、MPM
      • CentOS 6 更换 MPM(HTTP/2.2)
      • CentOS 7 更换 MPM(HTTP/2.4)
      • 不需要的模块如何卸载
      • MPM 配置
    • 4、DSO: Dynamic Shared Object
    • 5、定义'Main' server的文档页面路径
      • 语法格式
      • 示例
      • 文档路径映射
      • `DoucmentRoot`更改示例
    • 6、站点访问控制常见机制
      • 文件系统路径 机制
      • URL 路径机制
      • “基于源地址”实现访问控制
        • HTTP/2.2
        • HTTP/2.4
          • 完整示例
      • 控制页面资源允许所有来源的主机可访问
        • HTTP/2.2
        • HTTP/2.4
      • 控制页面资源拒绝所有来源的主机可访问
        • HTTP/2.2
        • HTTP/2.4
      • OPTIONS
        • Indexes 示例
        • FollowSymLinks 示例
    • 7、定义站点主页面
    • 8、定义路径别名
      • 示例
    • 9、设定默认字符集
    • 10、日志设定
      • 日志存放位置
      • 错误日志
      • 访问日志
      • 宏说明
    • 11、基于用户的访问控制
      • basic认证配置示例
        • 基于组账号进行认证
      • basic认证配置示例(单个用户)
      • basic认证配置示例(组用户)
    • 12、虚拟主机
      • 虚拟主机的配置方法
      • 基于IP的虚拟主机示例
      • 基于端口的虚拟主机
      • 基于FQDN的虚拟主机
    • 13、status页面
      • 示例:
    • 14、ServerSignature On | Off | EMail
    • 15、实现用户家目录的http共享
    • 16、远程客户端和用户验证的控制
    • 17、curl 命令
      • 语法格式
    • 18、elinks 命令
    • 19、user/group
    • 20、使用 mod_deflate 模块压缩页面优化传输速度
    • 21、https(http over ssl)
      • SSL会话的简化过程(ssl 的 handshake)
      • 配置 httpd 支持 https
    • 22、httpd自带的工具程序
    • 23、httpd的压力测试工具
      • 常用的压力测试工具
      • ab 语法格式
      • 10000个连接请求和并发数10/100/500的运行情况
        • 运行结果分析

HTTPD 的主配置文件

HTTPD 的配置文件

服务目录      # /etc/httpd
主配置文件    # /etc/httpd/conf/httpd.conf
网站数据目录   # /var/www/html
访问日志      # /var/log/httpd/access_log
错误日志         # /var/log/httpd/error_log

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

在httpd服务程序的主配置文件中,存在三种类型的信息:注释行信息、全局配置、区域配置。

/etc/httpd/conf/httpd.conf:# Section 1: Global Environment# Section 2: 'Main' server configuration# Section 3: Virtual Hosts配置格式:directive  valuedirective         # 不区分字符大小写;value             # 为路径时,是否区分字符大小写,取决于文件系统;

HTTPD 主配置文件的常用参数

全局配置参数就是一种全局性的配置参数,可作用于对所有的子站点,既保证了子站点的正常访问,也有效减少了频繁写入重复参数的工作量。区域配置参数则是单独针对于每个独立的子站点进行设置的。

最常用参数 用途描述
ServerRoot 服务目录
ServerAdmin 管理员邮箱
User 运行服务的用户
Group 运行服务的用户组
ServerName 网站服务器的域名
DocumentRoot 网站数据目录
Listen 监听的IP地址与端口号
DirectoryIndex 默认的索引页页面
ErrorLog 错误日志文件
CustomLog 访问日志文件
Timeout 网页超时时间,默认为300秒

DocumentRoot参数用于定义网站数据的保存路径,其参数的默认值是把网站数据存放到/var/www/html目录中;而当前网站普遍的首页面名称是index.html,因此可以向/var/www/html目录中写入一个文件,替换掉httpd服务程序的默认首页面,该操作会立即生效。

HTTPD 常用配置

1、修改监听的IP和PORT

语法格式

Listen  [IP:]PORT    # IP 可省略

注意事项

(1) 省略IP表示为0.0.0.0(2) Listen指令可重复出现多次Listen  80Listen  8080(3) 修改监听socket,重启服务进程方可生效

2、持久连接

Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接。

  • 断开条件:

    数量限制:访问数量达到一定数量后,会断开连接
    时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
    
  • 副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应

  • 折衷:使用较短的持久连接时长,以及较少的请求数量

语法格式

KeepAlive  On|Off
KeepAliveTimeout  15
MaxKeepAliveRequests  100
注意:httpd-2.4的KeepAliveTimeout可是毫秒级KeepAliveTimeout num[ms]

示例

telnet  WEB_SERVER_IP  PORT
GET  /URL  HTTP/1.1
Host: WEB_SERVER_IP
[root@Tang ~]# telnet 192.168.1.10 80
Trying 192.168.1.10...
Connected to 192.168.1.10.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host:192.168.1.10HTTP/1.1 200 OK
Date: Sun, 04 Aug 2019 01:26:20 GMT
Server: Apache/2.4.6 (CentOS)
Last-Modified: Sat, 03 Aug 2019 16:05:26 GMT
ETag: "b-58f38a4a04249"
Accept-Ranges: bytes
Content-Length: 11
Content-Type: text/html; charset=UTF-8Tang & NeoConnection closed by foreign host.

3、MPM

httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不同的MPM机制的支持;确认现在使用的是哪下程序文件的方法:ps aux | grep httpd

默认使用的为/usr/sbin/httpd,其为prefork的MPM模块。查看httpd程序的模块列表:

```
查看静态编译的模块:# httpd  -l
查看静态编译及动态编译的模块:# httpd  -M
```

CentOS 6 更换 MPM(HTTP/2.2)

更换使用httpd程序,以支持其它MPM机制。

/etc/sysconfig/httpd:HTTPD=/usr/sbin/httpd.{worker,event}
[root@LeeMumu ~]# ps -aux | grep httpd
root       2935  0.1  0.3 186180  3992 ?        Ss   09:39   0:00 /usr/sbin/httpd
apache     2938  0.0  0.2 186180  2548 ?        S    09:39   0:00 /usr/sbin/httpd
apache     2939  0.0  0.2 186180  2524 ?        S    09:39   0:00 /usr/sbin/httpd
apache     2940  0.0  0.2 186180  2524 ?        S    09:39   0:00 /usr/sbin/httpd
apache     2941  0.0  0.2 186180  2524 ?        S    09:39   0:00 /usr/sbin/httpd
apache     2942  0.0  0.2 186180  2524 ?        S    09:39   0:00 /usr/sbin/httpd
apache     2943  0.0  0.2 186180  2524 ?        S    09:39   0:00 /usr/sbin/httpd
apache     2944  0.0  0.2 186180  2524 ?        S    09:39   0:00 /usr/sbin/httpd
apache     2945  0.0  0.2 186180  2524 ?        S    09:39   0:00 /usr/sbin/httpd
root       2951  0.0  0.0 103320   900 pts/1    S+   09:39   0:00 grep httpd
[root@LeeMumu ~]# vi /usr/sbin/httpd
HTTPD=/usr/sbin/httpd.worker
[root@LeeMumu ~]# service httpd restart
[root@LeeMumu ~]# ps -aux | grep httpd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root       2989  0.0  0.4 186388  4136 ?        Ss   09:40   0:00 /usr/sbin/httpd.worker
apache     2993  0.0  0.5 530648  5452 ?        Sl   09:40   0:00 /usr/sbin/httpd.worker
apache     2994  0.0  0.5 530648  5424 ?        Sl   09:40   0:00 /usr/sbin/httpd.worker
apache     2995  0.0  0.5 530648  5428 ?        Sl   09:40   0:00 /usr/sbin/httpd.worker
root       3105  0.0  0.0 103320   896 pts/1    S+   09:40   0:00 grep httpd
[root@LeeMumu ~]# vim /etc/sysconfig/httpd
#HTTPD=/usr/sbin/httpd.worker
[root@LeeMumu ~]# service httpd restart
[root@LeeMumu ~]# ps -aux | grep httpd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root       3140  0.0  0.3 186180  3948 ?        Ss   09:42   0:00 /usr/sbin/httpd
apache     3143  0.0  0.2 186180  2528 ?        S    09:42   0:00 /usr/sbin/httpd
apache     3144  0.0  0.2 186180  2552 ?        S    09:42   0:00 /usr/sbin/httpd
apache     3145  0.0  0.2 186180  2528 ?        S    09:42   0:00 /usr/sbin/httpd
apache     3146  0.0  0.2 186180  2528 ?        S    09:42   0:00 /usr/sbin/httpd
apache     3147  0.0  0.2 186180  2528 ?        S    09:42   0:00 /usr/sbin/httpd
apache     3148  0.0  0.2 186180  2528 ?        S    09:42   0:00 /usr/sbin/httpd
apache     3149  0.0  0.2 186180  2528 ?        S    09:42   0:00 /usr/sbin/httpd
apache     3150  0.0  0.2 186180  2528 ?        S    09:42   0:00 /usr/sbin/httpd
root       3152  0.0  0.0 103320   900 pts/1    S+   09:42   0:00 grep httpd

CentOS 7 更换 MPM(HTTP/2.4)

切换使用的MPM,编辑此文件即可:/etc/httpd/conf.modules.d/00-mpm.conf
启用要启用的MPM相关的LoadModule指令即可。

[root@Neo ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
[root@Neo ~]# ps -aux | grep httpd
root       8173  0.0  0.5 230480  5188 ?        Ss   21:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8174  0.0  0.3 230480  3264 ?        S    21:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8175  0.0  0.3 230480  3264 ?        S    21:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8176  0.0  0.3 230480  3264 ?        S    21:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8177  0.0  0.3 230480  3024 ?        S    21:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8178  0.0  0.3 230480  3744 ?        S    21:23   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8179  0.0  0.3 230480  3024 ?        S    21:24   0:00 /usr/sbin/httpd -DFOREGROUND
root       8326  0.0  0.0 112708   972 pts/0    S+   22:06   0:00 grep --color=auto httpd
[root@Neo ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_worker_module modules/mod_mpm_worker.so
[root@Neo ~]# ps -aux | grep httpd
root       8537  1.5  0.5 230684  5392 ?        Ss   22:07   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8538  0.0  0.3 230432  3008 ?        S    22:07   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8539  0.0  0.5 517512  5552 ?        Sl   22:07   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8540  0.0  0.5 517512  5552 ?        Sl   22:07   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8541  0.0  0.5 517512  5556 ?        Sl   22:07   0:00 /usr/sbin/httpd -DFOREGROUND
root       8624  0.0  0.0 112708   976 pts/0    S+   22:07   0:00 grep --color=auto httpd
[root@Neo ~]# httpd -M | grep mpm                     # 查看当前系统加载的MPM模块mpm_worker_module (shared)[root@Neo ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_event_module modules/mod_mpm_event.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
[root@Neo ~]# httpd -M | grep mpmmpm_prefork_module (shared)
[root@Neo ~]# ps -aux | grep httpd
root       8641  0.2  0.5 230480  5192 ?        Ss   22:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8642  0.0  0.3 230480  3024 ?        S    22:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8643  0.0  0.3 230480  3024 ?        S    22:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8644  0.0  0.3 230480  3024 ?        S    22:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8645  0.0  0.3 230480  3024 ?        S    22:09   0:00 /usr/sbin/httpd -DFOREGROUND
apache     8646  0.0  0.3 230480  3024 ?        S    22:09   0:00 /usr/sbin/httpd -DFOREGROUND
root       8650  0.0  0.0 112708   976 pts/0    S+   22:09   0:00 grep --color=auto httpd

不需要的模块如何卸载

如果不需要某些模块,可在模块的配置文件中进行注释即可。

如下,显示所有的模块配置文件:

[root@Neo ~]# ls /etc/httpd/conf.modules.d/
00-base.conf  00-dav.conf  00-lua.conf  00-mpm.conf  00-proxy.conf  00-systemd.conf  01-cgi.conf

如果不需要proxy_wstunnel_module (shared)这个模块,可找相应的模块配置文件00-proxy.conf进行相应模块的注释即可。

[root@Neo ~]# httpd -Mproxy_wstunnel_module (shared)[root@Neo ~]# vi /etc/httpd/conf.modules.d/00-proxy.conf # This file configures all the proxy modules:
LoadModule proxy_module modules/mod_proxy.so
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
... ...
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so

MPM 配置

  • prefork的配置 (使用最多,nigix 使用 event 模型)
<IfModule prefork.c>
StartServers       8      # 启动的进程数量
MinSpareServers    5      # 最小空闲进程数
MaxSpareServers   20      # 最大空闲进程数(应大于等于 Startservers)
ServerLimit      256      # 服务器
MaxClients       256      # 最大的客户连接数量
MaxRequestsPerChild  4000 # 每个子进程处理的最大请求数(超过这个数后,会自动杀死子进程;0 代表处理请求无限制)
</IfModule>
  • worker的配置:
<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25    # 每个子进程启用多少线程
MaxRequestsPerChild  0
</IfModule>

4、DSO: Dynamic Shared Object

  • httpd -M 所有显示为 shared 的模块,都能被卸载
  • 关于模块的配置文件 /etc/httpd/conf.modules.d/*
  • 要实现对动态模块的卸载,可到相应的配置文件中去注释掉即可,然后重启服务
  • 模块的存在配置/etc/httpd/modules/
  • 配置指定实现模块加载LoadModule <mod_name> <mod_path>
  • 模块文件路径可使用相对路径相对于ServerRoot(默认/etc/httpd),注意和文档根DoucmentRoot进行区别
[root@Neo ~]# ls /etc/httpd/modules | grep mpm
mod_mpm_event.so
mod_mpm_prefork.so
mod_mpm_worker.so
# LoadModule auth_basic_module modules/mod_auth_basic.so

5、定义’Main’ server的文档页面路径

  • 定义中心服务器:httpd程序在重启时 或者语法检查时,会对本机地址进行反解,如果反解失败,重启服务时,会报错。

    可在 /etc/hosts 添加解析 但要保持和 本机的hostname 一致
    也可以在配置文件进行修改,把 ServerName 命名为一个主机名
    

语法格式

ServerName 语法格式: ServerName [scheme://]fully-qualified-domain-name[:port]
DocumentRoot  ""

示例

[root@Neo ~]# httpd -t           # 反解报错
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 192.168.1.10. Set the 'ServerName' directive globally to suppress this message
Syntax OK
[root@Neo ~]# vi /etc/httpd/conf/httpd.conf
ServerName 192.168.1.10
[root@Neo ~]# httpd -t           # 报错消失
Syntax OK

文档路径映射

DoucmentRoot指向的路径为URL路径的起始位置,其相当于站点URL的根路径。
主要和 ServerRoot 进行区分。

URL PATH与FileSystem PATH不是等同的,而是存在一种映射关系URL PATH 中的 / 对等于 FileSystem /var/www/html/URL /  --> FileSystem /var/www/html/
/images/logo.jpg --> /var/www/html/images/logo.jpg

DoucmentRoot更改示例

我们把DoucmentRoot由默认的/var/www/html修改为/data/web/www

  • 第一步:创建目录。
[root@Neo ~]# mkdir /data/web/www -pv
mkdir: created directory ‘/data’
mkdir: created directory ‘/data/web’
mkdir: created directory ‘/data/web/www’
  • 第二步:创建个主页文件,便于演示。
[root@Neo ~]# vim /data/web/www/index.html
[root@Neo ~]# cat /data/web/www/index.html
Tang & Neo
2019-08
  • 第三步:修改文档根目录。
[root@Neo ~]# vim /etc/httpd/conf/httpd.conf
#DocumentRoot "/var/www/html"
DocumentRoot "/data/web/www"
  • 第四步:检查语法错误,并重启服务。
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第五步:进行网页访问,发现访问的是欢迎页面。说明更换的文档根没有生效,因为我们是创建了首页的。

  • 第六步:把更改的根,在主配置文件进行授权,使用容器块进行授权。不然无法访问(HTTP/2.2 不需要授权)
<Directory  "/data/web/www">AllowOverride NoneRequire all granted
</Directory>
  • 第七步:检查语法。并重启服务,然后再次进行访问,访问成功。
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service

6、站点访问控制常见机制

在 HTTP/2.4 中如果添加任何一个目录作为 http 的访问目录,直接访问是会被拒绝的,需要在容器内添加允许访问,即要授权允许访问某些文件,但是HTTP/2.2 不需要授权。

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

文件系统路径 机制

# 基于目录进行授权
<Directory  "">
...
</Directory>
# 基于具体文件进行授权
<File  "">
...
</File>
# 基于正则表达式进行授权
<FileMatch  "PATTERN">
...
</FileMatch>

URL 路径机制

基于具体 URL;
<Location  "">
...
</Location>
基于 URL 使用正则表达式:
<LocationMatch "PATTERN">
...
</LocationMatch>

“基于源地址”实现访问控制

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

HTTP/2.2

order和allow、denyorder:定义生效次序;写在后面的表示默认法则Allow from, Deny from
Allow from 192.168.1.22
Deny from all来源地址:(四种语法格式)
IP
NetAddr:172.16172.16.0.0172.16.0.0/16172.16.0.0/255.255.0.0
示例:允许某一网段访问,又禁止其中一个主机的访问Deny from 172.16.0.200
Allow from 172.16

HTTP/2.4

基于IP控制:Require ip  IP地址或网络地址Require not ip IP地址或网络地址
基于主机名控制:Require host 主机名或域名Require not host 主机名或域名

注意:不管是基于IP控制还是基于主机名控制,是需要放置在<RequireAll>配置块中或<RequireAny>配置块中。

示例:允许某一网段访问,又禁止其中一个主机的访问<RequireAll>Require not ip 172.16.0.200Require ip 172.16
</RequireAll>
完整示例
  • 第一步:没配置访问控制以前,两台主机都能访问web服务器。
[root@Lee ~]# ifconfig | grep "inet addr" | grep 127.0.0.1 -vinet addr:192.168.1.13  Bcast:192.168.1.255  Mask:255.255.255.0
[root@Lee ~]# curl http://192.168.1.10/index.html
Tang & Neo
2019-08
root@Tang ~]# ifconfig | grep "\<inet\>" | grep 127.0.0.1 -vinet 192.168.1.9  netmask 255.255.255.0  broadcast 192.168.1.255
[root@Tang ~]# curl http://192.168.1.10/index.html
Tang & Neo
2019-08
  • 第二步:进行访问控制配置。允许192.168.1.0段的所有主机进行访问,但是拒绝192.168.1.13这台主机进行访问。
DocumentRoot "/data/web/www"<Directory  "/data/web/www">AllowOverride NoneOptions Indexes FollowSymLinks<RequireAll>Require not ip 192.168.1.13       # 拒绝 192.168.1.13 主机进行访问 Require ip 192.168.1              # 允许 192.168.1.0 段的所有主机进行访问</RequireAll>
</Directory>
  • 第三步:进行语法检查,并重启服务。
[root@Neo ~]# ifconfig | grep "\<inet\>" | grep 127.0.0.1 -v | grep 192.168.10.5 -vinet 192.168.1.10  netmask 255.255.255.0  broadcast 192.168.1.255
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第四步:进行验证。
[root@Tang ~]# ifconfig | grep "\<inet\>" | grep 127.0.0.1 -vinet 192.168.1.9  netmask 255.255.255.0  broadcast 192.168.1.255
[root@Tang ~]# curl http://192.168.1.10/index.html   # 192.168.1.9 可以进行访问
Tang & Neo
2019-08
[root@Lee ~]# ifconfig | grep "inet addr" | grep 127.0.0.1 -vinet addr:192.168.1.13  Bcast:192.168.1.255  Mask:255.255.255.0
[root@Lee ~]# curl http://192.168.1.10/index.html   # 192.168.1.13 被拒绝访问
<!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 /index.html
on this server.</p>
</body></html>

控制页面资源允许所有来源的主机可访问

HTTP/2.2

<Directory "">...Order allow,denyAllow from all
</Directory>

HTTP/2.4

<Directory "">...Require all granted
</Directory>

控制页面资源拒绝所有来源的主机可访问

HTTP/2.2

<Directory "">...Order allow,denyDeny from all
</Directory>

HTTP/2.4

<Directory "">...Require all denied
</Directory>

OPTIONS

Options:Configures what features are available in a particular directory

后跟1个或多个以空白字符分隔的“选项”列表;Indexes指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户(做下载站时,可以开启;一般不要开启,否则被暴露网站的文件架构)。

也就是说,在文件系统 httpd 的每个目录下,如果有 index.html (主页),再不输入具体 URL PATH 的情况下,会显示index.html,如果,允许 indexes 的话,就会显示该目录下的所有文件,如果不允许的话,就会显示Forbidden

FollowSymLinks    # 允许跟踪符号链接文件所指向的源文件
None              # 什么功能都不启用
All               # All options except for MultiViews.

Indexes 示例

  • 第一步:在/data/web/www/新建一个目录文件images,并存储图片。此目录并无主页。
[root@Neo ~]# ls /data/web/www/images/
gaoyuanyuan1.jpg  gaoyuanyuan3.jpg  gaoyuanyuan5.jpg  gaoyuanyuan7.jpg  gaoyuanyuan9.jpg
gaoyuanyuan2.jpg  gaoyuanyuan4.jpg  gaoyuanyuan6.jpg  gaoyuanyuan8.jpg
  • 第二步:通过浏览器进行访问,整个目录文件尽收眼底。


  • 第三步:现在进行主页添加。
[root@Neo ~]# ls /data/web/www/images/
gaoyuanyuan1.jpg  gaoyuanyuan3.jpg  gaoyuanyuan5.jpg  gaoyuanyuan7.jpg  gaoyuanyuan9.jpg
gaoyuanyuan2.jpg  gaoyuanyuan4.jpg  gaoyuanyuan6.jpg  gaoyuanyuan8.jpg  index.html
[root@Neo ~]# cat /data/web/www/images/index.html
<h1>GoaYuanYuan</h1>
  • 第四步:通过浏览器进行页面访问,只能访问主页。可与第二步的访问结果进行比较。通过想访问目录下的图片,需要配置具体的 URL 。所以在不知道具体 URL 的情况下,是无法得知目录的具体内容的。所以除了下载页面,尽量不要使用索引功能。


  • 第五步:禁用 Index 功能。
1、删除 images 目录下的主页文件。
[root@Neo ~]# rm -f /data/web/www/images/index.html
[root@Neo ~]# ls /data/web/www/images/
gaoyuanyuan1.jpg  gaoyuanyuan3.jpg  gaoyuanyuan5.jpg  gaoyuanyuan7.jpg  gaoyuanyuan9.jpg
gaoyuanyuan2.jpg  gaoyuanyuan4.jpg  gaoyuanyuan6.jpg  gaoyuanyuan8.jpg
2、编辑主配置文件,把 Option 的 Indexes 进行删除。
DocumentRoot "/data/web/www"<Directory  "/data/web/www">AllowOverride None
#       Options Indexes FollowSymLinksOptions FollowSymLinksRequire all granted
</Directory>
3、进行语法检查,并重启 httpd 服务。
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
4、进行页面访问,查看结果。是禁止访问的。但是通过完整的 URL 还是可以访问具体内容的。
比如:http://192.168.1.10/images/gaoyuanyuan8.jpg


FollowSymLinks 示例

  • 第一步:创建链接文件。
[root@Neo ~]# ln -sv /etc/fstab /data/web/www/fstab.html
‘/data/web/www/fstab.html’ -> ‘/etc/fstab’
[root@Neo ~]# ll /data/web/www/
total 4
lrwxrwxrwx. 1 root root  10 Aug  4 03:03 fstab.html -> /etc/fstab
drwxr-xr-x. 2 root root 222 Aug  4 02:50 images
-rw-r--r--. 1 root root  19 Aug  3 22:45 index.html
[root@Neo ~]# cat /data/web/www/fstab.html #
# /etc/fstab
# Created by anaconda on Wed Jun  5 18:32:09 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/centos-root /                       xfs     defaults        0 0
UUID=f878a11c-10ef-4de4-8a27-b307bf88b220 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
  • 第二步:查看主配置文件是否允许 FollowSymLinks 功能。
DocumentRoot "/data/web/www"<Directory  "/data/web/www">AllowOverride None
#       Options Indexes FollowSymLinksOptions FollowSymLinksRequire all granted
</Directory>
  • 第三步:进行该链接文件的访问。通过访问结果,发现是可以访问。
[root@Tang ~]# curl http://192.168.1.10/fstab.html#
# /etc/fstab
# Created by anaconda on Wed Jun  5 18:32:09 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/centos-root /                       xfs     defaults        0 0
UUID=f878a11c-10ef-4de4-8a27-b307bf88b220 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
  • 第四步:配置主配置文件,禁止 FollowSymLinks 功能。并进行语法检查和重启服务。
[root@Neo ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/web/www"<Directory  "/data/web/www">AllowOverride NoneOptions None                                               # Options 设置为NoneRequire all granted
</Directory>
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第五步:再次进行该链接文件的访问。通过访问结果,发现是禁止访问的。

[root@Tang ~]# curl http://192.168.1.10/fstab.html
<!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 /fstab.html
on this server.</p>
</body></html>

7、定义站点主页面

依次查找 index.html 文件,作为网站的主页面。

DirectoryIndex  index.html  index.html.var

8、定义路径别名

语法格式:

Alias  /URL/  "/PATH/TO/SOMEDIR/"

示例:

DocumentRoot "/www/htdocs"http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm 、
Alias  /download/  "/rpms/pub/"    # 把此条命令配置在/ etc/httpd/conf/httpd.conf 文件中进行web访问时,就相当于访问别名路径下的文件。   http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm /rpms/pub/bash-4.4.2-3.el6.x86_64.rpmAlias  /images/  "/www/htdocs/images"                 http://www.magedu.com/images/logo.png/www/htdocs/images/logo.png

但是要注意,也要对别名的目录进行授权访问。这样的话,才能对别名目录下的内容进行访问。

示例

  • 第一步:创建一个新的文件目录。并 copy 相关图片。
[root@Neo ~]# mkdir -pv /data/neo/tang/
mkdir: created directory ‘/data/neo’
mkdir: created directory ‘/data/neo/tang/’
[root@Neo ~]# cp /data/web/www/images/ /data/neo/tang/
cp: omitting directory ‘/data/web/www/images/’
[root@Neo ~]# cp /data/web/www/images/*.jpg /data/neo/tang/
[root@Neo ~]# ls /data/neo/tang/
gaoyuanyuan1.jpg  gaoyuanyuan3.jpg  gaoyuanyuan5.jpg  gaoyuanyuan7.jpg  gaoyuanyuan9.jpg
gaoyuanyuan2.jpg  gaoyuanyuan4.jpg  gaoyuanyuan6.jpg  gaoyuanyuan8.jpg
  • 第二步:编辑 httpd 主配置文件,定义别名和授权/data/neo/tang/目录。
[root@Neo ~]# vim /etc/httpd/conf/httpd.conf
Alias /neo_images/ "/data/neo/tang/"               # 定义别名<Directory  "/data/neo/tang">                      # 进行授权AllowOverride NoneOptions Indexes FollowSymLinksRequire all granted
</Directory>
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第三步:通过浏览器进行访问,访问http://192.168.1.10/neo_images/ 就相当于访问 /data/neo/tang/目录下的文件。

9、设定默认字符集

AddDefaultCharset  UTF-8

常用的中文字符集:

中文字符集:GBK, GB2312, GB18030

10、日志设定

日志类型分为:访问日志 和 错误日志。

错误日志一般是指程序的错误或者配置方面的错误。如果是访问过程中,被禁止,这样日志会存放在访问日志中。访问失败并不一定都是在错误日志中的。

日志存放位置

/var/log/httpd:access_log    # 访问日志error_log     # 错误日志

错误日志

ErrorLog "logs/error_log"                 # 主配置文件中的配置LogLevel  warn                            # 记录级别Possible values include: debug, info, notice, warn, error, crit, alert, emerg.

访问日志

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined  # combined 是日志格式名称
CustomLog  "logs/access_log"  combined     # 主配置文件中的配置,指明日志存放位置和日志格式(combined)
LogFormat format strings:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

宏说明

%h:客户端IP地址;只记录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”的值;即发出请求的应用程序
# LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
# 上述格式中,有部分 \ 是转义符[root@Neo ~]# cat /var/log/httpd/access_log
192.168.1.199 - - [04/Aug/2019:03:47:55 -0400] "GET /images/ HTTP/1.1" 200 2646 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
192.168.1.199 - - [04/Aug/2019:03:48:06 -0400] "GET /neo_images/ HTTP/1.1" 200 2654 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"

11、基于用户的访问控制

认证质询:

WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码

认证:

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

认证方式有两种:

basic       # 明文
digest      # 消息摘要认证

安全域:

需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因

用户的账号和密码存放于何处?

虚拟账号:仅用于访问某服务时用到的认证标识存储:文本文件SQL数据库ldap目录存储

basic认证配置示例

  • (1) 定义安全域
<Directory "">Options NoneAllowOverride NoneAuthType BasicAuthName "String“AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"Require  user  username1  username2 ...
</Directory>
  • (2) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用,如果存在了就不需要使用,不然会覆盖到以前的数据-m:md5格式加密-s:sha格式加密-D:删除指定用户-b:批模式添加用户(直接给定密码)htpasswd -b  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username password

注意:使用 -c 选项时,需要注意。

基于组账号进行认证

  • (1) 定义安全域
<Directory "">Options NoneAllowOverride NoneAuthType BasicAuthName "String“AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"Require  group  grpname1  grpname2 ...
</Directory>
  • (2)创建用户账号和组账号文件
组文件:每一行定义一个组GRP_NAME: username1  username2  ...

basic认证配置示例(单个用户)

  • 第一步:生成密码文件,用户是neo,采用md5加密。
[root@Neo ~]# htpasswd -c -m /data/passuser neo
New password: neo
Re-type new password:neo
Adding password for user neo
[root@neo data]# cat passuser
neo:$apr1$nokrvTr2$iL0Rx9UV.fwIFhY3XAdmo.
  • 第二步:配置httpd主配置文件,并检查语法,重新启动服务。
[root@Neo ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/web/www"<Directory  "/data/web/www">Options NoneAllowOverride NoneAuthType BasicAuthName "neo"AuthUserFile "/data/passuser"Require user neo                          # 允许用户 neo 进行登陆访问
</Directory>
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第三步:进行验证。通过浏览器进行访问时,如果不输入对应的用户名和密码,是无法访问的。输入正确的用户名和密码可成功访问。



basic认证配置示例(组用户)

组名称 组成员
pets neo tang neotang
lover lee pang guai
  • 第一步:创建组文件和组成员的密码文件。
[root@Neo ~]# htpasswd -m -b /data/passuser tang tang
Adding password for user tang
[root@Neo ~]# htpasswd -m -b /data/passuser neo neo
Adding password for user neo
[root@Neo ~]# htpasswd -m -b /data/passuser neotang neotang
Adding password for user neotang
[root@Neo ~]# htpasswd -m -b /data/passuser lee lee
Adding password for user lee
[root@Neo ~]# htpasswd -m -b /data/passuser guai guai
Updating password for user guai
[root@Neo ~]# htpasswd -m -b /data/passuser pang pang
Adding password for user pang
[root@neo data]# cat passuser
guai:$apr1$4oJGEKF2$rdB4G/6tk94.3E8tO37Xr/
tang:$apr1$cIvKAe45$7oQ0ylHQzawFoF9jRLDoS.
neo:$apr1$GNaXLHrt$0qbJqX9ALXcc8vgtiABvg.
neotang:$apr1$URIFLDJ6$2V4iw.6nYN6SepkEfNCgL0
lee:$apr1$9PdjDquF$1TS5SApSuP9OCc5SQ/R840
pang:$apr1$.S5gLDsG$Lsc4UNkSUQ5XJbf.hgKTG.
[root@neo data]# cat groupuser
pets: neo tang neotang
loves: lee pang guai
  • 第二步:进行主配置文件修改,只允许 pets 组成员进行访问。
[root@Neo ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/web/www"<Directory  "/data/web/www">Options NoneAllowOverride NoneAuthType BasicAuthName "String"AuthUserFile "/data/passuser"AuthGroupFile "/data/groupuser"Require group pets
</Directory>
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第三步:进行验证。不输入用户名和密码的情况下、输入 pets 组成员的用户名和密码、输入 lovers 组成员的用户名和密码。




12、虚拟主机

站点标识: socket

IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同: 请求报文中首部 Host: www.magedu.com

虚拟主机有三种实现方案:

基于ip:为每个虚拟主机准备至少一个ip地址
基于port:为每个虚拟主机使用至少一个独立的port
基于FQDN:为每个虚拟主机使用至少一个FQDN

**注意(专用于httpd-2.2):**一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用’main’主机;禁用方法:注释中心主机的DocumentRoot指令即可。

虚拟主机的配置方法

<VirtualHost  IP:PORT>ServerName FQDNDocumentRoot  ""
</VirtualHost>

其它可用指令:

ServerAlias     # 虚拟主机的别名;可多次使用
ErrorLog        # 单独指定错误日志的存放位置
CustomLog       # 单独指定访问日志的存放位置
<Directory "">
..
</Directory>
Alias
...

基于IP的虚拟主机示例

<VirtualHost 172.16.100.6:80>ServerName www.a.comDocumentRoot "/www/a.com/htdocs"
</VirtualHost><VirtualHost 172.16.100.7:80>ServerName www.b.netDocumentRoot "/www/b.net/htdocs"
</VirtualHost><VirtualHost 172.16.100.8:80>ServerName www.c.orgDocumentRoot "/www/c.org/htdocs"
</VirtualHost>

基于端口的虚拟主机

<VirtualHost 172.16.100.6:80>ServerName www.a.comDocumentRoot "/www/a.com/htdocs"
</VirtualHost><VirtualHost 172.16.100.6:808>ServerName www.b.netDocumentRoot "/www/b.net/htdocs"
</VirtualHost><VirtualHost 172.16.100.6:8080>ServerName www.c.orgDocumentRoot "/www/c.org/htdocs"
</VirtualHost>

基于FQDN的虚拟主机

<VirtualHost 172.16.100.6:80>ServerName www.a.comDocumentRoot "/www/a.com/htdocs"
</VirtualHost><VirtualHost 172.16.100.6:80>ServerName www.b.netDocumentRoot "/www/b.net/htdocs"
</VirtualHost><VirtualHost 172.16.100.6:80>ServerName www.c.orgDocumentRoot "/www/c.org/htdocs"
</VirtualHost>

13、status页面

尽量不要全部开放,只开放部分地址。
加载模块:

LoadModule  status_module  modules/mod_status.so

httpd/2.2:

<Location /server-status>SetHandler server-statusOrder allow,denyAllow from 172.16
</Location>

httpd/2.4:

<Location /server-status>SetHandler server-status<RequireAll>Require ip 172.16</RequireAll>
</Location>

示例:

  • 第一步:配置主配置文件,并允许 192.168.1.0 段的地址访问 httpd 的状态页。
[root@Neo ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/web/www"<Directory  "/data/web/www">Options NoneAllowOverride NoneRequire all granted
</Directory>
<Location /server-status>SetHandler server-status<RequireAll>Require ip 192.168.1</RequireAll>
</Location>
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第二步:进行验证,输入http://192.168.1.10/server-status,查看服务器 httpd 的运行状态。

14、ServerSignature On | Off | EMail

  • 当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息
  • 如果不对外显示这些信息,就可以将这个参数设置为Off
  • 设置为Email,将显示ServerAdmin 的Email提示

15、实现用户家目录的http共享

  • 基于模块mod_userdir.so实现

  • SELinux: http_enable_homedirs

  • 相关配置:

    vim /etc/httpd/conf/httpd.conf
    <IfModule mod_userdir.c>
    #UserDir disabled
    UserDir public_html #指定共享目录的名称
    </IfModule>准备目录
    su – wang;mkdir ~/public_html
    setfacl –m u:apache:x ~wang访问
    http://localhost/~wang/index.html
    

16、远程客户端和用户验证的控制

Satisfy ALL|AnyALL 客户机IP和用户验证都需要通过才可以Any 客户机IP和用户验证,有一个满足即可

示例:

Require valid-user
Order allow,deny
Allow from 192.168.1
Satisfy Any

17、curl 命令

  • curl 是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl 支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。

  • curl is a command line tool for transferring data with URL syntax, supporting FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, IMAP, SMTP, POP3 and RTSP. curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos…), file transfer resume, proxy tunneling and a busload of other useful tricks.

语法格式

curl  [options]  [URL...]
curl的常用选项:              # -A -e -I --compressed 熟悉掌握-A/--user-agent <string>    # 设置用户代理发送给服务器,模拟不同客户端 # curl -A “Chrome 2.2” URL  可以去 access log 查看日志,进行验证
--basic                     # 使用HTTP基本认证(配合 -u 使用 用户名和密码)
--tcp-nodelay               # 使用TCP_NODELAY选项
-e/--referer <URL>          # 来源网址   # curl -A “Chrome 2.2” -e "R-URL" URL 可以设置 REFERER ,即从哪个URL跳转到此URL
--cacert <file>             # CA证书 (SSL)
--compressed                # 要求返回是压缩的格式
-H/--header <line>          # 自定义首部信息传递给服务器
-I/--head                   # 只显示响应报文首部信息   # cutl -I URL
--limit-rate <rate>         # 设置传输速度
-u/--user <user[:password]> # 设置服务器的用户和密码
-0/--http1.0                # 使用HTTP 1.0

18、elinks 命令

语法格式:

elinks  [OPTION]... [URL]...-dump  # 不进入交互式模式,而直接将URL的内容输出至标准输出

19、user/group

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

  • 需要在主配置文件中配置如下命令:

    User apache
    Group apache
    
  • 使用 SUexec可以以其它系统用户身份运行程序,但是不安全

  • 在使用浏览器进行页面访问时,访问的文件对于 apache 用户来说一定要有读权限,不然访问会被禁止的(因为默认的 httpd 进程都是以系统用户 apache 来运行的)

    [root@LeeMumu ~]# ps -aux | grep httpd # 除了主进程,其它进程全是以 apache 的身份在运行
    root       7296  1.2  0.5 230480  5180 ?        Ss   11:18   0:00 /usr/sbin/httpd -DFOREGROUND
    apache     7352  0.0  0.3 230480  3020 ?        S    11:18   0:00 /usr/sbin/httpd -DFOREGROUND
    apache     7353  0.0  0.3 230480  3020 ?        S    11:18   0:00 /usr/sbin/httpd -DFOREGROUND
    apache     7354  0.0  0.3 230480  3020 ?        S    11:18   0:00 /usr/sbin/httpd -DFOREGROUND
    apache     7355  0.0  0.3 230480  3020 ?        S    11:18   0:00 /usr/sbin/httpd -DFOREGROUND
    apache     7356  0.0  0.3 230480  3020 ?        S    11:18   0:00 /usr/sbin/httpd -DFOREGROUND
    root       7595  0.0  0.0 112712   980 pts/0    S+   11:19   0:00 grep --color=auto httpd
    
  • 进程的运行与进程的运行用户身份有很大的关系,可以结合Linux的安全上下文理解

  • 在互联网中运行的程序,其进程的身份一般都是以普通身份运行的,避免某个进程被劫持后,可以任意访问护坡操作系统中的任意内容

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

这是在生产环境中必须的配置,可以极大的提高服务器性能。

适用场景:

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

主配置文件的配置内容如下:

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  # 压缩比,不建议使用最高压缩比,消耗CPU较多
DeflateCompressionLevel 9# 以下配置是针对于一些老旧浏览器进行的特殊配置,一般不需配置          # Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4  gzip-only-text/html     # 如果使用的是 Mozilla/4 浏览器,则只使用 gzip 压缩文本内容# Netscape 4.06-4.08 have some more problems
BrowserMatch  ^Mozilla/4\.0[678]  no-gzip        # 如果使用的是 Mozilla/4\.0[678] 浏览器,则不使用 gzip 压缩# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E]  !no-gzip !gzip-only-text/html     # 只使用gzip

21、https(http over ssl)

SSL会话的简化过程(ssl 的 handshake)

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

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

  • (3) 客户端取得证书并进行证书验正:

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

      (a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名
      (b) 验正证书的内容的合法性:完整性验正
      (c) 检查证书的有效期限
      (d) 检查证书是否被吊销
      (e) 证书中拥有者的名字,与访问的目标主机要一致
      
  • (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换

  • (5) 服务器用此密钥加密用户请求的资源,响应给客户端

注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机。

配置 httpd 支持 https

  • 第一步:为服务器申请数字证书

    测试:通过私建CA发证书(a) 创建私有CA(b) 在服务器创建证书签署请求(c) CA签证
    
  • 第二步:配置httpd支持使用ssl,及使用的证书

# yum -y install mod_ssl      # 安装 ssl 模块,实现 https安装完 ssl 模块后,会生成配置文件:/etc/httpd/conf.d/ssl.conf
需要做如下配置:DocumentRootServerNameSSLCertificateFileSSLCertificateKeyFile
第二步注意事项:# rpm -ql mod_ssl所生成的文件列表,其中有关于 cache 缓存设置,后续会进行讲解
# httpd -M | grep ssl# httpd -t -D DUMP_VHOSTS    # 查看当前 httpd 的虚拟主机有些服务器访问 80 端口 可以重定向到 443 端口,实现 https 的访问http 调用模块 ssl 实现 https ,但是时间长,消耗CPU高
一般实现全 https 方式访问的服务器,都需要很高的性能
https 只能是基于 IP 的虚拟主机
  • 第三步:测试基于 https 访问相应的主机
# openssl  s_client  [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
  • 第四步:进行场景测试验证时的,操作顺序及注意事项

    • 进行场景验证时,如果不把证书的加载位置(ssl.conf)进行设置,会提示“证书有误,不是私密连接”之类的提示
    • 设置完毕后,主机名一致了,但是还是会提示证书不受信任,此时需要把证书导入到浏览器里(设置 高级设置 管理证书 授权中心 证书授权中心 导入
    • 再次浏览内容时,就不会提示了证书问题了
    • 同时,还需要在 ssl.conf 里对所访问的文件目录进行授权,不然会被禁止访问

22、httpd自带的工具程序

htpasswd:basic      # 认证基于文件实现时,用到的账号密码文件生成工具
apachectl            # httpd自带的服务控制脚本,支持 start 和 stop
apxs                 # 由httpd-devel包提供,扩展httpd使用第三方模块的工具
rotatelogs           # 日志滚动工具;(按时间或者大小进行滚动,避免单个 log 文件过大,管理不方便)# access.log --># access.log, access.1.log  --># access.log, acccess.1.log, access.2.log
uexec                # 访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行
ab                   # apache bench,进行服务器web服务的压力测试
# apachectl 命令可实现对 httpd 的启动和关闭[root@LeeMumu ~]# apachectl stop
[root@LeeMumu ~]# apachectl status
* httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)Active: inactive (dead) since Mon 2019-08-05 11:46:09 EDT; 5s agoDocs: man:httpd(8)man:apachectl(8)Process: 7612 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)Process: 7296 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS)Main PID: 7296 (code=exited, status=0/SUCCESS)Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
[root@LeeMumu ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)Active: inactive (dead) since Mon 2019-08-05 11:46:09 EDT; 28s agoDocs: man:httpd(8)man:apachectl(8)Process: 7612 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)Process: 7296 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=0/SUCCESS)Main PID: 7296 (code=exited, status=0/SUCCESS)Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
[root@LeeMumu ~]# apachectl start
[root@LeeMumu ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP ServerLoaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)Active: active (running) since Mon 2019-08-05 11:46:49 EDT; 5s agoDocs: man:httpd(8)man:apachectl(8)Process: 7612 ExecStop=/bin/kill -WINCH ${MAINPID} (code=exited, status=0/SUCCESS)Main PID: 7631 (httpd)Status: "Processing requests..."CGroup: /system.slice/httpd.service├─7631 /usr/sbin/httpd -DFOREGROUND├─7632 /usr/sbin/httpd -DFOREGROUND├─7633 /usr/sbin/httpd -DFOREGROUND├─7634 /usr/sbin/httpd -DFOREGROUND├─7635 /usr/sbin/httpd -DFOREGROUND└─7636 /usr/sbin/httpd -DFOREGROUND

23、httpd的压力测试工具

常用的压力测试工具

压测:benchmarkab, webbench, http_load, seigejmeter, loadrunnertcpcopy   # 网易开发,复制生产环境中的真实请求,并将之保存下来,然后在新的服务器上进行压力测试(尽量贴合真实环境)

ab 语法格式

可通过查看 ab 测试结果,可以了解其并发数量对运行结果的影响(同样的请求数量)。

ab [options] [http[s]://]hostname[:port]/path
ab  [OPTIONS]  URL  # URL 一定要指明具体访问的PATH路径,不能省略,否则会报错-n:总请求数-c:模拟的并行数-k:以持久连接模式 测试

10000个连接请求和并发数10/100/500的运行情况

[root@LeeMumu ~]# ab -n 10000 -c 10 http://192.168.1.10:80/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.1.10 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requestsServer Software:        Apache/2.4.6
Server Hostname:        192.168.1.10
Server Port:            80Document Path:          /index.html
Document Length:        32 bytesConcurrency Level:      10
Time taken for tests:   2.171 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2920000 bytes
HTML transferred:       320000 bytes
Requests per second:    4605.18 [#/sec] (mean)
Time per request:       2.171 [ms] (mean)
Time per request:       0.217 [ms] (mean, across all concurrent requests)
Transfer rate:          1313.20 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0    1   1.3      1      36
Processing:     0    1   1.9      1      37
Waiting:        0    1   1.8      1      37
Total:          1    2   2.3      2      37Percentage of the requests served within a certain time (ms)50%      266%      275%      280%      290%      395%      398%      499%      5100%     37 (longest request)
[root@LeeMumu ~]# ab -n 10000 -c 100 http://192.168.1.10:80/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.1.10 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requestsServer Software:        Apache/2.4.6
Server Hostname:        192.168.1.10
Server Port:            80Document Path:          /index.html
Document Length:        32 bytesConcurrency Level:      100
Time taken for tests:   1.941 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2920000 bytes
HTML transferred:       320000 bytes
Requests per second:    5150.98 [#/sec] (mean)
Time per request:       19.414 [ms] (mean)
Time per request:       0.194 [ms] (mean, across all concurrent requests)
Transfer rate:          1468.83 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0    1   2.0      1      34
Processing:     4   18   8.0     16      81
Waiting:        1   18   8.0     16      81
Total:         12   19   8.3     17      82Percentage of the requests served within a certain time (ms)50%     1766%     1875%     1880%     1990%     2295%     2998%     4999%     68100%     82 (longest request)
[root@LeeMumu ~]# ab -n 10000 -c 500 http://192.168.1.10:80/index.html
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking 192.168.1.10 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requestsServer Software:        Apache/2.4.6
Server Hostname:        192.168.1.10
Server Port:            80Document Path:          /index.html
Document Length:        32 bytesConcurrency Level:      500
Time taken for tests:   3.456 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      2920000 bytes
HTML transferred:       320000 bytes
Requests per second:    2893.38 [#/sec] (mean)
Time per request:       172.809 [ms] (mean)
Time per request:       0.346 [ms] (mean, across all concurrent requests)
Transfer rate:          825.06 [Kbytes/sec] receivedConnection Times (ms)min  mean[+/-sd] median   max
Connect:        0   18 125.8      1    1006
Processing:     3   74 331.9     22    3415
Waiting:        1   73 331.9     22    3415
Total:         13   92 366.4     23    3446Percentage of the requests served within a certain time (ms)50%     2366%     2475%     2580%     2690%     3095%    22598%   142599%   1773100%   3446 (longest request)

运行结果分析

  • Server Software # 表示被测试的Web服务器软件名称
  • Server Hostname # 表示请求的URL主机名
  • Server Port # 表示被测试的Web服务器软件的监听端口
  • Document Path # 表示请求的URL中的根绝对路径
  • Document Length # 表示HTTP响应数据的正文大小,也就是访问内容的长度
  • Concurrency Level # 表示并发用户数(-c #,命令中设置的并发数
  • Time taken for tests # 表示处理完所有请求所花费的总时间
  • Complete requests # 表示总请求数量(-n #,命令中设置的总请求数
  • Failed requests # 表示失败的请求数量,这里的失败是指请求在连接服务器、发送数据等环节发生异常,以及无响应后超时的情况。如果接收到的HTTP响应数据的头信息中含有2XX以外的状态码,则会在测试结果中显示另一个名为“Non-2xx responses”的统计项,用于统计这部分请求数,这些请求并不算在失败的请求中
  • Total transferred # 表示所有请求的响应数据长度总和,包括每个HTTP响应数据的头信息和正文数据的长度。注意这里不包括HTTP请求数据的长度,仅仅为web服务器流向用户PC的应用层数据总长度
  • HTML transferred # 表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中HTTP响应数据中的头信息的长度
  • Requests per second # 吞吐率,计算公式:Complete requests / Time taken for tests
  • Time per request # 用户平均请求等待时间,计算公式:Time token for tests/(Complete requests/Concurrency Level)
  • Time per requet(across all concurrent request) # 服务器平均请求等待时间,计算公式:Time taken for tests/Complete requests,正好是吞吐率的倒数。也可以这么统计:Time per request/Concurrency Level
  • Transfer rate # 表示这些请求在单位时间内从服务器获取的数据长度,计算公式:Total trnasferred/ Time taken for tests这个统计很好的说明服务器的处理能力达到极限时,其出口宽带的需求量
  • Percentage of requests served within a certain time(ms) # 这部分数据是指完成部分请求(百分比)所使用的时间

HTTPD的常用配置相关推荐

  1. 编译安装httpd-2.4及httpd常用配置

    编译安装最新版的httpd 1.先在网页里找出源码包 用最新的1.7.0这个源码包(如果用bz2的需要安装bzip来解压) util也是用最新的(用gz可以直接解压) 2.使用wget下载源码包(对于 ...

  2. LVS+Keepalived+httpd安装及配置

    LVS+Keepalived+httpd安装及配置 原文:http://blog.csdn.net/yanpenglei/article/details/53838354 环境 操作系统 CentOS ...

  3. 由浅入深学习Apache httpd原理与配置

    由浅入深学习Apache httpd原理与配置 原贴:http://jackcui.blog.51cto.com/11877206/1858989 文章防盗链地址:http://jackcui.blo ...

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

    一.httpd 2.2.x目录结构 Cnetos 6.10 YUM安装httpd 2.2.x # yum install -y httpd 程序环境主配置文件:/etc/httpd/conf/http ...

  5. 2、nginx常用配置----作为web服务端

    目录 环境及目的 nginx配置文件特点和结构 1 特性 2 主配置文件结构 常用全局配置 1 main段 2 events段 web服务相关配置 1 server_namerootlisten 11 ...

  6. Apache常用配置修改

    httpd常用配置 httpd常用配置虚拟主机:相同IP不同端口不同IP相同端口这样改:相同ip相同端口不同域名:https配置mod_ssl模块证书类型 访问控制法则: 法则 功能 Require ...

  7. 【转】apache常用配置

    ++如何设 置请求等待时间 在httpd.conf里面设置: TimeOut n 其中n为整数,单位是秒. ++如何接收一个get请求的总时间 接收一个post和put请求的TCP包之间的时间 TCP ...

  8. IntelliJ IDEA 最常用配置,应用、永久激活

    包含 1.最常用配置 2.应用 3.永久激活 刚刚使用IntelliJ IDEA 编辑器的时候,会有很多设置,会方便以后的开发,磨刀不误砍柴工. 比如:设置文件字体大小,代码自动完成提示,版本管理,本 ...

  9. VMware中安装CentOS7网络配置静态IP地址,常用配置和工具安装

    VMware中安装CentOS7网络配置静态IP地址,常用配置和工具安装 在阿里云开源镜像地址下载镜像 Index of /centos/7.2.1511/isos/x86_64/ http://mi ...

  10. Apche Httpd安装与配置

    Apche Httpd安装与配置 查看系统是否安装了httpd rpm -qa | grep httpd  或者 yum list |grep httpd 安装需要的tar包有: httpd-2.2. ...

最新文章

  1. Android TextView 在strings 里面 实现换行
  2. React-Native 之 GD (一)目录结构与第三方框架使用与主题框架搭建
  3. 宝塔控制面板创建ftp后链接不上的解决方法
  4. vb6 datagrid表格垂直居中_Word文档中表格的定位方式
  5. 【职场】税前110万
  6. PHP为什么以及什么时候使用单例模式?
  7. 【nginx运维基础(4)】Nginx的日志管理(日志格式与定时分割日志)
  8. [c/c++]可变参数加法
  9. 汇编语言基本概念(续13)
  10. 百度之星 1004 Labyrinth
  11. 女孩子偷偷学好软件测试,想要年薪30w也没有很难!
  12. [日推荐]『蓝轨迹外语自学中心』免费的全能外语自学工具
  13. python升级导致yum命令无法使用的解决办法(修改版)
  14. Maple 全面基础
  15. Ubuntu20.04虚拟机安装、配置、美化教程
  16. linux内存测试工具memtest,Linux基础教程:内存测试工具(Memtest86+)
  17. 2021固态硬盘排行前十 十大固态硬盘排名
  18. 计算机软件专业硕士论文,软件工程硕士论文范文
  19. 软件测试之蚂蚁金服面试题,含答案
  20. 图片中添加箭头【使用PPT实现】

热门文章

  1. php 单词替换,单词替换 - Shiyin's note
  2. mybatis-plus关联查询,一对一、一对多。
  3. wps教育版支持latex公式啦
  4. matlab 向量的基本运算
  5. 账结法 表结法 两种财务会计处理方法
  6. 错误代码741 因为文件名产生符号链接,所以需由对象管理器重新运行分析操作。
  7. codeforce 741 B. Arpa's weak amphitheater and Mehrdad's valuable Hoses(背包 dp)
  8. 英语单词记忆 词源法-思维导图(01)词源vinc/vict-40
  9. 线性代数学习点(五):向量运算规则的几何表示
  10. SAP中通过放大成本核算批量的方式解决由采购金额过小导致的”成本构成分解为零”的问题