环境声明

服务器

  • 系统: Centos7.4
  • IP地址: 192.168.132.111
  • 网卡模式: 桥接模式
  • 软件版本: httpd-2.4.6-67 | openssl-1.0.2 | Bind9.9.4

环境部署

服务安装

1
yum install httpd -y

image-20211210154510827

配置文件

文件路径 文件说明
/etc/httpd/conf/httpd.conf 主配置文件
/etc/httpd/conf.d/ 子配置文件目录
/var/www/html/ 默认Web根目录
/var/log/httpd/ 日志存放目录

常用配置项

基本配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 指定监听端口
Listen 端口
Listen IP:端口

# 指定管理员邮件地址
ServerAdmin 邮件地址

# 指定服务名(域名)
ServerName 域名:端口

# 指定主页文件(如index.html)
DirectoryIndex 文件1 文件2

# 指定子配置文件的目录与后缀
IncludeOptional 目录/*.后缀名

# 指定运行服务的用户与用户组
User 用户名
Group 组名

# 指定网站根目录
DocumentRoot 绝对路径

访问控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 允许所以人访问
Require all granted

# 拒绝所有人访问
Require all denied

# 只允许来自特定主机的请求访问(如: www.a.com)
Require host 主机名

# 只允许特定IP或IP端访问
Require ip xx.xx xx.xx.xx xx.xx.xx.xx
Require ip 172.16 192.168.1 192.168.200.10 # 举例

# 允许所有人访问但禁止某些IP或IP段访问
Require all granted
Require no ip xx.xx.xx

# 认证访问
Require valid-user

Options选项

1
2
3
4
5
6
7
8
9
10
11
# 允许目录浏览 (该目录下无主页文件(index.html或其他)时则返回该目录的文件列表)
Options Indexes

# 在该目录下允许系统使用符号连接
Options FollowSymLinks

# 在该目录下允许执行CGI脚本
Options ExecCGI

# 使用符号连接时,只有当符号连接的文件拥有者与实际文件拥有者相同才可以访问
SymLinksIfOwnerMatch

AllowOverride选项

1
2
3
4
5
6
7
8
# 忽略所有 .htaccess文件
AllowOverride None

# 读取所有的 .htaccess文件
AllowOverride ALL

# URL重写
AllowOverride FileInfo

部署示例

项目需求

  • 网站根目录: /www/wwwroot/
  • 主页文件名: hello.html
  • 主页内容: Hello World
  • 服务运行用户: webuser
  • 允许所有人访问

先创建网站的目录,再将主页内容写入到主页文件中

1
2
mkdir -p /www/wwwroot/
echo "Hello World" > /www/wwwroot/hello.html

再添加一个用户,并将服务运行用户设置为新添加的用户

1
useradd webuser -s /sbin/nologin

image-20211210164737242

修改主配置文件,将UserGroup值改为新添加的用户,保存退出后再将服务重启查看运行用户

1
2
3
4
vim /etc/httpd/conf/httpd.conf

User webuser
Group webuser

image-20211210165053644

再修改主配置文件,指定网站的根目录、主页文件等信息。

1
2
3
4
5
6
7
DocumentRoot "/www/wwwroot/"
<Directory "/www/wwwroot/">
Options Indexes FollowSymLinks
DirectoryIndex hello.html
AllowOverride None
Require all granted
</Directory>

修改完成后保存重启服务、关闭selinux、放行http后,进行访问测试

1
2
3
4
5
6
7
8
systemctl restart httpd

setenforce 0
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
iptables -I INPUT -p tcp --dport 80 -j ACCEPT

curl http://192.168.132.111

image-20211210165605346

虚拟目录

虚拟目录配置

项目需求

  • 网站根目录: /www/web1/
  • 虚拟目录: /web1/
  • 主页文件名: index.html
  • 主页内容: Hello Web1
  • 允许所有人访问

先创建网站的目录,再将主页内容写入到主页文件中

1
2
mkdir /www/web1/
echo "Hello Web1" > /www/web1/index.html

再配置主配置文件,因为默认的主页文件名为index.html,所以不用做配置,其他的配置同上即可。配置完成后重启服务再访问即可

1
2
3
4
5
6
# Alias 虚拟目录 网站根目录

Alias /web1/ /www/web1/
<Directory "/www/web1/">
Require all granted
</Directory>

image-20211210171000861

需要认证的虚拟目录

项目需求

  • 网站根目录: /www/web2/
  • 虚拟目录: /web2/
  • 主页文件名: index.html
  • 主页内容: Hello Web2
  • 只允许用户w1、w2登录后访问(密码与用户名相同)

注: 该方法不止用于虚拟目录

先创建网站的目录,再将主页内容写入到主页文件中

1
2
mkdir /www/web2/
echo "Hello Web2" > /www/web2/index.html

在主配置文件中添加下方配置信息,AuthUserFile字段中的信息后续会用到

1
2
3
4
5
6
7
Alias /web2/ /www/web2/
<Directory "/www/web2/">
Require valid-user # 身份认证
AuthType basic # 认证类型
AuthName "test" # 认证提示信息
AuthUserFile /etc/httpd/.passwd # 用户认证文件
</Directory>

添加认证用户,命令格式为htpasswd -c 存储地址 用户名,执行完成后会在指定目录下创建一个文件用于存储用户账号密码

1
2
htpasswd -c /etc/httpd/.passwd w1		# 第一次创建要使用 -c 参数创建
htpasswd -m /etc/httpd/.passwd w2 # 后续再创建用户需要使用 -m 参数,否则会直接覆盖

image-20211213151819972

创建完成后重启httpd服务器,再使用浏览器访问该页面

1
2
# 使用curl访问
curl 链接地址 --user 用户名:密码

image-20211213152729205

image-20211213152511817

image-20211213152537662

虚拟主机

基于端口

项目需求

  • 网站根目录: /www/8080/
  • 网站端口: 8080
  • 主页文件名: index.html
  • 主页内容: Hello 8080
  • 网站根目录: /www/8081/
  • 网站端口: 8081
  • 主页文件名: index.html
  • 主页内容: Hello 8081

可以将下方配置写在主配置文件中,但为了方便维护与规范,需创建子配置文件/etc/httpd/conf.d/vhost.conf,并将下方内容复制到子配置文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Listen 8080		# 监听的端口
Listen 8081

<Virtualhost 0.0.0.0:8080> # 虚拟主机的端口与IP
DocumentRoot /www/8080/
<Directory "/www/8080">
Require all granted
</Directory>
</Virtualhost>

<Virtualhost 0.0.0.0:8081>
DocumentRoot /www/8081/
<Directory "/www/8081">
Require all granted
</Directory>
</Virtualhost>

配置完成后重启过httpd服务、放行8080|8081端口后访问测试

image-20211213155104321

基于IP

项目需求

  • 网站根目录: /www/111/
  • 网站IP: 192.168.132.111
  • 主页文件名: index.html
  • 主页内容: Hello 111
  • 网站根目录: /www/112/
  • 网站IP: 192.168.132.112
  • 主页文件名: index.html
  • 主页内容: Hello 112

为服务器添加两个IP(单网卡双IP、双网卡双IP),实验中使用的是单网卡双IP,操作步骤如下:

编辑网卡配置文件/etc/sysconfig/network-scripts/ifcfg-ens33,将IP地址设置为静态后下方配置,再重启网络服务

1
2
3
4
5
IPADDR=192.168.132.111
IPADDR2=192.168.132.112
NETMASK=255.255.255.0
GATEWAY=192.168.132.1
DNS=192.168.132.111

image-20211213160926466

基于IP的配置方法与基于端口一样,将Virtualhost 0.0.0.0中的IP地址改成指定的IP,重启服务后访问测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Virtualhost 192.168.132.111>
DocumentRoot /www/111/
<Directory "/www/111">
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</Virtualhost>

<Virtualhost 192.168.132.112>
DocumentRoot /www/112/
<Directory "/www/112">
Require all granted
</Directory>
</Virtualhost>

image-20211213161405599

基于域名

项目需求

  • 网站根目录: /www/www1/
  • 网站IP: 192.168.132.111
  • 网站域名: www1.a.com
  • 主页文件名: index.html
  • 主页内容: Hello www1
  • 网站根目录: /www/www2/
  • 网站IP: 192.168.132.111
  • 网站域名: www2.a.com
  • 主页文件名: index.html
  • 主页内容: Hello www2

需要先配置DNS服务,将www1与www2解析到192.168.132.111

image-20211213194407628

再配置子配置文件/etc/httpd/conf.d/vhost.conf,配置完成后重启服务测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<Virtualhost 192.168.132.111>
ServerName www1.a.com
DocumentRoot /www/www1/
<Directory "/www/www1">
Require all granted
</Directory>
</Virtualhost>

<Virtualhost 192.168.132.111>
Servername www2.a.com
DocumentRoot /www/www2/
<Directory "/www/www2">
Require all granted
</Directory>
</Virtualhost>

image-20211213194739153

个人主页配置

项目需求

  • 网站IP: 192.168.132.111
  • 主页用户: w1、w2
  • 主页内容: Hello w1 | Hello w2

创建用户w1、w2,在用户的家目录下创建public_html作为web根目录,将用户家目录权限设置为705

1
2
3
4
5
6
7
useradd w1
useradd w2
mkdir /home/w1/public_html
mkdir /home/w2/public_html

chmod 705 /home/w1/
chmod 705 /home/w2/

image-20211213161923514

修改子配置文件/etc/httpd/conf.d/userdir.conf,注释掉UserDir disabled,将UserDir public_html取消注释

1
2
# UserDir disabled
UserDir public_html

配置完成后重启服务访问能测试,格式http://IP/~用户名/

image-20211213162550301

Https配置

项目需求

  • 网站IP: 192.168.132.111
  • 网站根目录: /www/ssl/
  • 主页内容: Hello SSL
  • 备注: 要求使用https访问该网站

安装mod_ssl模块,使用opensll申请ssl证书,并将证书与密钥移动到/etc/httpd/ssl目录下(方便管理)

1
2
3
4
yum install mod_ssl -y

# 申请证书
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -keyout server.key -out server.crt

image-20211213171524688

修改/etc/httpd/conf.d/vhost.conf子配置文件,将证书与密钥路径改成刚才创建的路径,修改完成后重启测试

1
2
3
4
5
6
7
8
9
10
Listen 443
<VirtualHost 192.168.132.111:443>
DocumentRoot "/www/ssl/"
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/server.crt
SSLCertificateKeyFile /etc/httpd/ssl/server.key
<Directory "/www/ssl/">
Require all granted
</Directory>
</VirtualHost>

image-20211213193212497

Http重定向

项目需求

  • 网站IP: 192.168.132.111
  • 主页内容: Hello SSL
  • 备注: 使用http访问网站时自动跳转为https

修改该虚拟主机的配置项,加入下方参数进行重定向,修改完成后保存重启服务,访问http://192.168.132.111时会被自动重定向到https://192.168.132.111

1
2
3
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]

image-20211213202751186