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

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

新手教程。一台服务器之搭建一个 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 并不包含封闭源代码软件。

    239 引用 • 224 回帖
  • Apache
    27 引用 • 35 回帖
  • SSL

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

    70 引用 • 193 回帖 • 413 关注
  • 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 更新了该帖

相关帖子

欢迎来到这里!

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

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