在共享主机上部署 Node.js 使用 Phusion Passenger

Node.js 不仅限于 VPS 服务器。现代共享主机 — 包括基于 DirectAdmin 的设置 — 支持通过 Phusion Passenger 运行 Node.js 应用,这是一个在 Apache 或 Nginx 与 Node.js 应用之间架起桥梁的应用服务器。本指南将逐步指导您在共享主机上部署 Node.js 应用。

Phusion Passenger 是什么?

Phusion Passenger 是支持 Ruby、Python 和 Node.js 的多语言应用服务器。它充当网络服务器(Apache/Nginx)和您的应用之间的中间件。当 HTTP 请求到达时,Passenger 将其转发到 Node.js 进程并返回响应 — 无需手动配置反向代理。

检查您主机上的 Node.js 可用性

部署前,通过 SSH 连接并运行以下命令来验证您的主机是否支持 Node.js:

node --version npm --version which node

注意: 共享主机上的 Node.js 比 VPS 更有局限性,因为资源是共享的。对于需要持续运行或处理高流量的应用,从 500 泰铢/月起的 VPS 提供使用 PM2 的完全控制和无限制的 Node.js。

Passenger 上的 Node.js 文件夹结构

public_html/ ├── app.js ← Main app entry point ├── package.json ├── node_modules/ └── public/ ← Static files └── .htaccess ← Passenger configuration

步骤 1: 创建 app.js

const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200, {'Content-Type': 'text/html'}); res.end('<h1>Node.js on Shared Hosting Works!</h1>'); }); if (typeof(PhusionPassenger) !== 'undefined') { PhusionPassenger.configure({ autoInstall: false }); server.listen('passenger'); } else { server.listen(3000, () => { console.log('Server running on port 3000'); }); }

步骤 2: 创建 package.json

{ "name": "my-nodejs-app", "version": "1.0.0", "main": "app.js", "scripts": { "start": "node app.js" } }

步骤 3: 配置 .htaccess

PassengerEnabled on PassengerAppRoot /home/username/public_html PassengerAppType node PassengerStartupFile app.js <Directory /home/username/public_html> Allow from all </Directory>

将 username 替换为您的 DirectAdmin 用户名。

步骤 4: 安装依赖项

cd ~/public_html npm install

步骤 5: 重启 Passenger

修改应用后,通过触摸重启文件来重启 Passenger:

mkdir -p tmp touch tmp/restart.txt

Passenger 上的 Express.js

const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hello from Express on Shared Hosting!'); }); if (typeof(PhusionPassenger) !== 'undefined') { PhusionPassenger.configure({ autoInstall: false }); app.listen('passenger'); } else { app.listen(3000); }

通过 DirectAdmin 上的 Node.js 选择器部署(无需手动 .htaccess)

许多现代 DirectAdmin 服务器配备了 Node.js 选择器(CloudLinux),允许您完全从控制面板 UI 创建和管理 Node.js 应用 — 无需手写 .htaccess。这种方法对初学者来说很理想,因为每个设置都只需点击一下。AsiaGB 主机运行在 DirectAdmin 上,所以它支持此工作流程。

通过 DirectAdmin Node.js 选择器创建 Node.js 应用:

  1. 登录 DirectAdmin 并打开 Extra Features → Setup Node.js App(也称为"Node.js 选择器")。
  2. 单击 CREATE APPLICATION 开始新应用。
  3. 从下拉菜单中选择 Node.js 版本(例如 18.x 或 20.x LTS)。
  4. 设置 Application root,例如 nodeapp(映射到 /home/username/nodeapp)。
  5. 设置 Application URL — 应用将服务的域或子域,例如 app.yourdomain.com。
  6. 设置 Application startup file 为 app.js(您的入口点)。
  7. 单击 CREATE — 系统会自动配置虚拟环境和 Passenger。

创建后,DirectAdmin 会显示进入虚拟环境的命令(例如 source /home/username/nodevenv/nodeapp/18/bin/activate)。在通过 SSH 使用 npm 前运行它,以便获得正确的 Node.js 版本。

配置应用: 入口点、环境变量和通过 UI 的 npm install

应用存在后,您可以从 Node.js 选择器页面调整所有内容,无需触摸终端:

入口点(启动文件)

Application startup file 字段是应用启动时 Passenger 调用的文件 — 通常是 app.js。如果您的项目使用不同的名称,如 server.js 或 index.js,更新此字段,单击 Save,然后 Restart。

环境变量

应用页面包含一个 "Add Variable" 部分来设置环境变量,如 NODE_ENV=production、DB_HOST 或 API_KEY — 无需 .env 文件。值在重启时注入到进程中,这比在代码中硬编码秘密更安全。

通过 UI 的 npm install

Node.js 选择器有一个 "Run NPM Install" 按钮,它读取您的 package.json 并在正确的环境中安装所有依赖 — 无需 SSH。这对于不公开 SSH 的主机来说很完美。要运行 package.json 中定义的其他脚本,请使用 "Run JS script" 按钮。

提示: 每当您更改环境变量、入口点或添加依赖项时,始终在 Node.js 选择器中单击 Restart(等同于 touch tmp/restart.txt)。否则应用将继续运行旧代码。

共享主机 vs VPS 用于 Node.js

通过 Passenger 在共享主机上运行 Node.js 对小到中型应用效果良好,但在提交前值得了解一些限制。下面的表格比较了共享主机和 VPS 之间的关键差异:

方面 共享主机(Passenger) VPS(PM2)
进程管理器 无(Passenger,延迟启动) 通过 PM2 / systemd 完全控制
自定义端口 否(Passenger 注入端口) 任何端口(3000、8080 等)
WebSocket / Socket.io 有限,取决于服务器配置 完全支持
RAM / CPU 与他人共享,配额有限 专用分配
Docker / 后台工作程序 不支持 完全支持
最适合 小网站、轻量 API、演示 生产、实时、高流量

简而言之,共享主机非常适合实验、小型 API 或流量适中的个人网站。必须持续运行、具有后台作业或使用实时 WebSocket 的应用应在具有完全 root 访问权限的 VPS 上运行。

常见问题和修复(502、端口、重启)

在共享主机上部署 Node.js 时,大多数问题可追溯到一些可修复的原因:

1. 错误 502 Bad Gateway 或应用程序错误

最常见的原因是应用在启动时崩溃 — 通常是缺失依赖或语法错误。首先检查日志:

cd ~/nodeapp tail -n 50 stderr.log

如果看到 Cannot find module 'xxx',npm install 没有在正确的环境中运行。再次在 Node.js 选择器中单击"Run NPM Install",或在运行 npm 前激活虚拟环境。

2. 应用未在正确的端口上监听

在 Passenger 上,您永远不要硬编码固定端口 — 让应用通过 Passenger 监听。确保您的代码如此:

const port = process.env.PORT || 3000; app.listen(port);

Passenger 为您设置 process.env.PORT。硬编码的 app.listen(3000) 有时可能工作但不可靠。

3. 代码更改不生效(需要重启)

Passenger 缓存进程,因此单独编辑文件在重启前没有效果。在 Node.js 选择器中单击 Restart 或通过 SSH 运行:

mkdir -p ~/nodeapp/tmp touch ~/nodeapp/tmp/restart.txt

4. 内存限制 / 应用被杀死

如果应用超过您的主机计划的 RAM 配额,系统会杀死进程,导致间歇性 502。检查内存使用情况并修剪不必要的依赖项。如果应用确实需要更多 RAM,将其移至具有专用内存的 VPS。

共享主机上 Node.js 的限制

需要完整的 Node.js 控制? AsiaGB VPS 从 500 泰铢/月开始,具有完全 Root 访问权限。使用 PM2 运行 Node.js,安装 Docker,绑定任何端口 — 非常适合 API 服务器、实时应用或微服务。位置:泰国和新加坡。

需要完整的 Node.js 能力? 尝试 VPS

从 500 泰铢/月起的 VPS。完全 Root 访问、PM2、Docker、自定义端口。泰国和新加坡位置,99% 正常运行时间。

查看 VPS 计划

查看泰国虚拟主机全部套餐 →