一,需求描述
现有一台云服务器,且只绑定一个IP;要求在同一个服务器中搭建多个站点;
且一个站点对应一个解析域名,达到在同一服务器同一IP下访问不同域名显示不同站点的目的。
目前已经在Apache Server上部署了WordPress CMS,还需要再部署另一个站点,并使用不同域名访问;
即:浏览器输入 www.site1.com 打开WordPress站点
浏览器输入 www.site2.com 打开另一个站点
二,服务器环境,安装软件
操作系统:Ubuntu 18.04
Web服务器:Apache 2.4.29
数据库:Mysql 5.7.34
三,基本原理讲解
目前在一台服务器上搭建多个网站的方法主要由以下几种:
- 基于IP地址 这种方法适用于一台服务器有多个IP的情况,现在IPv4地址已经枯竭,公有IP非常珍贵,故此方法不适用
- 基于端口号 这种方法使用不同的端口号来识别不同的网站,实际访问时使用网址加端口号的方式来实现,如 http://www.site1.com:80,http:// www.site1.com:81,http:// www.site1.com:82,该方式配置后需要在网站后加上端口号来访问不同的网站,适用于网站域名短缺但服务器的端口号充足的情况,缺点是网站后需要加上端口号,不利于用户访问
- 基于主机名 这种方法使用不同的域名来区分不同的网站,所有的域名解析都指向同一个IP,Apache通过在HTTP头中附带的host参数来判断用户需要访问哪一个网站,如http://www.site1.com,http://www.site2.com,http://www.site3.com,多数情况下多个网站架在一台服务器上均使用该方法 。
明显根据我们的需求我们肯定是需要用第三种方法,基于主机名搭建多个网站。
下面我们主要讲一下如何通过修改apache配置信息来实现第3种方法!
apache2在启动的时候自动读取/etc/apache2/apache2.conf文件的配置信息,不同的配置项按功能分布在不同的文件中,然后被Include包含到apache2.conf这个主配置文件中,方便管理。
就是说事实上apache2主配置文件只有一个,即apache2.conf,其他的都是被include进来的。
可以把所有的配置都放在apache2.conf或者任何一个配置文件中,但是划分到不同文件会让我们管理起来方便很多。
Apache2目录结构
root@cloudserver:/etc/apache2# tree
.
├── apache2.conf 全局配置
├── conf-available 可用的配置文件
├── conf-enabled 已启用的配置文件
├── envvars 环境变量
├── magic
├── mods-available 已安装的模块
├── mods-enabled 已启用的模块
├── ports.conf http服务端口信息
├── sites-available 可用站点信息
│ ├── 000-default.conf
│ └──default-ssl.conf
└── sites-enabled 已经启用的站点信息,当中的文件是到/etc/apache2/sites-available/ 文件的软连接
└── 000-default.conf -> ../sites-available/000-default.conf
其中,apache2.conf是apache2的主配置文件,包括三个级别的配置。
-
控制apache服务器执行过程的全局配置。
-
定义主服务或者默认服务器的参数的配置,这些配置会响应virtual host不处理的请求。这类配置也为所有的virtual hosts配置提供默认值。
-
virtual hosts相关的配置,使得同一个apache服务进程处理向不同IP地址或者主机名发送的请求。
Apache2配置简介
Apache2主配置文件:使用编辑器打开 /etc/apache2/apache2.conf 查看发现,最后两行为:
# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf
可以明显看到/etc/apache2/sites-enabled下存放着有关虚拟站点(Virtual Host)的配置 。
经过查看,在初始情况下,该目录下包含一个符号链接:
└── sites-enabled 已经启用的站点信息,当中的文件是到/etc/apache2/sites-available/ 文件的软连接
└── 000-default.conf -> ../sites-available/000-default.conf
这里又引出另外一个配置目录:/etcc/apache2/sites-available。这个目录下放置了所有可用站点的真正配置文件,对于Enabled的站点,Apache2在sites-enabled目录建立一个到sites-available目录下文件的符号链接。
/etc/apache2/sites-available下有两个文件:000-default.conf和default-ssl.conf。
注意:sites-enabled中的000-default.conf链接的文件为sites-available中的000-default.conf。
以000-default.conf为例,我们来看一下VirtualHost的配置是啥样的:
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
DocumentRoot是这个站点的根目录,这样Apache2启动时会扫描/etc/apache2/sites-enabled中可用的站点配置并加载。
当用户访问localhost:80时,Apache2就将default站点根目录/var/www/html下的index.html作为请求的响应返回给浏览器。
四,利用Apache2配置多站点
根据我们的需求,我们需要修改Apache2的配置文件,来满足我们根据不同域名访问不同的站点的需求。
假设我们需要在一个Apache2服务器上配置两个站点:
站点一:www.site1.com
站点二:www.site2.com
4.1 建立配置文件
在 sites-available 中建立两个站点的配置文件 www_site1_com.conf 和 www_site2_com.conf:
cd /etc/apache2/sites-available
sudo cp 000-default.conf www_site1_com.conf
sudo cp 000-default.conf www_site2_com.conf
4.2 编辑上面两个配置文件,以 www_site1_com.conf 为例
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
ServerName www.site1.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html1/
<Directory "/var/www/html1/">
Options Indexes FollowSymLinks
AllowOverride all
Order Deny,Allow
Deny from none
Allow from all
</Directory>
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
注意:
上面配置中:ServerName、DocumentRoot是我们重点关注的配置点 。
ServerName后面填写我们要绑定域名,DocumentRoot是该站点的根目录,如上所示,我设置的根目录为/var/www/html1(没有的,自己建一个),注意html1文件夹的名字可以随便起,你自己知道什么含义就行。
(同样的,站点二:www.site2.com 也做同样的改动)
4.3 在sites-enabled目录下建立符号链接
将我们在上一步配置好的两个配置文件 www_site1_com.conf 和 www_site2_com.conf 都拷贝到 sites-enabled 文件夹下:
cd /etc/apache2/sites-available
sudo cp /etc/apache2/sites-available/www_site1_com.conf /etc/apache2/sites-enabled/www_site1_com.conf
sudo cp /etc/apache2/sites-available/www_site2_com.conf /etc/apache2/sites-enabled/www_site2_com.conf
然后在sites-enabled目录下建立符号链接
cd /etc/apache2/sites-enabled
sudo ln -s /etc/apache2/sites-available/site1_com.conf /etc/apache2/sites-enabled/site1_com.conf
sudo ln -s /etc/apache2/sites-available/site2_com.conf /etc/apache2/sites-enabled/site2_com.conf
4.4 部署项目
- 将你要部署的站点拷贝到 /vat/www/ 目录下,并重命名为 html1 和html2(按自己习惯命名就行啦)
- 在html1目录下新建文件.htaccess,以重构路由:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
重写Apache2配置
sudo a2enmod rewrite
4.5 重启Apache2使配置生效
sudo service apache2 restart
4.6 修改/etc/hosts文件,便于测试
添加如下两行:
127.0.0.1 www.site1.com
127.0.0.1 www.site2.com
4.7 测试
打开浏览器,输入URL:http://www.site1.com 即可看到我们设置的站点一。
问题补充:
关于通过IP访问会显示哪个站点,一般情况下,默认的配置文件:000-default.conf 优先级最高,通过ip访问后,会优先访问该文件所配置的站点。
参考文章:
Ubuntu环境下利用Apache2部署多个站点_Jochen的博客-CSDN博客