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

基础

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

   关于如何安装httpd服务,可参考上一篇文章Linux+Apache搭建网站


搭建虚拟主机

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

创建虚机主机配置文件

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

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

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

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
<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 目录。若没有这个目录系统就会报错

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

修改全局配置文件httpd.conf

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

1
vim conf/httpd.conf

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

1
Include vhost-conf.d/*.conf

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

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

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

1
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/ 中新建目录

1
2
3
cd /etc/httpd
mkdir ssl
mkdir ssl/example.com

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

1
2
3
4
5
6
7
8
9
10
11
12
13
sftp [email protected]服务器ip地址
// 例: sftp [email protected]
// 输入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模块,先执行安装命令确保系统拥有此模块。

1
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 配置文件。在末尾插入如下内容:

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
<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 文件。在新建文件中添加以下内容:

    1
      LoadModule rewrite_module modules/mod_rewrite.so
    

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

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

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

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

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


0%