我使用非常简单的/etc/apache2/sites-enabled/000-default
配置,例如
<VirtualHost 117.121.241.184>
UseCanonicalName Off
VirtualDocumentRoot /srv/www/%0
Options All ExecCGI
LogFormat "%V %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_common
CustomLog /var/log/apache2/access.log vhost_common
</VirtualHost>
其中 117.121.241.184 是我正在设置的机器的 IP。
现在我想做一些稍微复杂的事情,即代理一个 NodeJS 实例,如下所示:
<VirtualHost foobar.example.com:80>
<Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</Location>
</VirtualHost>
但它不起作用。Apache 只提供/srv/www/foobar.example.com
。如果我将“VirtualHost foobar.example.com”节多于这虚拟文档根一,那么所有内容都会重定向到代理,这是我不想要的。
我只想让代理处理特定域“foobar.example.com”,其他的都由VirtualDocumentRoot处理。
答案1
您要配置的是基于名称的虚拟主机,其中虚拟主机是根据Host
客户端在 HTTP 请求中发送的标头来选择的。
为此,您需要一个NameVirtualHost
指令,并使您的<VirtualHost>
块与您在其中配置的内容完全匹配。例如:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName default
VirtualDocumentRoot /srv/www/%0
# other needed config directives here
</VirtualHost>
<VirtualHost *:80>
ServerName foobar.example.com
<Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</Location>
</VirtualHost>