在cpanel托管服务器上运行node.js.

bb1*_*816 16 cpanel node.js

它是一个简单的node.js代码.

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

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

aap*_*aap 22

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可能是面向公共互联网的更安全,可靠和可管理的前端.

不幸的是,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

A2Hosting.com有关配置Node.js的知识库文章 - 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问题

如何在共享主机中托管Node.Js应用程序

为什么node.js无法在共享主机上运行?

  • 2019年nodejs对cpanel有支持吗? (2认同)

Mat*_*jra 19

使用CPanel安装/设置NodeJS

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

2.下载NodeJS

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

3.解压缩NodeJS文件

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

4.现在将文件夹重命名为nodejs name,以执行此操作,键入以下命令

mv node-v10.0.0-linux nodejs

5.现在安装node和npm二进制文件,键入下一个命令:

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

6.您的帐户上安装了Node.js和npm.要进行验证,请键入以下命令

node --version
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节点my_app.js&

8.停止申请

pkill节点

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]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如何确保服务器重启后重新启动nodejs实例? (2认同)
  • 在“node”和“npm”工作之前,我必须使用“export PATH=/opt/cpanel/ea-nodejs10/bin/:$PATH”。 (2认同)
  • 你的 htaccess 太棒了! (2认同)

YJD*_*Dev 10


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

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


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

启用 SSH 访问

主机 cpanel 中的 ssh 访问

在此输入图像描述

通过 ssh 连接到共享机器

在此输入图像描述

在此输入图像描述

检查您的 Linux 发行版并下载和设置 Node 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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述 在此输入图像描述

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

在此输入图像描述

此时可以检查版本如下图

在此输入图像描述

正如您所看到的,对于节点命令来说这是可以的,但是对于npm命令我们已将其修改如下

./node-v12.18.3-linux-x64/bin/node ./node-v12.18.3-linux-x64/lib/node_modules/npm/bin/npm-cli.js --version
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

此外,我们可以创建别名,让生活变得更轻松

检查下面的图片:

在此输入图像描述

在此输入图像描述

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

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


现在我想在这种情况下有一个基于 Express 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)
Run Code Online (Sandbox Code Playgroud)

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

让我们看看我们有什么:

  • 一个基于 Express js 的应用程序,托管在 cpanel 机器本地。
  • 基于 PHP 的托管 Apache 服务器可通过 http/https 访问。

因此,我们可以利用带有重定向规则集的 php 和 curl 来弥补这一差距。以下是我为使其发挥作用所做的更改:

In .htaccess file添加重定向规则,假设域/api 是我想要的其余 api 路径。

RewriteRule api/(.*)$ api/api.php?request=$1 [QSA,NC,L]
Run Code Online (Sandbox Code Playgroud)

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);
?>
Run Code Online (Sandbox Code Playgroud)

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

node api/app.js
Run Code Online (Sandbox Code Playgroud)

以下是此操作的实际操作图像:

在此输入图像描述

在此输入图像描述

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


现在,我在 cpanel 上拥有基于 Express 的 Rest API 支持、托管的 Angular 应用程序和用于数据库的 mysql。


Bog*_*ica 5

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