前两个虚拟主机按预期工作。第二个虚拟主机代理一个 Odoo 服务器。我想从我的辅助域到我的 Odoo 服务器再创建一个代理。但是,Odoo 必须接收与数据库匹配的子域,否则它将无法为其提供服务。
这是我现在的代码:
# static homepage
<VirtualHost *:80>
ServerName mydomain.fr
ServerAlias www.mydomain.fr
DocumentRoot /var/www/odoo
</VirtualHost>
# wildcard proxy for odoo:
# one subdomain -> one database
<VirtualHost *:80>
ServerName mydomain.fr
ServerAlias *.mydomain.fr
ErrorLog /var/log/odoo/odoo-error.log
CustomLog /var/log/odoo/odoo-access.log combined
LogLevel warn
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPass / http://mydomain.fr:8089/
ProxyPassReverse / http://mydomain.fr:8089/
ProxyVia On
</VirtualHost>
# a secondary domain
# should point to a specific database
<VirtualHost *:80>
ServerName www.secondary-domain.com
ServerAlias secondary-domain.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://some_database.mydomain.fr
ProxyPassReverse / http://some_database.mydomain.fr
ProxyVia On
</VirtualHost>
################
# restrictions #
################
<Location /web/database>
Order deny,allow
Deny from all
Allow from x.x.x.x
</Location>
我并不是特别了解服务器管理,所以我了解的也不多(即使阅读了文档之后)。
忘记提及我得到的答复:
secondary-domain.com
出现 502 代理错误some_database.mydomain.fr
按预期工作
如果我将第三个<VirtualHost/>
块放在第二个位置,整个网站 mydomain.fr 就会滞后,而且这并不能解决我的二级域名的 502 代理错误。
如果我引用该ProxyPreserveHost
指令,将secondary-domain.com
导致secondary-domain.com, some_database.mydomain.fr
...这里发生了什么?
我需要确认这可以完成并且我的设置正在执行此操作:
- 用户要求
secondary-domain.com
- 第三个 vhost 条目将请求代理到
some_database.mydomain.fr
- 第二个 vhost 条目将请求代理到
mydomain.fr:8069
答案1
前两个虚拟主机按预期工作。
有点。它们共享相同的 ServerName,这没有意义,因为 vhost 的独特之处在于端口+服务器名称的组合。
Apache 在收到http://mydomain.fr或者http://www.mydomain.fr/。对于所有其他 *.mydomain.fr,它将使用第二个虚拟主机。我想这正是您想要的,但它写得不太好,而且容易出现诊断错误。
但是,Odoo 必须接收与数据库匹配的子域,否则它将无法为其提供服务。
这就是“ProxyPreserveHost On”的目的,它将 HTTP 客户端使用的名称传递给反向代理后面的应用程序。在您的第二个虚拟主机中使用它。
你的第三个虚拟主机看起来不错(它做有“ProxyPreserveHost On”)。