![使用 npm start 启动时 NodeJs 应用程序可以运行,但使用 PM2 启动时则不行](https://linux22.com/image/774691/%E4%BD%BF%E7%94%A8%20npm%20start%20%E5%90%AF%E5%8A%A8%E6%97%B6%20NodeJs%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E5%8F%AF%E4%BB%A5%E8%BF%90%E8%A1%8C%EF%BC%8C%E4%BD%86%E4%BD%BF%E7%94%A8%20PM2%20%E5%90%AF%E5%8A%A8%E6%97%B6%E5%88%99%E4%B8%8D%E8%A1%8C.png)
对服务器内容很陌生,如果这可能是一个菜鸟问题,请见谅。
问题
我正在尝试在服务器上运行 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 时这有意义吗?)。
不确定我是否还未理解某个概念,或者我是否还遗漏了某些内容。或者可能只是此时配置错误。
任何帮助是极大的赞赏!