首页 > 解决方案 > 使用 PhusionPassenger 部署 Meteor:在 $PATH 中找不到节点

问题描述

我正在运行 Ubuntu 16.04 的服务器上部署使用 Meteor 1.8 制作的应用程序。我一直按照这里的教程使用 Phusion Passenger 来部署与 Nginx 相关的应用程序。

但是,我安装 Node.js 的方式与教程中描述的方式不同,这会导致错误。因此,我需要更改$PATH环境变量来告诉Passenger 在哪里可以找到节点。

——— 详情(可跳过)———</p>

我已经使用 NVM 安装了 Node 8.16.2。meteor我有一个名为运行应用程序进程的非 root 用户。以 身份登录服务器时meteor,命令which node返回:

/home/meteor/.nvm/versions/node/v8.16.2/bin/node

但是,当我连接到应该为流星应用程序提供服务的子域时,会记录一个错误,声称node: not found

App 32461 output: /bin/sh: 1: exec: node: not found

为了获得有关该问题的更多信息,我在定义子域的 nginx conf 文件中添加了以下行:

passenger_friendly_error_pages on;

我的 nginx 配置文件现在看起来像这样:

server {
    listen 80;
    server_name example.com;

    # Tell Nginx and Passenger where your app's 'public' directory is
    root /var/www/example/bundle/public;

    # Turn on Passenger
    passenger_enabled on;
    # Tell Passenger that your app is a Meteor app
    passenger_app_type node;
    passenger_startup_file main.js;

    # Tell your app where MongoDB is
    passenger_env_var MONGO_URL mongodb://localhost:27017/gizmo;
    # Tell your app what its root URL is
    passenger_env_var ROOT_URL http://example.com;

    ### DEBUGGING ONLY ! REMOVE FOR PRODUCTION ###
    passenger_friendly_error_pages on;
}

现在,Phusion Passenger 给了我一个有用的错误页面。这有一个详细诊断选项卡和一个子流程子选项卡。在此之下,在环境变量部分,我可以看到如何$PATH 定义:

PATH=/home/meteor/bin:/home/meteor/.local/bin:/usr/local/gradle/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

换句话说,它不知道/home/meteor/.nvm/versions/node/v8.16.2/bin/node.

————期望的解决方案————</p>

最好的解决方案似乎是将节点的路径添加到$PATH. PhusionPassenger文档建议编辑/etc/default/nginx. 我在此文件中添加了以下行:

export PATH=/home/meteor/.nvm/versions/node/v8.16.2/bin/:$PATH

但这没有效果。

————权宜之计————</p>

我的权宜之计是创建director/home/meteor/bin/并创建指向节点应用程序的符号链接:

sudo mkdir /home/meteor/bin
sudo ln -s /home/meteor/.nvm/versions/node/v8.16.2/bin/node /home/meteor/bin
sudo chown -R meteor: /home/meteor/bin

这可行,但我想了解如何让 Nginx 和 PhusionPassenger$PATH在环境变量中使用正确的。

标签: nginxmeteordeploymentpassenger

解决方案


推荐阅读