HTTPD的常用配置

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  value
		directive         # 不区分字符大小写;
		value             # 为路径时,是否区分字符大小写,取决于文件系统; 

HTTPD的常用配置_第1张图片

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  80
	Listen  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.10

HTTP/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-8

Tang & Neo

Connection 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 mpm
 mpm_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 -M
 proxy_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 模型)

StartServers       8      # 启动的进程数量
MinSpareServers    5      # 最小空闲进程数
MaxSpareServers   20      # 最大空闲进程数(应大于等于 Startservers)
ServerLimit      256      # 服务器
MaxClients       256      # 最大的客户连接数量
MaxRequestsPerChild  4000 # 每个子进程处理的最大请求数(超过这个数后,会自动杀死子进程;0 代表处理请求无限制)
	
  • worker的配置:

StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25    # 每个子进程启用多少线程 
MaxRequestsPerChild  0
	

4、DSO: Dynamic Shared Object

  • httpd -M 所有显示为 shared 的模块,都能被卸载
  • 关于模块的配置文件 /etc/httpd/conf.modules.d/*
  • 要实现对动态模块的卸载,可到相应的配置文件中去注释掉即可,然后重启服务
  • 模块的存在配置/etc/httpd/modules/
  • 配置指定实现模块加载LoadModule
  • 模块文件路径可使用相对路径相对于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
  • 第五步:进行网页访问,发现访问的是欢迎页面。说明更换的文档根没有生效,因为我们是创建了首页的。

HTTPD的常用配置_第2张图片

  • 第六步:把更改的根,在主配置文件进行授权,使用容器块进行授权。不然无法访问(HTTP/2.2 不需要授权)

        AllowOverride None
        Require all granted

  • 第七步:检查语法。并重启服务,然后再次进行访问,访问成功。
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service

HTTPD的常用配置_第3张图片

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

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

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

文件系统路径 机制

# 基于目录进行授权

...

# 基于具体文件进行授权						

...

# 基于正则表达式进行授权

...

URL 路径机制

基于具体 URL;

...

基于 URL 使用正则表达式:

...

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

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

HTTP/2.2

order和allow、deny
	order:定义生效次序;写在后面的表示默认法则
							
Allow from, Deny from
Allow from 192.168.1.22
Deny from all

来源地址:(四种语法格式)
IP
NetAddr:
	172.16
	172.16.0.0
	172.16.0.0/16
	172.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控制还是基于主机名控制,是需要放置在配置块中或配置块中。

示例:允许某一网段访问,又禁止其中一个主机的访问


	Require not ip 172.16.0.200
	Require ip 172.16

完整示例
  • 第一步:没配置访问控制以前,两台主机都能访问web服务器。
[root@Lee ~]# ifconfig | grep "inet addr" | grep 127.0.0.1 -v
          inet 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 "\" | grep 127.0.0.1 -v
        inet 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"


        AllowOverride None
        Options Indexes FollowSymLinks
        
                Require not ip 192.168.1.13       # 拒绝 192.168.1.13 主机进行访问 
                Require ip 192.168.1              # 允许 192.168.1.0 段的所有主机进行访问
        

  • 第三步:进行语法检查,并重启服务。
[root@Neo ~]# ifconfig | grep "\" | grep 127.0.0.1 -v | grep 192.168.10.5 -v
        inet 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 "\" | grep 127.0.0.1 -v
        inet 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 -v
          inet 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 被拒绝访问


403 Forbidden

Forbidden

You don't have permission to access /index.html on this server.

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

HTTP/2.2


	...
	Order allow,deny
	Allow from all 

HTTP/2.4


	...
	Require all granted

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

HTTP/2.2


	...
	Order allow,deny
	Deny from all 

HTTP/2.4


	...
	Require all denied

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
  • 第二步:通过浏览器进行访问,整个目录文件尽收眼底。

HTTPD的常用配置_第4张图片
HTTPD的常用配置_第5张图片

  • 第三步:现在进行主页添加。
[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 

GoaYuanYuan

  • 第四步:通过浏览器进行页面访问,只能访问主页。可与第二步的访问结果进行比较。通过想访问目录下的图片,需要配置具体的 URL 。所以在不知道具体 URL 的情况下,是无法得知目录的具体内容的。所以除了下载页面,尽量不要使用索引功能。

HTTPD的常用配置_第6张图片
HTTPD的常用配置_第7张图片

  • 第五步:禁用 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"


        AllowOverride None
#       Options Indexes FollowSymLinks
        Options FollowSymLinks
        Require all granted

3、进行语法检查,并重启 httpd 服务。
[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
4、进行页面访问,查看结果。是禁止访问的。但是通过完整的 URL 还是可以访问具体内容的。
比如:
	http://192.168.1.10/images/gaoyuanyuan8.jpg

HTTPD的常用配置_第8张图片
HTTPD的常用配置_第9张图片

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"


        AllowOverride None
#       Options Indexes FollowSymLinks
        Options FollowSymLinks
        Require all granted

  • 第三步:进行该链接文件的访问。通过访问结果,发现是可以访问。
[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"


        AllowOverride None
        Options None                                               # Options 设置为None
        Require all granted

[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第五步:再次进行该链接文件的访问。通过访问结果,发现是禁止访问的。

[root@Tang ~]# curl http://192.168.1.10/fstab.html


403 Forbidden

Forbidden

You don't have permission to access /fstab.html on this server.

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.rpm
	
Alias  /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/"               # 定义别名

                      # 进行授权
        AllowOverride None
        Options Indexes FollowSymLinks
        Require all granted

[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第三步:通过浏览器进行访问,访问http://192.168.1.10/neo_images/ 就相当于访问 /data/neo/tang/目录下的文件。

HTTPD的常用配置_第10张图片

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) 定义安全域

	Options None
	AllowOverride None
	AuthType Basic
	AuthName "String“
	AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
	Require  user  username1  username2 ...

  • (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) 定义安全域

	Options None
	AllowOverride None
	AuthType Basic
	AuthName "String“
	AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
	AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
	Require  group  grpname1  grpname2 ...

  • (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"


        Options None
        AllowOverride None
        AuthType Basic
        AuthName "neo"
        AuthUserFile "/data/passuser"
        Require user neo                          # 允许用户 neo 进行登陆访问

[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第三步:进行验证。通过浏览器进行访问时,如果不输入对应的用户名和密码,是无法访问的。输入正确的用户名和密码可成功访问。

HTTPD的常用配置_第11张图片
HTTPD的常用配置_第12张图片
HTTPD的常用配置_第13张图片

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"


        Options None
        AllowOverride None
        AuthType Basic
        AuthName "String"
        AuthUserFile "/data/passuser"
        AuthGroupFile "/data/groupuser"
        Require group pets

[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第三步:进行验证。不输入用户名和密码的情况下、输入 pets 组成员的用户名和密码、输入 lovers 组成员的用户名和密码。
    HTTPD的常用配置_第14张图片
    HTTPD的常用配置_第15张图片
    HTTPD的常用配置_第16张图片
    HTTPD的常用配置_第17张图片
    HTTPD的常用配置_第18张图片

12、虚拟主机

站点标识: socket

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

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

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

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

虚拟主机的配置方法


	ServerName FQDN
	DocumentRoot  ""

其它可用指令:

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

..

Alias
...

基于IP的虚拟主机示例


	ServerName www.a.com
	DocumentRoot "/www/a.com/htdocs"



	ServerName www.b.net
	DocumentRoot "/www/b.net/htdocs"



	ServerName www.c.org
	DocumentRoot "/www/c.org/htdocs"

基于端口的虚拟主机


	ServerName www.a.com
	DocumentRoot "/www/a.com/htdocs"



	ServerName www.b.net
	DocumentRoot "/www/b.net/htdocs"



	ServerName www.c.org
	DocumentRoot "/www/c.org/htdocs"

基于FQDN的虚拟主机


	ServerName www.a.com
	DocumentRoot "/www/a.com/htdocs"



	ServerName www.b.net
	DocumentRoot "/www/b.net/htdocs"



	ServerName www.c.org
	DocumentRoot "/www/c.org/htdocs"

13、status页面

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

LoadModule  status_module  modules/mod_status.so

httpd/2.2:


	SetHandler server-status
	Order allow,deny
	Allow from 172.16

httpd/2.4:


	SetHandler server-status
	
		Require ip 172.16
	
	

示例:

  • 第一步:配置主配置文件,并允许 192.168.1.0 段的地址访问 httpd 的状态页。
[root@Neo ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/data/web/www"


        Options None
        AllowOverride None
        Require all granted


        SetHandler server-status
        
                Require ip 192.168.1
        

[root@Neo ~]# httpd -t
Syntax OK
[root@Neo ~]# systemctl restart httpd.service
  • 第二步:进行验证,输入http://192.168.1.10/server-status,查看服务器 httpd 的运行状态。

HTTPD的常用配置_第19张图片

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
    
    #UserDir disabled
    UserDir public_html #指定共享目录的名称
    
    
    准备目录
    su – wang;mkdir ~/public_html
    setfacl –m u:apache:x ~wang
    
    访问
    http://localhost/~wang/index.html
    

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

Satisfy ALL|Any
	ALL 客户机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     # 设置用户代理发送给服务器,模拟不同客户端 
	 # curl -A “Chrome 2.2” URL  可以去 access log 查看日志,进行验证
--basic                     # 使用HTTP基本认证(配合 -u 使用 用户名和密码)
--tcp-nodelay               # 使用TCP_NODELAY选项
-e/--referer           # 来源网址   
	# curl -A “Chrome 2.2” -e "R-URL" URL 可以设置 REFERER ,即从哪个URL跳转到此URL
--cacert              # CA证书 (SSL)
--compressed                # 要求返回是压缩的格式
-H/--header           # 自定义首部信息传递给服务器
-I/--head                   # 只显示响应报文首部信息   # cutl -I URL
--limit-rate          # 设置传输速度
-u/--user  # 设置服务器的用户和密码
-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 
需要做如下配置:
	DocumentRoot
	ServerName
	SSLCertificateFile
	SSLCertificateKeyFile
第二步注意事项:

# 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 Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Mon 2019-08-05 11:46:09 EDT; 5s ago
     Docs: 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 Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Mon 2019-08-05 11:46:09 EDT; 28s ago
     Docs: 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 Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-08-05 11:46:49 EDT; 5s ago
     Docs: 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的压力测试工具

常用的压力测试工具

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

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 requests


Server Software:        Apache/2.4.6
Server Hostname:        192.168.1.10
Server Port:            80

Document Path:          /index.html
Document Length:        32 bytes

Concurrency 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] received

Connection 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      37

Percentage of the requests served within a certain time (ms)
  50%      2
  66%      2
  75%      2
  80%      2
  90%      3
  95%      3
  98%      4
  99%      5
 100%     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 requests


Server Software:        Apache/2.4.6
Server Hostname:        192.168.1.10
Server Port:            80

Document Path:          /index.html
Document Length:        32 bytes

Concurrency 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] received

Connection 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      82

Percentage of the requests served within a certain time (ms)
  50%     17
  66%     18
  75%     18
  80%     19
  90%     22
  95%     29
  98%     49
  99%     68
 100%     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 requests


Server Software:        Apache/2.4.6
Server Hostname:        192.168.1.10
Server Port:            80

Document Path:          /index.html
Document Length:        32 bytes

Concurrency 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] received

Connection 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    3446

Percentage of the requests served within a certain time (ms)
  50%     23
  66%     24
  75%     25
  80%     26
  90%     30
  95%    225
  98%   1425
  99%   1773
 100%   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) # 这部分数据是指完成部分请求(百分比)所使用的时间

你可能感兴趣的:(Linux学习笔记)