Apache配置多个https站点

在这里插入图片描述

很多场景下,我们希望一个实例可以部署多个站点,比如两个博客系统放在一个实例上,或者在已有一个站点的情况下,想进行另一个系统的api开发。本文将详细讲解Apache下如何配置多站点并且为每个站点部署ssl。

原文地址


# 环境

  • Ubuntu_v18.04
  • Apache_v2.4.29
  • php_v7.2.24
  • 阿里云ecs
  • 已ICP备案的域名sample.com

本文假设你已经熟悉了/etc/apache2/apache2.conf/etc/apache2/ports.conf/etc/apache2/sites-available/000-default.conf/etc/apache2/sites-available/default-ssl.conf的配置。

# 流程

我们的目的是配置多个https站点,将目的分两步----1.配置多个http站点;2.为每个站点部署ssl

# 1.配置多个http站点

有两种办法:①分配不同的端口(这种方式无法配置多个https);②绑定不同的域名(推荐);

# ①

顾名思义,就是通过给不同的站点分配不同的端口实现多站点,在浏览器访问的时候要带上端口,如果我们把89端口分配到一个站点,那么浏览器需要访问sample.com:89;如果把80端口分配到一个站点,那么浏览器只需要访问sample.com,因为80是网页服务的默认端口。

首先在阿里云实例安全组中开放端口80和89(1-65536除保留外都可以)。
在这里插入图片描述
服务器上通过执行ufw allow 80ufw allow 89告诉防火墙打开这两个端口。配置ports.conf告诉apache,我们要监听80和89端口。

Listen 80
Listen 89
<IfModule ssl_module>
        Listen 443
</IfModule>

000-default.conf里配置两个虚拟主机(VirtualHost),告诉apache,80和89端口被分配到的站点和站点位置等其他属性。

<VirtualHost *:80>
        # 管理员邮箱
        ServerAdmin 邮箱账号
        # 绑定的域名
        ServerName  sample.com
        # 域名别名,sample.com和www.sample.com都会解析到这个主机,前提是www解析到了这个实例
        ServerAlias www.sample.com
        # 站点位置,自定义,一般在/var/www/html下
        DocumentRoot /var/www/html/路径1
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined  
</VirtualHost>
<VirtualHost *:89>
        ServerAdmin 邮箱账号
        ServerName  sample.com
        ServerAlias www.sample.com
        DocumentRoot /var/www/html/路径2
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

然后,确保sites-enabled文件夹中有sites-available/000-default.conf的软链接,没有的话使用ln -s /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-enabled/000-default.conf创建。
在这里插入图片描述
service apache2 restart重启apache,访问sample.com和sample.com:89即可看到对应站点下的内容。

# ②

假如两个兄弟要在一个实例上部署两个博客系统,第一种实现多站点的方法显然是不妥当的,因为我们访问网页的时候没有加端口的习惯,况且谁知道你的端口是多少,只有一个大兄弟能通过sample.com直接访问(使用80端口)。

这样,第二种方案就来了—-绑定不同的域名实现多站点。两个大兄弟每人买个域名,分别是sample1.com和sample2.com。他们把域名解析到同一个实例上(ip地址),设置虚拟主机根据域名,指定不同的站点,这样就实现了一个实例多个站点。

首先当然是购买域名sample1.com、sample2.com,ICP备案。将它们解析到实例上。这里提一下,sample2.com可以不用买,在sample1.com下添加一个三级域名的解析就可以了,比如blog,三级域名也可以绑定虚拟主机。就是说大兄弟A的博客地址是sample1.com,大兄弟B的博客地址就是blog.sample1.com。
在这里插入图片描述
修改000-default.conf配置两个虚拟主机,两个主机分别绑定域名sample1.com和sample2.com。

<VirtualHost *:80>
        ServerAdmin 邮箱账号
        ServerName  sample1.com
        ServerAlias www.sample1.com
        DocumentRoot /var/www/html/路径1
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:80>
        ServerAdmin 邮箱账号
        ServerName  sample2.com
        ServerAlias www.sample2.com
        DocumentRoot /var/www/html/路径2
        ErrorLog ${APACHE_LOG_DIR}/umhelp_error.log
        CustomLog ${APACHE_LOG_DIR}/umhelp_access.log combined
</VirtualHost>

service apache2 restart重启apache,访问sample1.com和sample2.com即可分别看到两位大兄弟的博客。

# 2.为每个站点部署ssl

在开始前默认你已经按照方法二配置好了两个站点,sample1.com和sample2.com。

首先分别为sample1.com和sample2.com申请ssl证书,个人版是免费的。
在这里插入图片描述
下载apache版本的证书,里面有三个文件***.key***chain.crt***public.crt
在这里插入图片描述
执行sudo apt-get install openssl安装openssl,执行sudo a2enmod ssl开启ssl模块。

用ftp工具将证书上传到服务器(没有的话我推荐用lrzsz,apt-get install lrzsz安装,sz filename 将文件从服务器拉到本地,rz接收从客户端发来的文件),我把他们放在/etc/ssl/certs

阿里云安全组规则开放443端口(https默认端口),ufw allow 443告诉服务器开放443端口。

配置default-ssl.conf

<IfModule mod_ssl.c>
	<VirtualHost _default_:443>
		# 管理员邮箱
		ServerAdmin 邮箱账号
		ServerName  sample1.com
		DocumentRoot /var/www/html/路径1
		ErrorLog ${APACHE_LOG_DIR}/error.log
		CustomLog ${APACHE_LOG_DIR}/access.log combined
		SSLEngine on
		#下面三行填sample1.com的证书路径
		SSLCertificateFile	/etc/ssl/certs/***public.crt
		SSLCertificateKeyFile   /etc/ssl/certs/***.key
		SSLCertificateChainFile /etc/ssl/certs/***chain.crt
		<FilesMatch "\.(cgi|shtml|phtml|php)$">
		    SSLOptions +StdEnvVars
		</FilesMatch>
		<Directory /usr/lib/cgi-bin>
	            SSLOptions +StdEnvVars
		</Directory>
	</VirtualHost>
	<VirtualHost _default_:443>
                ServerAdmin 邮箱账号
		ServerName  sample2.com
                DocumentRoot /var/www/html/路径2
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined     
                SSLEngine on
		# 下面三行填sample2.com的证书路径     
                SSLCertificateFile      /etc/ssl/certs/***public.crt
                SSLCertificateKeyFile   /etc/ssl/certs/***.key
                SSLCertificateChainFile /etc/ssl/certs/***chain.crt    
                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                    SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
                </Directory>
        </VirtualHost>
</IfModule>

实际上,sites-available文件夹下的配置文件是不起效果的,那为什么我们编辑它呢,因为核心配置文件apache2.conf引入了sites-enabled下的所有文件,而sites-enabled文件夹下放的是site-available下的文件的软链接。所以,我们要想default-ssl.conf生效,就要使用命令ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/000-default-ssl.conf在sites-enabled下建立一个指向default-ssl.conf的软链接。

执行service apache2 restart重启apache,访问https://sample1.com和https://sample2.com可看到对应站点,配置成功。

呼~

欢迎留言指正。

Reference

原文地址

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页