如何在Apache服务器上运行Node.js应用程序

7
我想通过子域名在Apache服务器上运行我的Node.js应用程序。我在cpanel中创建了主域名的子域名。我的项目有三个以上的子域名,并且所有子域名都指向不同的Node.js应用程序。子域名将我重定向到正确的文件夹,但是当我通过浏览器的子域名运行应用程序时,它不会在Apache服务器上运行Node应用程序。它只显示项目的文件夹列表。
我参考以下链接作为参考:

http://www.codingtricks.biz/run-nodejs-application-apache/

如何在Apache中运行Node.js?

项目目录:

/home/abc/public_html/node

我的主要域名是:

https://www.example.com

我在 cpanel 中创建了子域名:

https://www.node.example.com

我在浏览器中访问子域:

node.example.com

我在Softlayer服务器上部署了我的应用程序。

以下是Apache配置:

文件:

/usr/local/apache/conf/includes/abc_node.conf

配置:

<VirtualHost 132.159.25.21:80>
   ServerAdmin info@example.com
   ServerName node.example.com
   ServerAlias www.node.example.com

   DocumentRoot /home/abc/public_html
   <Directory /home/abc/public_html/node>
      Options -Indexes +FollowSymLinks
      AllowOverride None
      Require all granted
   </Directory>

   ProxyRequests Off
   ProxyPreserveHost On
   ProxyVia Full
   <Proxy *>
      Require all granted
   </Proxy>

   <Location /node>
      ProxyPass http://132.159.25.21:8080
      ProxyPassReverse http://132.159.25.21:8080
   </Location>

   ErrorLog /home/abc/public_html/node/error.log

   # Possible values include: debug, info, notice, warn, error, crit,
   # alert, emerg.
   LogLevel warn

   CustomLog /home/abc/public_html/node/access.log combined

</VirtualHost>

命令概要:

命令:

/usr/local/apache/bin/httpd -tD DUMP_VHOSTS

输出:

AH00548: NameVirtualHost has no effect and will be removed in the next release /usr/local/apache/conf/httpd.conf:445
VirtualHost configuration:
127.0.0.1:80           wb01-development.example.com (/usr/local/apache/conf/httpd.conf:504)
127.0.0.1:443          wb01-development.example.com (/usr/local/apache/conf/httpd.conf:554)
132.159.25.21:443      is a NameVirtualHost
         default server example.com (/usr/local/apache/conf/httpd.conf:368)
         port 443 namevhost example.com (/usr/local/apache/conf/httpd.conf:368)
                 alias www.example.com
         port 443 namevhost wb01-development.example.com (/usr/local/apache/conf/httpd.conf:554)
                 wild alias cpanel.*
                 wild alias whm.*
                 wild alias webmail.*
                 wild alias webdisk.*
                 wild alias cpcalendars.*
                 wild alias cpcontacts.*
132.159.25.21:80       is a NameVirtualHost
         default server 132.159.25.21 (/usr/local/apache/conf/httpd.conf:274)
         port 80 namevhost 132.159.25.21 (/usr/local/apache/conf/httpd.conf:274)
         port 80 namevhost example.com (/usr/local/apache/conf/httpd.conf:297)
                 alias www.example.com
         port 80 namevhost node.example.com (/usr/local/apache/conf/httpd.conf:446)
                 alias www.node.example.com
         port 80 namevhost wb01-development.example.com (/usr/local/apache/conf/httpd.conf:504)
                 wild alias cpanel.*
                 wild alias whm.*
                 wild alias webmail.*
                 wild alias webdisk.*
                 wild alias cpcalendars.*
                 wild alias cpcontacts.*
         port 80 namevhost node.example.com (/usr/local/apache/conf/includes/abc_node.conf:1)
                 alias www.node.example.com
*:*                    wb01-development.example.com (/usr/local/apache/conf/httpd.conf:286)

命令

/usr/local/apache/bin/httpd -tD DUMP_MODULES

输出:

AH00548: NameVirtualHost has no effect and will be removed in the next release /usr/local/apache/conf/httpd.conf:445
Loaded Modules:
    core_module (static)
    authn_file_module (static)
    authn_core_module (static)
    authz_host_module (static)
    authz_groupfile_module (static)
    authz_user_module (static)
    authz_core_module (static)
    access_compat_module (static)
    auth_basic_module (static)
    socache_shmcb_module (static)
    socache_dbm_module (static)
    so_module (static)
    include_module (static)
    filter_module (static)
    deflate_module (static)
    http_module (static)
    mime_module (static)
    log_config_module (static)
    logio_module (static)
    env_module (static)
    expires_module (static)
    headers_module (static)
    unique_id_module (static)
    setenvif_module (static)
    version_module (static)
    proxy_module (static)
    proxy_connect_module (static)
    proxy_http_module (static)
    slotmem_shm_module (static)
    ssl_module (static)
    mpm_prefork_module (static)
    unixd_module (static)
    status_module (static)
    autoindex_module (static)
    asis_module (static)
    suexec_module (static)
    cgi_module (static)
    negotiation_module (static)
    dir_module (static)
    actions_module (static)
    userdir_module (static)
    alias_module (static)
    rewrite_module (static)
    bwlimited_module (shared)
    suphp_module (shared)
    security2_module (shared)

我用以下IP地址和端口运行我的Node.js应用程序。

132.159.25.21:3030

我在nodejs应用程序中定义了以下端口

var port = parseInt(process.env.PORT, 3030) || 8080;

参考此错误:AH00548: NameVirtualHost无效,将在下一个版本中删除/usr/local/apache/conf/httpd.conf:445 编写了以下代码。 NameVirtualHost 132.159.25.21:80

我将我的虚拟主机文件放在/usr/local/apache/conf/httpd.conf文件的末尾,因为文件中写有警告:“# DO NOT EDIT. AUTOMATICALLY GENERATED. IF YOU NEED TO MAKE A CHANGE PLEASE USE THE INCLUDE FILES。”

我需要帮助解决这个问题。如果您需要进一步了解应用程序,请告诉我。


parseInt(process.env.PORT, 3030) 的第二个参数是基数。 - vp_arth
嗯,是的...但这不是参数问题。 - Dipak
你说你正在132.159.25.21:3030上运行你的节点,但是代理到132.159.25.21:8080 - Johannes Merz
@JohannesMerz:我已经按照所有方法进行了尝试。希望您可以非常仔细地阅读我的问题,并查看附加链接。无论是端口8080还是端口3030,我都尝试过,但它都无法工作。这就是为什么我在这里描述了我的完整配置。 - Dipak
1个回答

13
配置看起来正确,但有一个问题,/node位置路径应该具有匹配斜杠的目标,以便在反向代理时正常工作且不会产生意外后果:
出于清晰明了的考虑,我更愿意这样定义:
ProxyPass /node/ http://132.159.25.21:8080/
ProxyPassReverse /node/ http://132.159.25.21:8080/

当使用目标 http://132.159.25.21:8080 进行代理时,应该注意定义为 http://132.159.25.21:8080/ ,并且源应以相同方式匹配斜杠,因此 / node / 是正确的方法。

至于 "NameVirtualHost" 警告。 它只是告诉您,在 Apache HTTPD 2.4.X 版本中不再需要该指令,因为 2.2 需要该指令,而 2.4 在检测到命名虚拟主机方面变得“更聪明”。

附注:<Proxy * > 没有任何效果,因此定义它是徒劳的。 Proxy * 用于正向代理,显然您不希望这样做,并使用 ProxyRequests off 禁用了这种功能。 因此也要将其删除。

--- 根据您的评论进行的答案扩展:

要访问节点,您需要访问:

http://node.example.com/node/

或者添加一个“默认”重定向,将您带到该网页。例如:

RedirectMatch ^/$ /node/

您通过访问node.example.com获取索引(文件列表),因为子目录中定义了-Indexes,这意味着先前的目录已启用Indexes,因此请定义:

<Directory /home/abc/public_html>
    Options -Indexes +FollowSymLinks
    ....

在这种情况下,不要定义 /home/abc/public_html/node,因为 node/ 不是目录,而是后端中的虚拟路径,所以在修正 shake 中,它永远不应该包含在目录路径中。

如果只想在访问 http://node.example.com/ 时访问后端,请改用此选项替代 ProxyPass /node/:

ProxyPass / http://132.159.25.21:8080/
ProxyPassReverse / http://132.159.25.21:8080/

首先感谢您给我提供了一些有用的回复。我已经删除了<proxy *>并添加了ProxyPass和ProxyPassReverse,但没有使用<location>标签。它仍然无法正常工作,当我在浏览器中添加url node.example.com时,它只显示目录列表,但是当我运行node.example.com:3030时,它可以运行nodejs应用程序。还有一件事,就像我在问题中提到的那样,我有https连接,所以它能够与https连接一起工作吗?您能帮我解决这个问题吗? - Dipak
请查看我更新的配置链接:https://www.dropbox.com/s/4u0asrz38qsl3ua/proxy%20configuration.png?dl=0 - Dipak
我已经“扩大”了我的先前回答以回应您的评论。 - Daniel Ferradal
你能否参考我的配置快照链接? - Dipak
但问题仍然存在,我需要使用node.example.com:3030来运行应用程序。我按照您的描述进行了更新。请查看配置:https://www.dropbox.com/s/4u0asrz38qsl3ua/proxy%20configuration.png?dl=0。 - Dipak
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接