使用 npm start 启动时 NodeJs 应用程序可以运行,但使用 PM2 启动时则不行

使用 npm start 启动时 NodeJs 应用程序可以运行,但使用 PM2 启动时则不行

对服务器内容很陌生,如果这可能是一个菜鸟问题,请见谅。

问题

我正在尝试在服务器上运行 React 和 Node/express。React 确实可以工作,当我通过npm start服务器启动我的节点应用程序时,它实际上也可以工作,这意味着:在 IP wxyz 上打开网站会显示我的网站,使用表单提交将到达节点后端。当我尝试使用 PM2 运行我的节点应用程序时,它不起作用。PM2 将启动我的应用程序,但我无法通过网站或 curl 访问它localhost/api/...


使用 npm start 的工作示例

使用 npm start 启动我的节点应用程序的输出:
Express server listening on port 3001
然后使用 curl 我从后端收到一条预期的消息:
curl localhost/api/users-> {message:“blabla”}


PM2 启动和状态失败的示例

目前npm start不是运行我使用以下命令启动该应用程序:
sudo pm2 start app.js -- start然后显示它处于在线状态:

┌────┬────────────────────┬──────────┬──────┬───────────┬──────────┬──────────┐
│ id │ name               │ mode     │ ↺    │ status    │ cpu      │ memory   │
├────┼────────────────────┼──────────┼──────┼───────────┼──────────┼──────────┤
│ 0  │ app                │ fork     │ 0    │ online    │ 0%       │ 10.5mb   │
└────┴────────────────────┴──────────┴──────┴───────────┴──────────┴──────────┘

但是现在使用 curl 我收到 503 服务器错误:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>503 Service Unavailable</title>
</head><body>
<h1>Service Unavailable</h1>
<p>The server is temporarily unable to service your
request due to maintenance downtime or capacity
problems. Please try again later.</p>
<hr>
<address>Apache/2.4.48 (Ubuntu) Server at localhost Port 80</address>
</body></html>

Server at localhost Port 80已经让我怀疑这是否表明存在问题但让我们继续。


文件结构

静态反应文件 -> /var/www/html/client/build/
Node 内容 ->/var/www/html/server/


Apache 配置

配置被更改为指向 react 应用程序的构建文件夹,同时允许 react 路由器正常工作。

<VirtualHost *:80>

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/client/build/

        # following is used for React Router to work properly
        <Directory "/var/www/html/client/build/">
                RewriteEngine on
                RewriteCond %{REQUEST_FILENAME} -f [OR]
                RewriteCond %{REQUEST_FILENAME} -d
                RewriteRule ^ - [L]
                RewriteRule ^ index.html [L]
        </Directory>

        # following is what I thought is the right way to add the possibility to talk to the nodejs backend
        # ServerName localhost
        ProxyPreserveHost on

        ProxyPass /api http://localhost:3001/api
        ProxyPassReverse /api http://localhost:3001/api
...
</VirtualHost>

Netstat 输出

tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp6       0      0 :::80                   :::*                    LISTEN
tcp6       0      0 :::22                   :::*                    LISTEN

UFW 状态输出

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
80                         ALLOW       Anywhere
443                        ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
8080                       ALLOW       Anywhere
3001                       ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
80 (v6)                    ALLOW       Anywhere (v6)
443 (v6)                   ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)
8080 (v6)                  ALLOW       Anywhere (v6)
3001 (v6)                  ALLOW       Anywhere (v6)

到目前为止我尝试过什么

我查看了 PM2 的几个设置示例,它们通常只是应用程序的基本启动,并没有深入研究或没有与 React 的结合。

我还尝试更改 apache ProxyPass 设置,将 3001 端口添加到 UFW 中允许的端口(使用 proxypass 时这有意义吗?)。

不确定我是否还未理解某个概念,或者我是否还遗漏了某些内容。或者可能只是此时配置错误。

任何帮助是极大的赞赏!

相关内容