很多场景下,我们希望一个实例可以部署多个站点,比如两个博客系统放在一个实例上,或者在已有一个站点的情况下,想进行另一个系统的api开发。本文将详细讲解Apache下如何配置多站点并且为每个站点部署ssl。
原文地址
本文假设你已经熟悉了/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。
有两种办法:①分配不同的端口(这种方式无法配置多个https);②绑定不同的域名(推荐);
顾名思义,就是通过给不同的站点分配不同的端口实现多站点,在浏览器访问的时候要带上端口,如果我们把89端口分配到一个站点,那么浏览器需要访问sample.com:89;如果把80端口分配到一个站点,那么浏览器只需要访问sample.com,因为80是网页服务的默认端口。
首先在阿里云实例安全组中开放端口80和89(1-65536除保留外都可以)。
服务器上通过执行ufw allow 80
、ufw allow 89
告诉防火墙打开这两个端口。配置ports.conf
告诉apache,我们要监听80和89端口。
Listen 80
Listen 89
Listen 443
在000-default.conf
里配置两个虚拟主机(VirtualHost),告诉apache,80和89端口被分配到的站点和站点位置等其他属性。
# 管理员邮箱
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
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
然后,确保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。
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
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
service apache2 restart
重启apache,访问sample1.com和sample2.com即可分别看到两位大兄弟的博客。
在开始前默认你已经按照方法二配置好了两个站点,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
# 管理员邮箱
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
SSLOptions +StdEnvVars
SSLOptions +StdEnvVars
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
SSLOptions +StdEnvVars
SSLOptions +StdEnvVars
实际上,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可看到对应站点,配置成功。
呼~
欢迎留言指正。
原文地址