总字符数: 21.11K

代码: 16.00K, 文本: 2.07K

预计阅读时间: 1.31 小时

背景

Apache: Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中.

Nginx: Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行.其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等.

可以使用curl -I(大写i)选项仅查看响应头部信息,我们来看一看国内知名网站部署的服务器类型:

不难发现,现在主流的web服务器都采用nginx的部署方式,毕竟在支持高并发方面有着天生的优势.
主流的网站基本采用:lamp/lnmp方式部署web服务器

Apache与Nginx对比?

Apache Nginx
稳定、对动态请求处理强 擅长处理静态请求
但同时高并发时性能较弱,耗费资源多 高并发处理能力强、擅长处理反向代理、均衡负载

Apache的相关内容

Apache的安装部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 安装apache软件、手册
yum install -y httpd httpd-manual
# 打开服务
systemctl start httpd
# 设置开机自启动
systemctl enable httpd

# 放行防火墙
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload

# 关闭Selinux
vim /etc/selinux/config
# 将SELINUX的值改为disable

# /var/www/html---apache根目录,默认发布目录,安装httpd后才会有这个文件
# apache默认发布文件,编辑此文件,通过网页可以看到内容
vim /var/www/html/index.html
1
2
3
4
测试:在浏览器输入:  
http://192.168.64.169/
# 查看手册
http://192.168.64.169/manual

Apache的基本信息

目录 位置
主配置目录 /etc/httpd/conf
主配置文件 /etc/httpd/conf/httpd.conf
子配置目录 /etc/httpd/conf.d/
子配置文件 /etc/httpd/conf.d/*.conf
默认发布目录 /var/www/html
默认发布文件 index.html
默认端口 80
默认安全上下文 httpd_sys_content_t
程序开启默认用户 apache (我们在下载httpd这个软件后,会自动生成apache这个用户)
apache日志 /etc/httpd/logs/*

修改Apache默认发布目录

1
2
3
4
5
6
7
8
9
10
11
12
# 创建文件夹
mkdir -p /www/html
chown -R apache:apache /www/html
chmod -R 755 /www/html
echo "Hello Kill3r" >> /www/html/index.html
vim /etc/httpd/conf/httpd.conf
# 复制一行,注释掉原来的,防止自己手写把格式写错
DocumentRoot "/www/html" # 将默认发布目录改为/www/html,要保证这个目录存在,否则会启动报错
# 修改授权信息
<Directory "/www/html">
Require all granted # 允许共享该目录下面的东西,否则无法访问
</Directory>

修改默认端口(可选)

1
2
3
4
5
6
7
vim /etc/httpd/conf/httpd.conf
# 修改默认端口为8080

# 重启apache
systemctl restart httpd
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

修改默认发布文件

1
2
3
4
5
6
7
8
9
10
vim /etc/httpd/conf/httpd.conf
# 默认发布文件就是访问apache时没有指定文件名时默认访问的文件
# 这个文件可以指定多个,有访问顺序.

# 设置当请求一个目录时,Apache将提供的文件.

<IfModule dir_module>
DirectoryIndex index.html index2.html
</IfModule>
# 当index.html不存在时,就会访问index2. html

Apache 配置文件详细解读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# 详细信息请参考 URL:https://httpd.apache.org/docs/2.4/.
# 具体而言,请查看 URL:https://httpd.apache.org/docs/2.4/mod/directives.html 对每个配置指令的讨论.

# 请注意,在阅读这些指令之前,请确保了解它们的作用.它们只是一些提示或提醒.如果您不确定,请查阅在线文档.已经警告过您了.

# 配置和日志文件名:如果您为服务器的许多控制文件指定的文件名以 "/"(或对于Win32系统为"drive:/")开头,服务器将使用该明确的路径.如果文件名不以 "/" 开头,则会在其前面添加 ServerRoot 的值.例如,当 ServerRoot 设置为 "/www" 时,'log/access_log' 将被服务器解释为 '/www/log/access_log',而 '/log/access_log' 将被解释为 '/log/access_log'.

# ServerRoot: 服务器配置、错误和日志文件所在的目录树的顶级路径.
# 在目录路径的末尾不要添加斜杠.如果将 ServerRoot 指向非本地磁盘,请确保在 Mutex 指令中指定一个本地磁盘,如果使用基于文件的互斥锁.如果希望多个 httpd 守护进程共享相同的 ServerRoot,至少需要更改 PidFile.
ServerRoot "/etc/httpd"

# Listen: 允许您将Apache绑定到特定的IP地址和/或端口,而不是默认的.还请参阅 <VirtualHost> 指令.
# 更改以下示例中的侦听地址以防止Apache绑定到所有可用的IP地址.
# Listen 12.34.56.78:80
Listen 8080

#
# 动态共享对象(DSO)支持
#
# 要能够使用作为 DSO 构建的模块的功能,您必须在此位置放置相应的 `LoadModule` 行,以便其中包含的指令在使用之前实际可用.
# 静态编译的模块(`httpd -l` 列出的模块)不需要在此处加载.
#
# 示例:
# LoadModule foo_module modules/mod_foo.so
#
Include conf.modules.d/*.conf

#
# 如果您希望 httpd 以不同的用户或组身份运行,您必须最初以 root 身份运行 httpd,然后它将切换.
#
# 用户/组:要作为 httpd 运行的用户/组的名称(或编号).
# 通常建议为运行 httpd 创建一个专用的用户和组,就像大多数系统服务一样.
#
User apache
Group apache

# 'Main' 服务器配置
#
# 本节中的指令设置 'main' 服务器使用的值,该服务器响应未由 <VirtualHost> 定义处理的任何请求.这些值还为您稍后在文件中定义的任何 <VirtualHost> 容器提供了默认值.
#
# 所有这些指令都可以出现在 <VirtualHost> 容器内,这种情况下,这些默认设置将被用于定义的虚拟主机进行覆盖.
#
#
# ServerAdmin:您的地址,服务器问题应该通过电子邮件发送到的地方.此地址将出现在一些服务器生成的页面上,例如错误文档.例如:admin@your-domain.com
#
ServerAdmin root@localhost

#
# ServerName 指定服务器用于标识自身的名称和端口.
# 这通常可以自动确定,但我们建议您明确指定它,以避免启动期间出现问题.
#
# 如果您的主机没有注册的 DNS 名称,请在此处输入其 IP 地址.
#
# ServerName www.example.com:80


# 禁止访问服务器文件系统的全部内容.您必须在下面的其他 <Directory> 块中明确允许访问 Web 内容目录.
#
<Directory />
AllowOverride none
Require all denied
</Directory>

#
# 请注意,从这一点开始,您必须明确允许特定功能启用 - 因此,如果某些东西不像您期望的那样工作,请确保您已经明确启用它.
#
# DocumentRoot:您将为之提供文档的目录.默认情况下,所有请求都从此目录接收,但可以使用符号链接和别名来指向其他位置.
#
# DocumentRoot "/var/www/html"
DocumentRoot "/www/html"

#
# 放宽对 /var/www 内容的访问权限.
#
<Directory "/www/html">
AllowOverride None
# 允许公开访问
Require all granted
</Directory>


# 进一步放宽对默认文档根目录的访问权限:
<Directory "/www/html">
#
# Options 指令的可能值为 "None"、"All" 或任何组合:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# 请注意,"MultiViews"必须明确命名---"Options All"不会包含它.
#
# Options 指令既复杂又重要.有关更多信息,请参阅
# https://httpd.apache.org/docs/2.4/mod/core.html#options
#
Options Indexes FollowSymLinks

#
# AllowOverride 控制可以放置在 .htaccess 文件中的指令.
# 它可以是 "All"、"None" 或以下关键字的任意组合:
# Options FileInfo AuthConfig Limit
#
AllowOverride None

#
# 控制谁可以从此服务器获取文件.
#
Require all granted
</Directory>


# DirectoryIndex: 设置当请求一个目录时,Apache 将提供的文件.
#
<IfModule dir_module>
DirectoryIndex index.html index2.html
</IfModule>

#
# 以下行防止 Web 客户端查看 .htaccess 和 .htpasswd 文件.
#
<Files ".ht*">
Require all denied
</Files>

#
# ErrorLog: 错误日志文件的位置.
# 如果在 <VirtualHost> 容器中没有指定 ErrorLog 指令,
# 与该虚拟主机相关的错误消息将在此处记录.
# 如果您为 <VirtualHost> 容器定义了错误日志文件,
# 则该主机的错误将在那里记录,而不是在这里.
#
ErrorLog "logs/error_log"

#
# LogLevel: 控制记录到 error_log 的消息数量.
# 可能的值包括:debug、info、notice、warn、error、crit、alert、emerg.
#
LogLevel warn

<IfModule log_config_module>
#
# 以下指令定义一些格式的别名,用于与 CustomLog 指令一起使用(参见下文).
#
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common

<IfModule logio_module>
# 您需要启用 mod_logio.c 来使用 %I 和 %O
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>

#
# 访问日志文件(通用日志文件格式)的位置和格式.
# 如果您没有在 <VirtualHost> 容器内定义任何访问日志文件,
# 它们将在此处记录.相反,如果您在每个 <VirtualHost> 容器中定义了独立的访问日志文件,
# 事务将在其中记录,而不是在此文件中.
#
#CustomLog "logs/access_log" common

#
# 如果您偏好具有访问、代理和引用者信息的日志文件(组合日志文件格式),
# 可以使用以下指令.
#
CustomLog "logs/access_log" combined
</IfModule>


<IfModule alias_module>
#
# Redirect: 允许您向客户端通知曾经存在于服务器命名空间中但现在不存在的文档.
# 客户端将对文档在其新位置重新发起请求.
# 示例:
# Redirect permanent /foo http://www.example.com/bar

#
# Alias: 将 Web 路径映射到文件系统路径,用于访问不位于 DocumentRoot 下的内容.
# 示例:
# Alias /webpath /full/filesystem/path
#
# 如果在 /webpath 后面加上斜杠,则服务器将要求它在 URL 中存在.
# 您还可能需要提供一个 <Directory> 部分来允许访问文件系统路径.

#
# ScriptAlias: 控制包含服务器脚本的目录.
# ScriptAliases 与 Aliases 基本相同,只是目标目录中的文档被视为应用程序,并由服务器在请求时运行,而不是作为发送给客户端的文档.
# 与 Alias 指令一样,ScriptAlias 指令也适用于尾部的斜杠规则.
#
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

</IfModule>

#
# "/var/www/cgi-bin" 应更改为配置了 ScriptAlias 的 CGI 目录的实际路径.
#

<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>

<IfModule mime_module>
#
# TypesConfig 指向包含从扩展名到 MIME 类型的映射列表的文件.
#
TypesConfig /etc/mime.types

#
# AddType 允许您添加或覆盖指定文件类型的 MIME 配置文件中的 MIME.
#
#AddType application/x-gzip .tgz
#
# AddEncoding 允许您让某些浏览器动态解压缩信息.
# 注意:并非所有浏览器都支持此功能.
#
#AddEncoding x-compress .Z
#AddEncoding x-gzip .gz .tgz
#
# 如果上面的 AddEncoding 指令被注释掉,那么您可能要定义这些扩展名以表示媒体类型:
#
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

#
# AddHandler 允许您将某些文件扩展名映射到"处理程序":
# 与文件类型无关的操作.这些可以是服务器内置的,也可以是使用 Action 指令添加的(参见下文).
#
# 若要在 ScriptAliased 目录以外使用 CGI 脚本:
# (您还需要在 "Options" 指令中添加 "ExecCGI".)
#
#AddHandler cgi-script .cgi

# 对于类型映射(可协商的资源):
#AddHandler type-map var

#
# Filters 允许您在将内容发送到客户端之前对其进行处理.
#
# 若要解析 .shtml 文件以进行服务器端包含(SSI):
# (您还需要在 "Options" 指令中添加 "Includes".)
#
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>

#
# 为所有提供的内容指定默认字符集;
# 这使得默认情况下将所有内容解释为 UTF-8.
# 若要使用默认浏览器选择(ISO-8859-1),
# 或者允许 HTML 内容中的 META 标签覆盖此选择,请将该指令注释掉.
#
AddDefaultCharset UTF-8


<IfModule mime_magic_module>
#
# mod_mime_magic 模块允许服务器使用文件内容本身的各种提示来确定文件类型.
# MIMEMagicFile 指令告诉模块提示定义的位置.
#
MIMEMagicFile conf/magic
</IfModule>

#
# 可自定义的错误响应有三种类型:
# 1)纯文本 2)本地重定向 3)外部重定向
#
# 一些示例:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
#

#
# EnableMMAP 和 EnableSendfile:在支持的系统上,
# 可以使用内存映射或 sendfile 系统调用来传送文件.
# 这通常提高服务器性能,但在从网络挂载的文件系统中提供服务时,
# 或者如果系统不支持这些功能,则必须关闭它们.
# 如果被注释,默认值为:EnableMMAP On,EnableSendfile Off.
#
#EnableMMAP off
EnableSendfile on

# 附加配置
#
# 如果有的话,在"/etc/httpd/conf.d"目录中加载配置文件.
IncludeOptional conf.d/*.conf

Apache的访问控制

基于IP的访问控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 先将所有配置恢复至初始,然后配置.  
yum remove -y httpd*
rm -rf /etc/httpd
# 如果/etc/httpd/conf.d目录下有welcome.conf文件那么会显示欢迎页面,如果没有会显示拒绝
rm -rf /etc/httpd/conf.d/welcome.conf
vim /etc/httpd/conf/httpd.conf

`以下两个二选一`
`Apache的默认配置并不支持使用CIDR表示法或正则表达式进行IP地址的拒绝.如果希望使用更高级的IP拒绝规则,你可能需要考虑使用专门的防火墙软件或其他网络设备来处理这些规则.`

# 拒绝某IP访问
<Directory "/www/html/">
Order Allow,Deny # 表示按照 Allow 和 Deny 的顺序进行访问控制.
Allow from All # 允许所有来源的请求访问该目录.
Deny from 192.168.0.100 # 拒绝 IP 地址为192.168.0.100的请求访问该目录
</Directory>

# 允许某IP访问
# 请注意,Allow from指令已经在Apache 2.4版本中废弃,推荐使用新的Require指令进行访问控制.如果您使用的是较新的版本,请将配置更新为以下内容:

<Directory "/www/html">
Options Indexes FollowSymLinks
Require ip 192.168.64.1
</Directory>
# 这将实现相同的效果,只允许来自192.168.64.1的IP地址访问/www/html目录.

# 重启服务
systemctl restart httpd

基于用户的访问控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# htpasswd 是一个 Apache Web 服务器提供的工具,用于创建和管理用户名和密码的文件.
# -c 是 htpasswd 命令的选项,表示要创建一个新的密码文件,如果文件已存在则会被覆盖.
# killer 是用户名,可以根据实际需要替换为你想要创建的用户名.
# 最后一个 killer 是密码,表示将要为该用户设置的密码.同样,你可以替换为你自己选择的密码.
# 执行上述命令后,将会在执行命令的目录下创建一个名为 "killer" 的密码文件,并在文件中记录所设置的用户名和对应的加密密码.这样,当用户使用该用户名和密码进行身份验证时,Apache 将会验证其凭据是否与密码文件中的匹配.

# 进入目录
cd /etc/httpd/conf/
htpasswd -cm killer killer ##建立用户并设置密码
cat killer ##查看该文件

vim httpd.conf
# 需要将配置文件中的两个<Directory>块都删掉,合并为下面这一个

<Directory "/www/html">
AllowOverride None
AuthType basic
AuthName "Please input your name and password"
AuthUserFile /etc/httpd/conf/killer
Require valid-user
Options Indexes FollowSymLinks
</Directory>




# Require 指令可以接受以下几种值:
# Require all granted: 允许所有用户无条件地访问资源.
# Require all denied: 禁止所有用户无条件地访问资源.
# Require host example.com: 仅允许来自指定主机(例如 example.com)的请求访问资源.
# Require ip 192.168.0.1: 仅允许来自指定 IP 地址(例如 192.168.0.1)的请求访问资源.
# Require valid-user: 要求用户通过身份验证后才能访问资源.需要用户提供有效的凭据(用户名和密码).
# Require user username: 仅允许指定用户名的用户访问资源.
# 使用逻辑运算符 and, or, not 来组合多个条件.例如:Require ip 192.168.0.1 and user admin 表示仅允许来自 192.168.0.1 的用户 admin 访问资源.

# 重启服务
systemctl restart httpd.service

Apache的虚拟主机配置

虚拟主机(Virtual Host)是一种在单个物理服务器上托管多个域名或网站的技术.通过虚拟主机,可以将一个物理服务器划分为多个逻辑的虚拟服务器,每个虚拟服务器都可以拥有自己独立的域名、网站和配置.

虚拟主机常见的应用场景包括:

  1. 共享主机服务:虚拟主机允许多个用户共享同一台物理服务器,并在各自的虚拟主机中托管自己的网站.这种方式非常适合小型网站、个人博客和中小型企业,因为可以降低成本并提供基本的托管功能.
  2. 多域名托管:虚拟主机可以让你在同一台服务器上托管多个域名.这意味着你可以拥有多个网站,并通过虚拟主机将它们隔离开来.每个虚拟主机可以具有独立的域名、独立的文件夹和独立的配置,使得不同网站之间相互独立且互不干扰.
  3. 子域名管理:虚拟主机可以用于在同一域名下创建多个子域名,并为每个子域名分配独立的虚拟主机.这对于大型网站或企业来说很有用,因为它们可以将不同的功能或服务划分到不同的子域名下,便于管理和维护.
  4. 测试和开发环境:虚拟主机提供了一个方便的方式来创建测试和开发环境.你可以在同一台服务器上创建一个虚拟主机,用于开发和测试你的网站或应用程序,而不会影响生产环境.

总之,虚拟主机是一种有效的方式来提供共享主机服务、多域名托管、子域名管理和测试/开发环境.它允许在单个物理服务器上运行多个独立且隔离的网站,从而提供更高的灵活性和资源利用率.

基于域名

域名 IP
www.kgc.com 192.168.226.133
www.kcce.com 192.168.226.133

为虚拟主机提供域名解析

1
2
3
vim /etc/hosts
# 文件末尾加入
127.0.0.1 www.kgc.com www.kcce.com

为虚拟主机准备网页文档

1
2
3
mkdir -p /var/www/html/kgccom /var/www/html/kccecom
echo " www.kgc.com" > /var/www/html/kgccom/index.html
echo " www.kcce.com " > /var/www/html/kccecom/index.html

添加虚拟主机配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
vim /etc/httpd/conf.d/httpd-vhosts.conf

<VirtualHost *:80>
DocumentRoot "/var/www/html/kgccom"
ServerName www.kgc.com
ErrorLog "logs/www.kgc.com.error_log"
CustomLog "logs/www.kgc.com.access_log" common
<Directory "/var/www/html/kgccom">
Require all granted
</Directory>
</VirtualHost>

<VirtualHost *:80>
DocumentRoot "/var/www/html/kccecom"
ServerName www.kcce.com
ErrorLog "logs/www.kcce.com.error_log"
CustomLog "logs/www.kcce.com.access_log" common
<Directory "/var/www/html/kccecom">
Require all granted
</Directory>
</VirtualHost>

重启Apache服务systemctl restart httpd.service

基于端口

基于实验一修改配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
vim /etc/httpd/conf/httpd.conf
# /Listen查到到监听端口位置
listen 5050
listen 8080

vim /etc/httpd/conf.d/httpd-vhosts.conf

<VirtualHost *:5050>
DocumentRoot "/var/www/html/kgccom"
ServerName www.kcce.com
ErrorLog "logs/www.kgc.com.error_log"
CustomLog "logs/www.kgc.com.access_log" common
<Directory "/var/www/html">
Require all granted
</Directory>
</VirtualHost>

<VirtualHost *:8080>
DocumentRoot "/var/www/html/kccecom"
ServerName www.kcce.com
ErrorLog "logs/www.kcce.com.error_log"
CustomLog "logs/www.kcce.com.access_log" common
<Directory "/var/www/html/kccecom">
Require all granted
</Directory>
</VirtualHost>


systemctl restart httpd
netstat -ntap

基于IP

此前我们有两张网卡地址分别为:192.168.226.133和192.168.226.134,此处需要用上.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
vim /etc/httpd/conf/httpd.conf
# 将 Listen 8080 Listen 5050 改为以下
Listen 192.168.226.133:80
Listen 192.168.226.134:80


vim /etc/httpd/conf.d/httpd-vhosts.conf

<VirtualHost 192.168.226.133:80> # 此处将*号修改为第一张网卡的IP
DocumentRoot "/var/www/html/kccecom/"
ErrorLog "logs/www.accp.com.error_log"
CustomLog "logs/www.accp.com.access_log" common
<Directory "/var/www/html/">
Require all granted
</Directory>
</VirtualHost>


<VirtualHost 192.168.226.134:80> # 此处将*号改为第二张网卡的IP,并将下面的accp改
DocumentRoot "/var/www/html/kgccom/"
ErrorLog "logs/www.accp02.com.error_log"
CustomLog "logs/www.accp02.com.access_log" common
<Directory "/var/www/html/">
Require all granted
</Directory>
</VirtualHost>

https加密访问

HTTPS和HTTP的区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密
如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS.
为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密.
HTTPS和HTTP的区别主要为以下四点:
一、https协议需要到ca申请证书,一般免费证书很少,需要交费.
二、http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议.
三、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443.
四、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全.

Apache服务加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 想将我的apache服务加密,安装插件mod_ssl  
yum install mod_ssl -y
# 重启服务
systemctl restart httpd
# 进入目录
cd /etc/httpd/conf.d/
# 可以看到 ssl.conf文件
ls
# 防火墙放行端口
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload
# 查看https的端口443是否开启
netstat -antlupe | grep httpd
# 此时,浏览器输入https://192.168.64.169/会发现:授权本部门没有授权(没有备案),认为不安全,所以警示!

SSL配置文件解读

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# 当我们还提供SSL时,除了要监听HTTP端口外,
# 还需监听HTTPS端口.

Listen 443 https

##
## SSL全局上下文
##
## 所有SSL配置都适用于主服务器和所有启用SSL的虚拟主机.
##

# 密码对话框:
# 配置密码收集过程.
# 过滤对话程序('builtin' 是内部终端对话框)必须将密码提供给标准输出.
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog

# 进程间会话缓存:
# 配置SSL会话缓存:首先是使用的机制,
# 其次是到期超时时间(以秒为单位).
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300

# 伪随机数生成器(PRNG):
# 配置一个或多个用于初始化SSL库PRNG的种子源.
# 种子数据应具有良好的随机质量.
# 警告!在某些平台上,如果没有足够的熵可用,则/dev/random会阻塞.
# 这意味着您不能使用/dev/random设备,
# 因为它会导致非常长的连接时间(与
# 提供更多熵所需的时间一样长).但通常这些
# 平台还提供了一个不会阻塞的/dev/urandom设备.如果有,请使用此设备.请阅读mod_ssl用户
# 手册了解更多详细信息.
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
#SSLRandomSeed startup file:/dev/random 512
#SSLRandomSeed connect file:/dev/random 512
#SSLRandomSeed connect file:/dev/urandom 512

#
# 使用"SSLCryptoDevice"启用任何支持的硬件
# 加速器.使用 "openssl engine -v" 列出支持
# 的引擎名称.注意:如果启用加速器,但
# 服务器无法启动,请查阅错误日志并确保
# 您的加速器正常工作.
#
SSLCryptoDevice builtin
#SSLCryptoDevice ubsec

##
## SSL虚拟主机上下文
##

<VirtualHost _default_:443>

# 从全局配置继承的虚拟主机的常规设置


ServerName apache_server.killer.com:443
DocumentRoot "/www/html"

# 为SSL虚拟主机使用单独的日志文件;注意LogLevel
# 不会从httpd.conf继承.
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn

# SSL引擎开关:
# 启用/禁用此虚拟主机的SSL.
SSLEngine on

# SSL协议支持:
# 列出客户端将能够连接的启用的协议级别.
# 默认禁用SSLv2访问:
SSLProtocol all -SSLv2 -SSLv3

# SSL加密套件:
# 列出客户端允许协商的加密套件.
# 有关完整列表,请参阅mod_ssl文档.
SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA

# 优化速度的SSL加密套件配置:
# 如果速度是您的主要关注点(例如在繁忙的HTTPS服务器上),
# 您可能希望强制客户端使用特定的、性能优化的加密套件.在这种情况下,将这些加密套件
# 添加到SSLCipherSuite列表的前面,并启用SSLHonorCipherOrder.
# 注意:通过提前RC4-SHA和AES128-SHA(如下例中所示),
# 大多数连接将不再具有完全前向保密性--如果服务器的密钥被
# 破解,过去或未来的流量的捕获也必须被视为已被破解.
#SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:MEDIUM:!aNULL:!MD5
#SSLHonorCipherOrder on

# 服务器证书:
# 将SSLCertificateFile指向一个PEM编码的证书.如果
# 证书被加密,则会提示您输入密码.
# 请注意,kill -HUP命令将再次提示.可以使用genkey(1)命令生成新证书.
SSLCertificateFile /etc/pki/tls/certs/apache_server.killer.com.crt

# 服务器私钥:
# 如果密钥没有与证书合并,请使用此指令指向密钥文件.
# 请记住,如果您同时拥有RSA和DSA私钥,
# 您可以并行配置两者(以允许使用DSA密码等).
SSLCertificateKeyFile /etc/pki/tls/private/apache_server.killer.com.key

# 服务器证书链:
# 将SSLCertificateChainFile指向一个包含PEM编码的CA证书
# 的连接的文件.或者,当CA证书直接附加到服务器
# 证书时,引用的文件可以与SSLCertificateFile相同.
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt

# 证书颁发机构(CA):
# 设置CA证书验证路径,以查找CA证书,用于客户端认证,
# 或者一个包含所有CA证书的巨大文件(文件必须为PEM编码).
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt

# 客户端认证(类型):
# 客户端证书验证类型和深度.类型为
# none、optional、require和optional_no_ca.深度是指在
# 在决定证书无效之前验证证书
# 颁发者链的级别.
#SSLVerifyClient require
#SSLVerifyDepth 10

# 访问控制:
# 使用SSLRequire可以基于任意复杂的布尔表达式
# 包含服务器变量检查和其他查找指令的目录访问控制.
# 语法是C和Perl的混合体.有关详

网址重写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 需求让客户在自己的浏览器中输入http://login.killer.com可以自动跳转到https://login.killer.com
# 进入目录
cd /etc/httpd/conf.d
vim killer.conf


<VirtualHost *:80>
ServerName login.killer.com
RewriteEngine on
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301]
</VirtualHost>

<VirtualHost *:443>
ServerName login.killer.com
DocumentRoot /www/html
CustomLog logs/login.log combined
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
</VirtualHost>

<Directory "/www/html">
Require all granted
</Directory>




# 重启服务,且在本地解析中加入 http://login.killer.com
systemctl restart httpd


# 输入http://login.killer.com会自动跳转到https://login.killer.com