【问题标题】:NGINX net::ERR_CONNECTION_REFUSED with PM2 ReactJS Frontend and Express Backend in an AWSNGINX net::ERR_CONNECTION_REFUSED 与 AWS 中的 PM2 ReactJS 前端和 Express 后端
【发布时间】:2021-12-03 09:59:25
【问题描述】:

我在 Amazon Web 服务器中运行了一个连接到 Express APIREST 的 ReactJS 前端。使用 PM2 启动进程和 NGINX。

当我尝试在 chrome 中登录应用程序时出现问题,前端没问题,但它拒绝连接到 APIREST。 Error Image

这些是我拥有的文件:

APIREST .env

DB_CCT=my_db
DB_CCT_USER=user
DB_CCT_PASS=password
DB_CCT_HOST=127.0.0.1
NODE_ENV=development
PORT=8017
JWT_SECRET=jotauvedoblete

前端 ReactJS .env

我也尝试添加公共 IP 而不是 localhost 或 127.0.0.1 但也不起作用,它显示连接超时。

REACT_APP_DB=http://localhost:8017/api/v1/

PM2 生态系统.config.js

module.exports = {
  apps: [{
    name: 'CCT_REACT',
    cwd: 'cct-web-client/',
    script: 'npm',
 
    // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
    args: 'run start:production',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 5001
    },
    env_production: {
      NODE_ENV: 'production',
      PORT: 5001
    }
  },
  {
    name: 'CCT_API_REST',
    cwd: 'cct_api_rest/',
    script: 'npm',
 
    // Options reference: https://pm2.io/doc/en/runtime/reference/ecosystem-file/
    args: 'run start',
    instances: 1,
    autorestart: true,
    watch: false,
    max_memory_restart: '1G',
    env: {
      NODE_ENV: 'production',
      PORT: 8017
    },
    env_production: {
      NODE_ENV: 'production',
      PORT: 8017
    }
  }],
 
  deploy: {
    production: {
    }
  }
}

NGINX 服务

server {

        listen 80 default_server;
        listen [::]:80 default_server;

        root /home/ubuntu/CCT/cct-web-client/build;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri/ /index.html?q=$uri&$args;
        }

}

【问题讨论】:

  • 由于前端在浏览器中本地运行并向 AWS 服务器上的远程 API 发送请求,因此必须将请求发送到 remote 服务器的地址。 localhost 指向运行前端的 local 机器,因此它绝对不是 API 的正确路径。
  • 当您尝试访问公共服务器的 80 端口 IP 时是否收到任何响应?如果配置正确,你应该会得到 nginx 的默认登陆页面。这将说明至少 nginx 配置是否正确以及服务器实际上能够与外部通信。
  • 你是对的,但如果不是 localhost 我添加公共 ip 错误是 net::ERR_CONNECTION_TIMED_OUT 是的,在端口 80 上我正确地得到了前端
  • 这应该是需要关注的问题,是的。不幸的是,使用 localhost 是无关紧要的。通过curling AWS 服务器外壳内的 localhost 确保 Express 实际运行。另外,检查pm2 logs 是否有错误。

标签: javascript reactjs express nginx pm2


【解决方案1】:

如果您的连接被拒绝,这意味着请求被阻止。

我看到你已经为你的 API 应用指定了 PORT 8017,检查 2 件事 -

  1. PORT 8017 的 AWS 安全组 EC2 入站规则已对所有人开放。
  2. 还尝试重新启动一次 Nginx - `sudo systemctl restart Nginx。
  3. 对于您的 API,只需在不使用 pm2 的情况下启动您的 API 并在您的路由和中间件中添加一个 console.log 并从 POSTMAN 发出一个 POST 请求以检查您的应用程序是否以正确的方式运行。

【讨论】:

  • 前两点已经完成,我刚试了第三点,连接超时
  • 重现您的问题的步骤 - * 为您的 api 停止 pm2 * 运行 node app.js 或 npm start * 在 app.use() 中的端口变量中添加控制台 .log 以检查哪个 PORT 应用程序继续运行。从 AWS 的角度来看,您的 API 是在默认 VPC 还是私有子网上运行? * 如果您有私有子网,则需要配置应用程序负载均衡器并保持 8017 端口对所有人开放 * 如果是公共子网,请尝试上述步骤,理想情况下应该可以解决问题。
  • 我已经测试过端口正在运行,并且没问题。 AWS 在私有子网上运行,但有一个公共 IP 可以使用
【解决方案2】:

允许连接到您的 aws 上的端口 80 并删除所有其他端口并使用以下 nginx 配置。还将您前端中的 api 后端 url 设置为您的域或端口 80 上的 ip。

server {

    listen 80 default_server;
    listen [::]:80 default_server;

    root /home/ubuntu/CCT/cct-web-client/build;

    index index.html index.htm index.nginx-debian.html;

    server_name _;

    # Frontend
    location / {
        try_files $uri /index.html;
    }

    # node api reverse proxy
    location /api/ {
        proxy_pass http://localhost:8017/;
    }

}

如果您可以在没有前端的情况下使用您的 api,请务必先检查任何 api 客户端。它不应该超时。

【讨论】:

    猜你喜欢
    • 2019-03-11
    • 2018-12-06
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 2019-09-16
    • 2018-04-21
    • 2021-12-15
    • 1970-01-01
    相关资源
    最近更新 更多