详解Ubuntu/CentOS下Apache多站点配置
前言:
情景一:平时在我们开发的时候,一般项目都只存放在localhost指定的根目录下,当有好几个项目的时候,只能在根目录下以不同的文件夹区分,特别的不方便。
情景二:平时在看教学视频的时候,总是看到那些老师在单机下使用不同的域名,访问的却是本地的项目代码,每当这时候我都会问,这个怎么实现的。
情景三:在最近去实习面试的时候,面试官问我如何在apache服务器上搭建多站点。我只能回答我不会。
为了解决上面的几个问题,我决定把apache多站点配置这个知识点搞清楚。关键是搞懂apache虚拟主机,Apache的虚拟主机是一种允许在同一台机器上,运行超过一个网站的解决方案。后面围绕的就是apache虚拟主机展开的。
在本篇博客中我将介绍两种方法来实现apache多站点的配置:
1、如何配置根据访问的域名区分配置不通的站点?
(比如,访问www.nhooo.com访问的是/home/www/jb51项目,访问www.wordpress.com访问的是/home/www/wordpress项目)
2、在相同域名地址的情况下,如何通过访问不同的端口获得不同的站点?
(比如,访问www.nhooo.com访问的是/home/www/jb51项目,访问www.nhooo.com:8080访问的是/home/www/jb51_admin项目(即jb51的后台管理系统))
一:根据访问的域名区分站点
在这里我先介绍Ubuntu系统下的配置,在来讨论CentOS下(因为我在学习过程中也是先ubuntu,再配置centos的时候都是参考的ubuntu的配置)
Ubuntu环境下:
我的环境是:
操作系统:Ubnutu16.04LTS
apache服务:Apache/2.4.18(Ubuntu)(使用apache2-v命令获取)
在Ubnutu上,apache服务叫apache2,而不是httpd(在Centos上叫httpd),主配置文件为/etc/apache2/apache2.conf,我们打开/etc/apache2/apache2.conf,发现最后两行为:
#Includethevirtualhostconfigurations: IncludeOptionalsites-enabled/*.conf
显然/etc/apache2/sites-enabled下存放着有关虚拟站点(VirtualHost)的配置。经查看,初始情况下,该目录下包含一个符号连接(软链接,相当于快捷方式):
000-default.conf->../sites-available/000-default.conf
这里又引出另外一个配置目录:/etc/apache2/sites-available。这个目录下放置了所有可用站点的真正配置文件,对于Enabled的站点,Apache2在sites-enabled目录建立一个到sites-available目录下文件的符号链接。
/etc/apache2/sites-available下有两个文件:
000-default.confdefault-ssl.conf
/etc/apache2/sites-enabled/000-default.conf链接的文件是/etc/apache2/sites-available/000-default.conf,我们就以/etc/apache2/sites-available/000-default.conf文件为例,看看一个VirtualHost的配置是啥样的(为了简洁,所有的注释我都去掉了):
ServerAdminwebmaster@localhost DocumentRoot/var/www/html ErrorLog${APACHE_LOG_DIR}/error.log CustomLog${APACHE_LOG_DIR}/access.logcombined
DocumentRoot是这个站点的根目录,这样Apache2启动时会扫描/etc/apache2/sites-enabled中可用的website配置并加载。当用户访问localhost:80时,Apache2就将default站点根目录/var/www/html下的index.html(或index.PHP等,可配置)作为请求的回应返回给浏览器,你就会欣赏到的就是/var/www/html/index.html这个文件中的内容了。
Apache2的默认站点我们不要去动它。我们新增站点配置来满足我们的要求。
第一步:新增站点配置文件
在/etc/apache2/sites-available目录中中建立两个站点的配置文件www-jb51-net.conf和www-wordpress-com.conf:
#进入虚拟主机配置文件夹 cd/etc/apache2/sites-available/ #复制默认的虚拟主机配置文件 sudocp000-default.confwww-jb51-net.conf sudocp000-default.confwww-wordpress-com.conf
编辑这两个配置文件,以www-jb51-net.conf为例:
#CreatedByzhongjinon2016-12-12冬至ServerAdmin1054840542@qq.com ServerNamewww.nhooo.com DocumentRoot/home/www/jb51 OptionsFollowSymLinks AllowOverrideAll #Requirealldenied Requireallgranted ErrorLog${APACHE_LOG_DIR}/error.log CustomLog${APACHE_LOG_DIR}/access.logcombined
注意上面配置中:ServerName、DocumentRoot和Directory是我们重点关注的配置点。jb51的ServerName为www.nhooo.com,根目录为/home/www/jb51,Directory同DocumentRoot。
针对www-wordpress-com.conf改变相应的配置,即修改ServerName为www.wordpress.com,DocumentRoot和Directory修改为/home/www/wordpress。
第二步:在sites-enabled目录下建立符号链接
cd/etc/apache2/sites-enabled #建立对应的软链接 sudoln-s/etc/apache2/sites-available/www-jb51-net.conf/etc/apache2/sites-enabled/www-jb51-net.conf sudoln-s/etc/apache2/sites-available/www-wordpress-com.conf/etc/apache2/sites-enabled/www-wordpress-com.conf
第三步:在对应目录放入项目代码
如上面所示,我们的jb51项目代码放在/home/www/jb51,wordpress项目代码放在/home/www/wordpress,那么我们在对应目录下创建对应目录并赋予相应权限,以jb51为例:
sudomkdir-p/home/www/linuxidc
然后在/home/www/jb51下放入项目代码,这里为了测试就新建index.php,内容如下:
赋予相应的权限:
sudochmod-R777/home/www/jb51针对wordpress做同样的操作。
第四步:修改/etc/hosts文件
打开查看/etc/hosts文件,开头是:
127.0.0.1localhost我们在该行后面添加:
#modifiedbyzhongjinon2016-12-21冬至 127.0.0.1www.nhooo.com 127.0.0.1www.wordpress.com #保存退出第五步:重启apache服务器并测试
重启apache服务器使得配置生效:
systemctlrestartapache2.service在浏览器(如果是桌面版的话)中访问www.nhooo.com或www.wordpress.com,看看是否输出了index.php文件中的内容。
如果你不是桌面版(服务器),那么可以使用命令行测试:
curlwww.nhooo.com看看返回的字符串是不是正确输出!
Centos环境下:
我的环境是:操作系统:Centos7
apache服务:Apache/2.4.6(CentOS)(通过httpd-v获取)
在这里我们实现Ubuntu环境下同样的效果。
Centos下,apache的服务叫httpd,主配置文件为/etc/httpd/conf/httpd.conf,我们浏览httpd.conf文件,搜索关键字vhost,发现根本找不到相关的东西,不过在最后两行有以下内容:
#Loadconfigfilesinthe"/etc/httpd/conf.d"directory,ifany. IncludeOptionalconf.d/*.conf难道虚拟主机的配置也在/etc/httpd/conf.d下面?LZ去看了一下该目录下面所有文件的内容,发现根本没有关于虚拟主机的配置,如果你再仔细观察http.conf配置文件,你就会发现,其实在Centos下,其默认主机只有localhost==>/var/www/html,如果需要的话,我们得自己扩展了。
我们有两种方式实现自己的扩展,一种是直接在/etc/httpd/conf/httpd.conf后面追加配置内容,一种是在外部文件先配置好,再类似IncludeOptionalconf.d/*.conf那样引入我们的配置。一般不推荐直接修改主配置文件,所以我们使用第二种方式。
我们还是模仿上面的配置:
第一步:新增站点配置文件
cd/etc/httpd sudomkdirvhost-conf.d我们在vhost-conf.d目录下新增我们的虚拟主机配置文件www-jb51-net.conf和www-wordpress-com.conf,以www-jb51-net.conf为例,我们输入以下内容:
#Createdbyzhongjinon2016-12-21冬至 Serveradminjb51@jb51.com ServerNamewww.nhooo.com DocumentRoot/home/www/jb51 OptionsFollowSymLinks AllowOverrideAll #Requirealldenied Requireallgranted 针对www-wordpress-com.conf改变相应的配置,即修改ServerName为www.wordpress.com,DocumentRoot和Directory修改为/home/www/wordpress。
第二步:在主配置中引入我们的虚拟主机配置
sudovim/etc/httpd/conf/httpd.conf #在主配置文件末尾添加以下内容 #Loadvhost-configfilesinthe"/etc/httpd/vhost-conf.d"directoryifany #createdbyzhongjinon2016-12-21冬至 Includevhost-conf.d/*.conf第三步:在对应目录放入项目代码
直接参考Ubnutu环境下的第三步配置。
第四步:修改/etc/hosts文件
直接参考Ubnutu环境下的第四步配置。
第五步:重启apache服务器并测试
重启apache服务器使得配置生效:
sudosystemctlrestarthttpd.service在浏览器(如果是桌面版的话)中访问www.nhooo.com或www.wordpress.com,看看是否输出了index.php文件中的内容。
如果你不是桌面版(服务器),那么可以使用命令行测试:
curlwww.nhooo.com看看返回的字符串是不是正确输出!
注意:
在Centos下,由于默认的虚拟主机配置(localhost)是直接在/etc/httpd/conf/httpd.conf文件中配置的,所以我们在后面添加我们的配置的时候,会覆盖前面的相同的配置,所以当你curllocalhost的时候,可能访问的是jb51项目下的代码,也可能是wordpress下的代码。
我的解决方案是:按照上面的步骤重新建一个localhost域名,使它指向/var/www/html目录即可。
二、同域名下,通过访问不同的端口获得不同的站点
其实在这里实现的步骤跟上面的没多大差别,我就说说需要做的额外操作。
这里以jb51为例,通过访问www.nhooo.com:80(默认就是80),返回的是“hello,welcometojb51“,而访问www.nhooo.com:8080,返回的是”hello,welcometojb51backgroundmanagement“。
Ubuntu环境下:
让我们的apache2监听8080端口:
修改/etc/apache2/ports.conf文件,在Listen80后面添加两行:
NameVirtualHost*:8080 Listen8080在/etc/apache2/sites-available/下增加 www-jb51-net-8080.conf,并在/etc/apache2/sites-enabled/下建立符号链接。方法参考前面。
www-jb51-net-8080.conf的主要配置内容如下:
#Createdbyzhongjinon2016-12-21冬至 Serveradmin1054840542@qq.com ServerNamewww.nhooo.com DocumentRoot/home/www/jb51_admin OptionsFollowSymLinks AllowOverrideAll #Requirealldenied Requireallgranted 大家一定要看清楚需要修改的地方,VirtualHost改为8080,DocumentRoot和Directory均改为/home/www/jb51_admin,但是ServerName不用改,还是用www.nhooo.com
创建目录/home/www/jb51_admin,添加文件index.php,输出“hello,welcometojb51backgroundmanagement”。
重启apache服务器,测试
CentOS环境下:
让httpd监听8080端口:
直接修改/etc/httpd/conf/httpd.conf配置文件,在Listen80后面添加两行:
#createdbyzhongjinon2016-12-21冬至 NameVirtualHost*:8080 Listen8080在/etc/httpd/vhost-conf.d下面添加www-jb51-net-8080.conf
直接复制www-jb51-net.conf文件,改名为www-jb51-net-8080.conf,并修改为:
#Createdbyzhongjinon2016-12-21冬至 Serveradmin1054840542@qq.com ServerNamewww.nhooo.com DocumentRoot/home/www/jb51_admin OptionsFollowSymLinks AllowOverrideAll #Requirealldenied Requireallgranted 注意修改的地方!
创建目录/home/www/jb51_admin,添加文件index.php,输出“hello,welcometojb51backgroundmanagement”。
重启apache服务器,测试
后话:
多站点的配置还有另外一种配置,就是通过不同的IP进行多站点的配置,由于我没有进行实验(前面的内容都是LZ亲身体会过),所以这里就不给出方法了。