Linux+Apache 搭建虚拟主机以及如何安装 SSL 证书

本贴最后更新于 1510 天前,其中的信息可能已经时移世改

新手教程。一台服务器之搭建一个 Web 站点是不是有点太浪费了,所以就需要用到 Apache 的虚拟主机技术,基于 CentOS 7 和 httpd 实现在一台服务器上搭建多个 Web 站点。以及如何安装 SSL 证书,实现 http 跳转 https 访问站点。


基础

  • 服务器(CentOS 7 + Apache)
  • 域名(已解析到服务器 IP 地址上)

搭建虚拟主机

在 CentOS 7 中,Apache 的默认安装目录在 /etc/httpd,以下操作都是在 /etc/httpd 目录中进行,其他系统或版本的安装目录可能不同,可以根据 /etc/httpd/* 逐一查找。
Apache 的版本不同,目录结构也会有所区别。具体请您参阅 Apache 官方 rewrite 的文档。搭建虚拟主机的方法有多种,此处介绍的是基于域名来搭建虚拟主机。

创建虚机主机配置文件

虚拟主机的配置文件最好是单独存放,使用以下命令创建

// 进入Apache的安装根目录
cd /etc/httpd
// 创建虚拟主机配置文件目录
mkdir vhost-conf.d
//创建虚拟主机的配置文件并编辑
vim vhost-conf.d/vhost-name.conf

然后将以下内容写入虚拟主机的配置文件 vhost-name.conf 中。(注意将域名和站点根目录换成自己的)

<VirtualHost *:80>
  ServerName example.com     #服务器域名  
  ServerAlias www.example.com  #服务器别名,没有就删掉这行
  DocumentRoot /var/www/example  #站点根目录路径
  
  #日志文件的路径
  ErrorLog "logs/example.com/error_log"
  CustomLog "logs/example.com/access_log" common
  
  <Directory /var/www/>
    AllowOverride None
    Require all granted
  </Directory>
  
  #设置站点根目录的权限
  <Directory /var/www/example>
    Options FollowSymLinks
    AllowOverride None
    Require all granted 
  #  RewriteEngine on
  #  RewriteCond %{SERVER_PORT} !^443$
  #  RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
  </Directory>

</VirtualHost>

要配置多个虚拟主机只需在 vhost-name.conf 文件中重复插入上述内容,记得修改服务器域名和站点根目录路径,设置权限。

保存退出,此时不要忘记去创建相应的目录,比如说日志文件,系统会在相应的路径上自动生成日志文件。 在上面的配置中” logs/example.com/error_log “意思是将 error_log 文件放在 logs/example.com 目录中, 但系统最初只有 logs 目录,里面没有子目录。如果要配置多个虚拟主机,为了方便管理我们把各自的日志文件放在各自的目录中, 所以要在 logs 目录中创建 example.com 目录。

若没有这个目录系统就会报错

// 在日志目录logs创建子目录
mkdir logs/example.com
// 创建站点根目录
mkdir /var/www/example

修改全局配置文件 httpd.conf

在 CentOS 7 中,全局配置文件 httpd.conf 是放在 conf 目录中

vim conf/httpd.conf

在文件末尾插入下面一行代码(将虚拟主机的配置文件包含在全局配置文件里)

Include vhost-conf.d/*.conf

然后找到以下几行代码,并在行首加上” # “将其注释掉

DocumentRoot "/var/www/html"
ServerName www.example.com:80  //这行好像原本就是被注释了

保存退出,虚拟主机搭建完成,重启 Apache 服务器

systemctl restart httpd 

关于虚拟主机的配置,还可参考 CentOS7 配置 httpd 虚拟主机教程


安装 SSL 证书(可选,进阶

安装 SSL 证书可以实现 http 跳转 https 访问服务器,此时浏览器在地址栏一行中会有一把锁的图标(连接是安全的)。

准备证书

  • Apache 的 SSL 证书

如果域名实在国内服务商(例如阿里云、腾讯云)处购买的,可在购买商处直接下载 SSL 证书, 如果没有提供下载,推荐到 FreeSSL.cn 免费下载 SSL 证书。

要安装证书的域名以 example.com 为例。在下载的 SSL 证书中会有如下三个文件:

  • 1_root_bundle.crt 证书文件

  • 2_example.com.crt 证书文件

  • 3_example.com.key 私钥文件

    在 /etc/httpd/ 中新建目录

cd /etc/httpd
mkdir ssl
mkdir ssl/example.com

然后将三个证书文件放在 ssl/example.com 目录下。
可通过以下方式将自己电脑中文件上传至 Linux 云主机中。(如果你会使用上传工具可跳过下面方法)。为方便操作,我们将三个证书文件就放在 E 盘的 ssl 文件夹中,然后打开新的命令窗口。

sftp root@服务器ip地址
// 例: sftp root@192.168.1.12
// 输入root账户的密码
// 进入E盘ssl文件夹
lcd E:/ssl
// 进入服务器端/etc/httpd/ssl/example.com目录
cd /etc/httpd/ssl/example.com
//上传文件
put "1_root_bundle.crt"
put "2_example.com.crt"
put "3_example.com.key"
//退出
quit

修改 SSL 配置文件

回到原来的窗口,不管系统有没有 mod_ssl.so 模块,先执行安装命令确保系统拥有此模块。

yum install mod_ssl

打开 conf 目录下的 httpd.conf 配置文件。找到 Include conf.modules.d/*.conf(用于加载配置 SSL 的配置目录)配置语句, 并确认该配置语句未被注释。若已注释,请去掉首行的注释符号” # “,保存并退出。

在 conf.modules.d 目录下的 00-ssl.conf 配置文件中找到 LoadModule ssl_module modules/mod_ssl.so(用 于加载 SSL 模块)配置语句,并确认该配置语句未被注释,若已注释,请去掉首行的注释符号” # “,保存并退出。

编辑 conf.d 目录下的 ssl.conf 配置文件。在末尾插入如下内容:

<VirtualHost *:443>

DocumentRoot "/var/www/example" #站点根目录,注意要和上面配置的一致
ServerName example.com:443  #服务器域名
ServerAlias www.example.com  #服务器别名,没有就删掉这行

# 日志文件路径
ErrorLog logs/example.com/ssl_error_log
TransferLog logs/example.com/ssl_access_log
LogLevel warn

SSLEngine on

SSLProtocol all -SSLv2 -SSLv3

SSLCipherSuite HIGH:3DES:!aNULL:!MD5:!SEED:!IDEA

# 证书文件路径
SSLCertificateFile /etc/httpd/ssl/example.com/2_example.com.crt
SSLCertificateKeyFile /etc/httpd/ssl/example.com/3_example.com.key
SSLCertificateChainFile /etc/httpd/ssl/example.com/1_root_bundle.crt

<Files ~ "\.(cgi|shtml|phtml|php3?)$">
    SSLOptions +StdEnvVars
</Files>
<Directory "/var/www/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

BrowserMatch "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

# 日志文件路径
CustomLog logs/example.com/ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

</VirtualHost>

记得修改域名、根路径和日志路径部分,若有多个虚拟主机则多次插入上述内容,只需修改相应部分即可。

HTTP 自动跳转 HTTPS 的安全配置

编辑 conf 目录下的 httpd.conf 配置文件。确认该配置文件是否 存在 LoadModule rewrite_module modules/mod_rewrite.so

  • 若存在,请去掉 LoadModule rewrite_module modules/mod_rewrite.so 前面的注释符号” # “号。
  • 若不存在,请在 /conf.modules.d 中新建 00-rewrite.conf 文件。在新建文件中添加以下内容:
LoadModule rewrite_module modules/mod_rewrite.so

最后, 回到 vhost.conf.d 目录中的 vhost-name.conf 配置文件中,在设置站点 根目录的权限中,有三行被注释的类容,删掉前面的” # “,取消注释(如下)。

RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)?$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

别忘了开启 443 端口,重启防火墙和 Apache 服务器

systemctl restart httpd
firewall-cmd --zone=public --add-port=443/tcp --permanent
systemctl restart firewalld

关于 安装 SSL 证书和 http 自动跳转 https,参考自腾讯云文档:Apache 服务器证书安装


  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖 • 2 关注
  • Apache
    27 引用 • 34 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    69 引用 • 190 回帖 • 492 关注
  • httpd
    2 引用
4 操作
ieien 在 2020-03-01 23:05:15 更新了该帖
ieien 在 2020-03-01 23:03:31 更新了该帖
ieien 在 2020-02-28 17:47:46 更新了该帖
ieien 在 2020-02-28 16:05:47 更新了该帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...