新手教程。一台服务器之搭建一个 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 服务器证书安装
- 本文作者: ieien
- 作者博客: ieienPark
- 源文链接: https://ieien.gitee.io/2019/11/08/vhost/
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于