【问题标题】:Run node.js on cpanel hosting server在 cpanel 托管服务器上运行 node.js
【发布时间】:2017-10-20 02:45:07
【问题描述】:

这是一个简单的 node.js 代码。

var http = require('http');
http.createServer(function(req, res) {
    res.writeHead(200, { 'Content-Type' : 'text/plain'});
    res.end('Hello World!');
}).listen(8080);

我将它上传到 cpanel 托管服务器并安装了 node.js 并运行它。 如果服务器是普通服务器,我可以通过访问“http://{serverip}:8080”来检查脚本结果。但是在 cpanel 上托管域和子域,并且每个域都与每个站点匹配。即使 http://{serverip} 也不是有效的 url。 如何访问我的 node.js 结果? 请教我。 谢谢。 冰冰。

【问题讨论】:

标签: node.js cpanel


【解决方案1】:

使用 CPanel 安装/设置 NodeJS

1.使用 SSH 登录您的帐户(如果您的帐户未启用,请联系支持团队)。

2。下载 Node.js

wget https://nodejs.org/dist/latest/node-v10.0.0-linux-arm64.tar.xz

3.提取 Node.js 文件

tar xvf node-v10.0.0-linux-arm64.tar.xz

4.现在将文件夹重命名为“nodejs”。为此,请键入以下命令

mv node-v10.0.0-linux nodejs

5.现在要安装节点和 npm 二进制文件,输入以下命令:

mkdir ~/bin <br> cp nodejs/bin/node ~/bin
cd ~/bin
ln -s
../nodejs/lib/node_modules/npm/bin/npm-cli.js npm

6. Node.js 和 npm 已安装在您的帐户中。要验证这一点,请键入以下命令

节点--版本 npm --version

The ~/bin directory is in your path by default, which means you can run node and npm from any directory in your account.

7.启动 Node.js 应用程序

nohup node my_app.js &

8.停止应用程序

pkill node

9.将 Node.js 应用程序与 Web 服务器集成(可选)

根据您正在运行的 Node.js 应用程序的类型,您可能希望能够使用 Web 浏览器访问它。为此,您需要为 Node.js 应用程序选择一个未使用的端口来侦听,然后定义将访问者重定向到应用程序的服务器重写规则。

在文本编辑器中,将以下行添加到 /home/username/public_html 目录中的 .htaccess 文件中,其中 username 代表您的帐户用户名:

RewriteEngine On
RewriteRule ^$ http://127.0.0.1:XXXXX/ [P,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://127.0.0.1:XXXXX/$1 [P,L]

在两个 RewriteRule 行中,将 XXXXX 替换为您的 Node.js 应用程序侦听的端口。 要在托管服务器上运行 Node.js 应用程序,您必须选择一个未使用的端口,并且端口号必须介于 49152 和 65535(含)之间。 将更改保存到 .htaccess 文件,然后退出文本编辑器。您网站的访问者将被重定向到侦听指定端口的 Node.js 应用程序。

如果您的应用程序无法启动,您选择的端口可能已经在使用中。检查应用程序日志中的错误代码,例如 EADDRINUSE,指示端口正在使用中。如果是,请选择其他端口号,更新应用程序的配置和 .htaccess 文件,然后重试。

【讨论】:

  • 如何确保nodejs实例在服务器重启后重新启动?
  • nodenpm 工作之前,我必须使用export PATH=/opt/cpanel/ea-nodejs10/bin/:$PATH
  • 在第 6 步。节点 --version,给我错误,无法执行二进制文件
  • 你的 htaccess 太棒了! ?
  • 你能帮忙吗?当我尝试执行节点 node ./index.js bash: /home/khblpkn3ru9o/bin/node: 无法执行二进制文件时,它返回错误
【解决方案2】:

cPanel 通常运行 Apache 或其他在所有 cPanel/unix 帐户之间共享的 Web 服务器。 Web 服务器侦听端口 80。根据请求 URL 中的域名,Web 服务器使用“虚拟主机”来确定哪个 cPanel/unix 帐户应该处理请求,即在哪个主目录中找到要服务的文件和要运行的脚本。如果 URL 仅包含 IP 地址,则 cPanel 必须默认为 cPanel 帐户之一。

通常,如果没有 root 访问权限,由 cPanel 帐户运行的作业无法侦听端口 80。实际上,可用端口可能非常有限。如果 8080 不起作用,您可以尝试 60000。要访问正在运行的 node.js 服务器,您需要知道它正在侦听的端口号。由于这是在该服务器上侦听该端口的唯一工作,因此您应该能够将浏览器指向任何 cPanel 帐户的域名,甚至是服务器的 IP 地址,并将端口号添加到 URL。但是,通常使用运行 node.js 作业的 cPanel 帐户的域名,例如http://cPanelDomainName.com:60000/

当然,80 端口是 Web 服务的默认端口,而且很少有用户熟悉 URL 中的可选端口号。为了让用户更轻松,您可以使用 Apache 将端口 80 上的请求“反向代理”到 node.js 进程正在侦听的端口。这可以在配置或 .htaccess 文件中使用 Apache 的 RewriteRule 指令来完成。这种请求的反向代理可以说还有其他好处,例如Apache 可能是面向公共 Internet 的更安全、可靠和可管理的前端。

不幸的是,node.js 的这种设置并未得到所有网络托管公司的认可。 A2Hosting.com 是一家支持它的托管公司,即使是在其廉价的共享托管产品上也是如此。他们的知识库中还对设置过程进行了清晰的书面描述。

最后,值得注意的是,cPanel 的开发人员正在开发内置的 node.js 支持。 “如果所有的星星都对齐,我们可能会在第 68 版看到这片土地,”即可能在 2018 年初。

参考

Apache 虚拟主机 - http://httpd.apache.org/docs/2.4/vhosts/

Apache RewriteRule 指令 - http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html

关于配置 Node.js 的 A2Hosting.com 知识库文章 - https://www.a2hosting.com/kb/installable-applications/manual-installations/installing-node-js-on-managed-hosting-accounts

node.js 支持的 cPanel 功能请求线程 - https://features.cpanel.net/topic/nodejs-hosting

StackOverflow 相关问题

How to host a Node.Js application in shared hosting

Why node.js can't run on shared hosting?

【讨论】:

【解决方案3】:

是的,这是可能的,但它几乎没有依赖项,您的 cpanel 托管服务提供商或您选择的计划可能支持也可能不支持。

我提到的以下步骤仅用于演示目的。如果您是学生或只是想玩它,您可以尝试一下。我不是安全专家,所以从安全的角度来看,我真的不知道它有多好。


话虽如此,让我们看看我是如何配置它的。我有托管 cpanel 托管订阅,步骤如下:

启用 SSH 访问

通过 ssh 连接到共享机器

检查您的 linux 发行版并下载和设置节点 js

在我的例子中,以下是用于此的命令:

Downloading node & extracting it using curl
curl https://nodejs.org/dist/v12.18.3/node-v12.18.3-linux-x64.tar.gz |tar xz

这将下载和提取节点并创建一个目录。您可以使用ls 命令确认,如下图所示。

此时您可以查看如下所示的版本

你可以看到 node 命令没问题,但是对于 npm 命令我们修改如下

./node-v12.18.3-linux-x64/bin/node ./node-v12.18.3-linux-x64/lib/node_modules/npm/bin/npm-cli.js --version

我们还可以创建别名让生活更轻松

请查看以下图片:

I tried using bashrc/bash_profile but somehow it didn't work .

这就是在共享 cpanel 机器上运行的所有节点服务器。


现在我想在这种情况下有一个基于快速 js 的 rest api 支持。问题在于它将在本地托管在我将提供的端口上。检查以下示例:

var express=require('express')

var app=express()

app.get('/', function (req, res) {
    res.send('hosting node js base express api using php & shared hosting a great way to start yjtools')
  })

console.log("listening yjtools node server on port 49876...")
app.listen(49876)

这里的问题是即使它会执行,我也无法通过网络访问它。这是因为我们只能获得在共享 cpanel 机器上允许/打开的固定预定义端口(如 80、21、3306 等)。因此,我托管的 express 应用只能在 49876 port 本地使用。

让我们看看我们有什么:

  • 在 cpanel 机器上本地托管的基于 express js 的应用程序。
  • 基于 PHP 的托管 Apache 服务器可通过 http/https 获得。

所以我们可以使用带有重定向规则集和 curl 的 php 来弥补差距。 以下是我为使其正常工作所做的更改:

In .htaccess file 添加一个重定向规则,说 domain/api 是我想要的我的 rest api 路径。

RewriteRule api/(.*)$ api/api.php?request=$1 [QSA,NC,L]

In the api/api.php file(这是我选择的路径你可以选择任何路径)

  <?php
echo "Hello ".$_REQUEST['username'];


echo '<hr>';

$curl = curl_init('http://127.0.0.1:49976/');
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//Get the full response
$resp = curl_exec($curl);
if($resp === false) {
    //If couldn't connect, try increasing usleep
    echo 'Error: ' . curl_error($curl);
} else {
    //Split response headers and body
    list($head, $body) = explode("\r\n\r\n", $resp, 2);
    $headarr = explode("\n", $head);
    //Print headers
    foreach($headarr as $headval) {
        header($headval);
    }
    //Print body
    echo $body;
}
//Close connection
curl_close($curl);
?>

And on the ssh prompt just run the app.js file

node api/app.js

下面是这个工作的图片:

Here是我在程序中提到的类似的东西,所以我们也可以通过php本身来调用这个节点。


现在我在 cpanel 上拥有基于 express 的 rest api 支持、托管的 angular 应用程序和用于数据库的 mysql。

【讨论】:

    【解决方案4】:

    您可以使用指向该 cPanel 服务器的任何域,而不是访问 http://server-ip:8080,而是尝试访问 http://domain.tld:8080。默认情况下,cPanel 不绑定端口 8080。请务必检查服务器上是否有任何防火墙。如果是,则允许 tcp 端口 8080 上的传入连接。根据您的 WHM 服务器配置,它也应该与 http://server-ip:8080 一起使用

    【讨论】:

    • 谢谢博格丹。那么 WHM 服务器配置中的端口选项在哪里?我真的无法在我的 WHM 服务器选项中查看它。如果你知道请告诉我你的路径导航示例。
    • cPanel 有一个默认防火墙(iptables)。您可以执行 iptables -nL 来查看所有当前规则。您还可以执行 systemctl stop firewalld 以完全停止防火墙。例如,如果您使用 CSF,则配置文件为 /etc/csf/csf.conf。你有 TCP_PORTS = "20,21,80,etc"。您可以在此处添加 8080 并执行 csf -ra 以重新启动 CSF 防火墙(如果您已安装 CSF)
    【解决方案5】:

    cPanel 版本 80 支持 nodejs 10.x:https://documentation.cpanel.net/display/80Docs/80+Release+Notes#id-80ReleaseNotes-InstallanduseNode.jsapplications

    安装和使用 Node.js 应用程序

    您现在可以在服务器上安装和使用 Node.js 应用程序。到 使用 Node.js,在 Additional Packages 中安装 ea-nodejs10 模块 WHM 的 EasyApache 4 界面部分(WHM >> 首页 >> 软件 >> 易阿帕奇 4)。

    您可以在 cPanel 的应用程序管理器中注册 Node.js 应用程序 界面(cPanel >> 主页 >> 软件 >> 应用程序管理器)。为了 更多信息,请阅读我们的 Node.js 安装指南 文档。

    要启用应用程序管理器:https://documentation.cpanel.net/display/80Docs/Application+Manager

    您的托管服务提供商必须启用应用程序管理器功能 WHM 的功能管理器界面(WHM >> Home >> Packages >> Feature 经理)。

    您的托管服务提供商必须安装以下 Apache 模块:

    ea-ruby24-mod_passengermodule。注意:此模块禁用 Apache 的 mod_userdir 模块。

    ea-apache24-mod_env 模块。注意:此模块允许您添加 注册应用程序时的环境变量。更多 有关环境变量的信息,请阅读环境 下面的变量部分。

    ea-nodejs10 模块,如果您想注册 Node.js™ 应用程序。

    您可以在此 Youtube 视频中看到应用程序管理器的外观: https://www.youtube.com/watch?v=ATxMYzLbRco

    【讨论】:

    • 如果我想用 nvm 选择 node 的版本怎么办?我有一个需要 node v8.9.3 的应用程序 ...
    • @beppe9000 我知道这不是一个解决方案,但我会敦促您的开发人员将该应用程序移至 10.x,因为 nodejs 8.x 将于 2020 年 1 月结束获得官方支持nodejs.org/en/about/releases跨度>
    • 太糟糕了,我无法控制:\
    【解决方案6】:

    任何想知道如何将 node js 应用程序部署到 Cpanel 的人这对他来说是一个很好的来源,这彻底解释了如何将 node js 应用程序部署到 Cpanel 请查看this

    【讨论】:

      猜你喜欢
      • 2020-06-28
      • 1970-01-01
      • 2016-02-04
      • 1970-01-01
      • 2016-12-12
      • 2016-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多