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 中创建了目录 example1example2

就是这样。在您的域名注册商或 CDN 中使用服务器 IP 地址配置您的域的 A 记录,无论您使用什么,都应该一切顺利。

【讨论】:

【参考方案2】:

只需制作两个&lt;VirtualHost *:80&gt; 标签

<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 应用程序不是节点,您可以删除该目标的 &lt;Proxy *&gt;&lt;Location /&gt; 标记并将其替换为 DocumentRoot /var/www/node-example.com - 您的 index.html 的静态路径

【讨论】:

我之前尝试过使用两个虚拟主机标签,但它不起作用......原来我忘记设置“NameVirtualHost *”。不过感谢您的回答! 哇!你把我从 iptables 和它的隐形规则中救了出来 :) 效果很好。 tnx 伴侣。 如果仍然无法正常工作,请确保您已在 apache 配置中启用 mod_proxymod_proxy_http 并重新启动服务器。 @dinchev 我是否需要将“ProxyRequests off”添加到我所有的 apache 站点文件中? 来自docs :如果您使用转发代理(使用 ProxyRequests 指令),则严格限制访问是必不可少的。否则,任何客户端都可以使用您的服务器访问任意主机,同时隐藏其真实身份。这对您的网络和整个 Internet 都是危险的。使用反向代理时(使用 ProxyPass 指令并关闭 ProxyRequests),访问控制不太重要,因为客户端只能联系您专门配置的主机。

以上是关于Apache + Node.js + mod_proxy。如何将一个域路由到:3000,将另一个域路由到:80的主要内容,如果未能解决你的问题,请参考以下文章

与 Apache 相比,Node.js 的性能如何?

Node.js 比 Apache 慢

我可以用 Node.js 替换 Apache 吗?

Node.js + Socket.io + Apache

是啥让 Node.js 比 Apache 更具可扩展性?

如何将 Node.js 服务器连接到 Apache 服务器?