Apache + Node.js + mod_proxy。如何将一个域路由到:3000,将另一个域路由到:80
Posted
技术标签:
【中文标题】Apache + Node.js + mod_proxy。如何将一个域路由到:3000,将另一个域路由到:80【英文标题】:Apache + Node.js + mod_proxy. How to route one domain to :3000 and another to :80 【发布时间】:2012-12-24 22:09:05 【问题描述】:问题:我需要在不同域的同一台服务器上托管一个节点应用程序和一个 php 应用程序。
example.com 应该正常使用端口 80,但 node-example.com 应该路由到端口 3000。
使用 mod_proxy 将所有流量从端口 80 路由到 3000 可以正常工作,因此:
<VirtualHost *:80>
ServerAdmin info@node-example.com
ServerName node-example.com
ServerAlias www.node-example.com
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</Location>
</VirtualHost>
然而,这使得 example.com 和 node-example.com 都指向 localhost:3000 并运行 Node-app。
有没有办法让 example.com 指向端口 80?
example.com/old-admin 也可以指向端口 80。
【问题讨论】:
【参考方案1】:我建议您为两个域创建两个不同的虚拟主机配置文件。除了在缩放不同时将它们移动到不同的服务器之外,这将使您能够独立配置它们。
对于默认安装位置的apache2,
在 /etc/apache2/sites-available/www.example1.com.conf 中创建一个文件
<VirtualHost *:80>
ServerName www.example1.com
ServerAdmin webmaster@example1.com
<Directory /home/example1/api/admin/docs>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
DirectoryIndex index.html
</Directory>
<Directory /home/example1/api/mobile/docs>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
DirectoryIndex index.html
</Directory>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /api/ "http://localhost:30007/"
ProxyPassReverse / "http://localhost:30007/"
ErrorLog $APACHE_LOG_DIR/example1/example1.log
CustomLog $APACHE_LOG_DIR/example1/example1.log combined
</VirtualHost>
在sites-available
中创建另一个文件www.example2.com.conf
并复制上述配置,将example1 替换为example2。
对于子域,将文件名和内部配置中的www
替换为您的子域,例如:api
。
一旦你创建了 conf 文件,你必须使用命令来启用它们
a2ensite www.example1.com.conf
然后用命令重新加载 apache2
sudo systemctl reload apache2
确保在重新加载 apache 之前已在 APACHE_LOG_DIR 中创建了目录 example1
和 example2
。
就是这样。在您的域名注册商或 CDN 中使用服务器 IP 地址配置您的域的 A 记录,无论您使用什么,都应该一切顺利。
【讨论】:
【参考方案2】:只需制作两个<VirtualHost *:80>
标签
<VirtualHost *:80>
ServerAdmin info@node-example.com
ServerName www.node-example.com
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://localhost:3000/
ProxyPassReverse http://localhost:3000/
</Location>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin info@node-example.com
ServerName node-example.com
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
<Location />
ProxyPass http://localhost:80/
ProxyPassReverse http://localhost:80/
</Location>
</VirtualHost>
它应该这样工作;)
或者,如果您的 localhost:80
应用程序不是节点,您可以删除该目标的 <Proxy *>
和 <Location />
标记并将其替换为 DocumentRoot /var/www/node-example.com
- 您的 index.html 的静态路径
【讨论】:
我之前尝试过使用两个虚拟主机标签,但它不起作用......原来我忘记设置“NameVirtualHost *”。不过感谢您的回答! 哇!你把我从 iptables 和它的隐形规则中救了出来 :) 效果很好。 tnx 伴侣。 如果仍然无法正常工作,请确保您已在 apache 配置中启用mod_proxy
和 mod_proxy_http
并重新启动服务器。
@dinchev 我是否需要将“ProxyRequests off”添加到我所有的 apache 站点文件中?
来自docs :如果您使用转发代理(使用 ProxyRequests 指令),则严格限制访问是必不可少的。否则,任何客户端都可以使用您的服务器访问任意主机,同时隐藏其真实身份。这对您的网络和整个 Internet 都是危险的。使用反向代理时(使用 ProxyPass 指令并关闭 ProxyRequests),访问控制不太重要,因为客户端只能联系您专门配置的主机。以上是关于Apache + Node.js + mod_proxy。如何将一个域路由到:3000,将另一个域路由到:80的主要内容,如果未能解决你的问题,请参考以下文章