再次编辑:我认为在我的 ubuntu 操作系统(个人版)上安装 apache2 可以让我在内部“托管”网站,而无需上网。我现在意识到“有效”的两个域名实际上是注册域名,另外两个是我打算在上线后注册的名称。但是断开与互联网的连接甚至会使前两个域名无法工作 - 尽管我知道它们正在从 localhost.mysitename.com 提取文件。这是怎么回事?我现在正在阅读 etc/host 和 etc/host.conf 以及 etc/nsswitch.conf - 我的方向正确吗?
我重写了这个问题并添加了更多信息。问题仍然存在。谢谢:
你到底如何才能彻底阅读 Apache 文档vHost 配置,尝试了几乎所有的方法,但仍然会出现初始情况,即前两个 vHost 和目录运行良好,但之后的每个都出现问题。“错误请求”,“未找到服务器”。
这是基本 vHost 文件(位于 /etc/apache2/sites-available 中),复制了 4 次,只有“mysitename1”发生变化,其 DocumentRoot 和 Directory 也发生了变化。顺便说一句,此版本使用的是本地主机 IP(127.0.0.1),但我使用了 *:80,结果完全相同。
<VirtualHost 127.0.0.1>
ServerAdmin [email protected]
ServerName localhost.mysitename1.com
DocumentRoot /home/folder/folder/folder/folder
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /home/folder/folder/folder/folder>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog "path to this site's error.log"
LogLevel warn
CustomLog "path to this site's access.log"
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
ports.conf 里面的内容如下:(我以 *:80 而不是 127.0.0.1 开始) - 结果与上面描述相同:
Listen 80
NameVirtualHost 127.0.0.1
我对文档中的这句话感到疑惑:“您可以将条目放入主机文件中以进行本地测试,但这只能在具有这些主机条目的机器上进行。”这就是我所要做的,本质上是一个开发环境,我可以在本地处理多个站点。我找不到这个“hosts”文件,但我想知道我是否输入了我的前两个域名(很久以前)并忘记了我是怎么做的。??
谢谢你的帮助。
答案1
答案就在 /etc/hosts 文件中。要发现名称的 IP 地址,系统 DNS 解析器将(应该)首先在 /etc/hosts 文件中查找 name=ip,如果没有,则进行 DNS 搜索。阅读“man hosts”以查看 hosts 文件的语法。为所有域(最好不是 FQDN)分配本地主机的 IP 地址(127.0.0.1)示例:
127.0.0.1 localhost.exmaplesite1.com
127.0.0.1 localhost.exmaplesite2.com
在 VirtualHost 指令中使用 localhost.examplesite1.com 和 localhost.examplesite2.com 作为 ServerName。有关其他设置和语法,请参阅文档链接。@Antonious 未记录 Apache2 中对单一通配符的使用 - 但他不明白我试图通过本地主机环回强制某些名称,以便我可以离线开发 Web 应用程序。我从来不明白 @lynxman 的假设,即“错误请求”或“未找到服务器”错误可以写入错误日志 - 尽管我无论如何都为每个 VirtualHost 指令使用单独的日志文件。
顺便说一句:“sudo host localhost.examplesite.com”将打印出该站点的 IP 地址(如果“examplesite.com”是实际站点)。显然,“sudo host”命令不会查找 /etc/hosts 设置和对 IP 的影响。<-- 是的,我知道,这让我很倒霉。
干杯!
答案2
您可以在 apache 中托管任意数量的虚拟主机,这看起来主机名要么非常相似,要么重叠,在 apache 中创建虚拟主机时,请确保
- 当使用基于 DNS 的虚拟主机时,你总是会有一个
NameVirtualHost
针对你服务的 IP 和端口的指令 - 确保虚拟主机名不冲突,您可以随时通过添加
%V
到日志格式(以便显示哪个域正在访问)或在每个 VH 中都有一个文件声明它是谁来检查您正在访问哪一个
答案3
我将与您分享我的工作配置。
确保已链接虚拟主机已启用站点. Apache 执行每个已启用站点按字母数字顺序保存文件,因此将默认网站命名为0000-默认因此它将首先执行。这是虚拟主机失败时用户应该看到的站点。我的站点如下所示:
NameVirtualHost *
<VirtualHost *>
ServerAdmin [email protected]
DocumentRoot /var/www/0000-default-site
<Directory />
Options FollowSymLinks
#AllowOveride set to All for mod rewrite (default None)
AllowOverride All
</Directory>
<Directory /var/www/0000-default-site>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
# Uncomment this directive is you want to see apache2's
# default start page (in /apache2-default) when you go to /
#RedirectMatch ^/$ /apache2-default/
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel info
CustomLog /var/log/apache2/access.log combined
ServerSignature On
</VirtualHost>
注意 *NameVirtualHost ** 指令。这必须是虚拟配置中的第一个指令。因此,你将其放在0000-默认并确保没有其他操作被首先执行。
接下来命名您的第一个虚拟主机0010-您的域名和你的第二个0020-另一个.名称。这是我的虚拟外观(注意它们与默认值略有不同):
<VirtualHost *>
ServerName www.lickmyquads.net
ServerAlias lickmyquads.net
ServerAdmin [email protected]
DocumentRoot /var/www/lickmyquads.net/www/docroot
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/lickmyquads.net/www/docroot>
Options FollowSymLinks
AllowOverride None
Order allow,deny
allow from all
</Directory>
#ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
#<Directory "/usr/lib/cgi-bin">
# AllowOverride None
# Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
# Order allow,deny
# Allow from all
#</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel info
CustomLog /var/log/apache2/access.log combined
ServerSignature On
#Custom Error
#ErrorDocument 404 /app/404.php
#ErrorDocument 404;2 /app/404.php
#ErrorDocument 404;3 /app/404.php
</VirtualHost>
希望这个示例能帮你解决问题。如果没有,请尝试运行apache2ctl 配置测试命令来帮助查找配置中的任何语法错误。
答案4
如果您有多个客户端并且不想维护单独的主机文件,则可以设置分割水平 DNS 服务器。
http://en.wikipedia.org/wiki/Split-horizon_DNS
这并不像听起来那么难,而且拥有本地缓存 DNS 服务器有很多优势。