【问题标题】:Symfony - name based virtual servers on localhost - is this possible?Symfony - 本地主机上基于名称的虚拟服务器 - 这可能吗?
【发布时间】:2011-03-17 13:04:16
【问题描述】:

我很快得出结论,这是不可行的,尽管出于某种原因,人们 - 很可能没有实施他们给出的“建议”,似乎认为这是可能的。

场景非常简单。我正在本地开发机器上开发 symfony 网站,运行 Ubuntu 10.0.4 LTS。我希望能够在本地运行和测试多个站点。

假设我有以下网站:

  • site1.localhost
  • site2.localhost
  • site3.localhost

按照文档hereherehere(这些都不适合我),我做了以下事情:

A.我修改了我的 /etc/hosts 文件,第一个条目是:

127.0.0.1 site1.localhost site2.localhost hpdtp-ubuntu910 本地主机 php.localhost

B. 我修改了我的 /etc/apache2/ports.conf 文件(第一行)如下:

NameVirtualHost localhost:80 Listen 80

C. 我为每个网站(site1.localhost 和site2.localhost)创建了配置站点。每个配置都是 /etc/apache2/sites-available 中的一个单独文件

/etc/apache2/sites-available/site1 中的一个这样的配置文件(用于 site1.localhost)如下所示:

<VirtualHost localhost:80>
  ServerName site1.localhost
  DocumentRoot "/home/morpheous/work/webdev/frameworks/symfony/sites/site1/web"
  DirectoryIndex index.php

  <Directory "/home/morpheous/work/webdev/frameworks/symfony/sites/site1/web">
   AllowOverride All
   Allow from All
  </Directory>

  Alias /sf /lib/vendor/symfony/symfony-1.3.6/data/web/sf
  <Directory "/lib/vendor/symfony/symfony-1.3.6/data/web/sf">
      AllowOverride All
      Allow from All
  </Directory>

</VirtualHost>

D.我已经禁用了默认的 apache 站点(而是一直显示)

E. 因为我无法启用我启用的所有网站(如上面的文档链接) purport),我已经决定一次启用一个站点,这样 Apache 就不会对运行哪个站点感到困惑。当我需要运行另一个站点时,我会禁用当前站点并启用我想要的站点。这(显然?)远非理想 - 但即使是这种设置也无法正常工作 - 原因如下。

我)。当我重新启动 Apache 时,我收到以下警告:

  • 重新加载 web 服务器配置 apache2 [2010 年 7 月 18 日星期日 10:32:23] [警告] NameVirtualHost localhost:80 没有 虚拟主机

ii)。当我导航到http://site1.localhost 我在 FF 中收到以下错误消息:

哎呀!此链接似乎已损坏

iii)。我的 apache 相关错误出现在 /var/log/apachche2/other_vosts.log

morpheous@hpdtp-ubuntu910:~$ tail /var/log/apache2/other_vhosts_access.log
site1.localhost:80 127.0.0.1 - - [18/Jul/2010:10:08:38 +0100] "GET / HTTP/1.1" 404 506 "-" "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.1"
site1.localhost:80 127.0.0.1 - - [18/Jul/2010:10:09:30 +0100] "GET / HTTP/1.1" 404 506 "-" "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.1"
site1.localhost:80 127.0.0.1 - - [18/Jul/2010:10:09:31 +0100] "GET /favicon.ico HTTP/1.1" 404 505 "-" "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.1"
site1.localhost:80 127.0.0.1 - - [18/Jul/2010:10:09:36 +0100] "GET /favicon.ico HTTP/1.1" 404 505 "-" "Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.6) Gecko/20100628 Ubuntu/10.04 (lucid) Firefox/3.6.6 GTB7.1"

我的问题是:

  1. 可以设置 Apache 来处理 localhost 上的多个虚拟主机吗?毕竟,到目前为止,我看到的所有示例都涉及使用面向公众的 IP 地址设置 Apache

  2. 如果 Apache 确实可以处理 localhost 上的多个站点,那么上述哪些步骤我做错了? AFAICT,我已按照文档进行操作。

【问题讨论】:

  • 消息“NameVirtualHost localhost:80 has no VirtualHosts”可能是您的配置中具有相同的 NameVirtualHost 指令的结果。这也可能是之前拥有更通用的“NameVirtualHost localhost”(没有端口)的结果。请在您的配置中查找 /all/ NameVirtualHost 的出现。您的 localhost 是否解析到多个 IP,例如IPv4 地址和 IPv6 地址?尝试将“NameVirtualHost 127.0.0.1:80”与“”结合使用(Apache 文档已经表明使用 IP 地址优于主机名)。
  • +1 详细解释问题

标签: apache ubuntu symfony1


【解决方案1】:

是的,您可以在本地计算机上拥有多个虚拟主机——这与在远程服务器上工作时完全相同,只是 IP 地址和域名不同。

我通常做的是:

编辑主机文件

添加我希望从本地计算机提供的新域名。

例如,我会添加:

127.0.0.1       tests
127.0.0.1       blog

以此类推,我想要的每个域名都用一行。


将新的 VirtualHosts 添加到 Apache 的配置中

然后,我将新的 VirtualHosts 添加到 Apache 的配置中。

第一个站点:测试


例如,对于我的tests 域名,我会使用:

<VirtualHost *:80>
        ServerName tests
        DocumentRoot /home/squale/developpement/tests
        <Directory /home/squale/developpement/tests>
                AllowOverride All
                Options Indexes FollowSymLinks MultiViews
                allow from all
        </Directory>
        ErrorLog /var/log/apache2/error.log
</VirtualHost>

这里有几点需要注意:

  • VirtualHost 位于*:80
    • 所以,它会监听任何地址
  • 到域名的映射是由ServerName 指令完成的


当然,由你来确保这个 VirtualHost 被 Apache 看到——或者通过将它的配置放在一个加载的文件中(不推荐),或者通过:

  • 将该配置放在/etc/apache2/sites-available/ 的新文件中
  • 使用a2ensite 启用站点
    • 这将在/etc/apache2/sites-enabled/ 中创建一个符号链接,指向您的新配置文件。


第二个站点:博客

这里是我用于第二个域名的配置,对应于blog

<VirtualHost *:80>
        ServerName blog
        DocumentRoot /home/squale/developpement/blog.pascal-martin.fr/www
        <Directory /home/squale/developpement/blog.pascal-martin.fr/www>
                AllowOverride All
                Options Indexes FollowSymLinks MultiViews
                allow from all
        </Directory>
        ErrorLog /var/log/apache2/error.log
</VirtualHost>

基本上是一模一样的;只有两个区别:

  • ServerName 指令对应于我的第二个域名 -- 当然
  • DocumentRoot不一样


其他文件?

我并没有真正改变 Apache 的默认配置的任何其他内容(我在 Ubuntu 上,如果这很重要的话)

例如,我没有更改 ports.conf 文件中的任何内容:我仍然有默认的 NameVirtualHostListen 指令:

NameVirtualHost *:80
Listen 80

我所做的唯一重要修改是启用某些模块,例如重写,过期,...但这与您的 VirtualHosts 问题没有太大关系 ;-)


结果?

如果我打开浏览器并转到 http://tests/,我会从我的 tests 域中得到我期望的东西——这里是目录和文件列表。

如果我打开浏览器并转到http://blog/,我会得到我博客的开发实例——嗯,还有错误页面,说我忘了设置数据库^^

【讨论】:

  • @pascal:根据您的回复,Apache 可以处理多个站点,但是您提供了一个 /etc/hosts 示例,只有一个站点(测试)。就我而言,我正在“映射”(如果那是正确的词)site1.localhost、site2.localhost、localhost 等到 127.0.0.1(因此有多个站点)。我认为 Apache 对映射到 127.0.0.1 的多个站点感到困惑。此外,(除了监听网络上的所有 IP 地址),您的虚拟主机配置和我的唯一区别是“Options Indexes FollowSymLinks MultiViews”行。我想知道这是否导致错误?
  • @pascal:你没有提到我对 /etc/apache2/ports.conf 所做的编辑。我需要删除那个编辑还是可以?
  • @morpheus :我已经编辑了我的答案以显示第二个网站的配置;;; Apache 不会被映射到 127.0.0.1 的多个站点所迷惑:这非常有效 ;-) ;;;你的虚拟主机配置和我的至少还有另一个区别:你有&lt;VirtualHost localhost:80&gt;,我有&lt;VirtualHost *:80&gt; ;;;我认为我没有修改 ports.conf 中的任何内容。
  • @pascal:+1 帮助我摆脱恼人的 Apache 警告。我按照您的说明更改了虚拟主机 IP 以匹配所有 IP 地址并修复了该 Apache 警告。现在剩下的就是能够在我的浏览器中导航到site1.localhost(目前无法使用)。我注意到您已经编辑了答案以显示如何添加多个主机。我会试试的。如果可以,我会接受您的回答作为最终解决方案。
  • @pascal:我将 /etc/hosts 中的条目从我使用的“单行”语法更改为您使用的多行语法(即每个站点在单独的行上) -但这仍然不起作用:(当我转到 site1.localhost 时,我仍然在 FF 中收到错误消息:“糟糕,此链接似乎已损坏” - 我的错误仍在 /var/log/apache2/other_vhosts 中报告.log .... :(
【解决方案2】:

您是否创建了从 /etc/apache2/sites-available/site1/etc/apache2/sites-enabled/site1 的链接?

我使用的是 nginx 而不是 apache,但 ubuntu 有标准化的配置方式。通常 sites-available 包括你所有的配置,这些配置不包含在 apache 中。它只查找在启用站点的目录中链接的配置。

我也不认为您需要一次启用一个站点。一切都应该工作。都有不同的域名。

【讨论】:

  • 对于 Ubuntu,当脚本 a2ensite 和 a2dissite(分别启用/禁用)运行时,符号链接会自动创建/销毁。这就是我启用/禁用网站的意思。
猜你喜欢
  • 2012-01-22
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 2013-03-16
  • 1970-01-01
  • 2018-08-24
  • 2014-08-07
相关资源
最近更新 更多