Как заставить приложение Nginx server NodeJS, работающее на порту 8080, общаться с клиентом React по общедоступному IPv4-адресу EC2

#javascript #node.js #nginx #amazon-ec2 #reverse-proxy

#язык JavaScript #node.js #nginx #amazon-ec2 #обратный прокси-сервер

Вопрос:

У меня есть приложение MERN, развернутое на EC2, и у меня возникли проблемы со связью между внутренним и внешним интерфейсом. У меня nginx работает на порту 80, и я обновил правила входа для группы безопасности для экземпляра, чтобы принимать трафик с «Любого места», используя тот же порт, на котором указан мой узел server.js работает, что равно 8080.

 require("dotenv").config(); const express = require("express"); const bodyParser = require("body-parser"); const cors = require("cors"); const path = require('path'); const mongoose = require('mongoose'); const dbConfig = require("./app/config/db.config"); const config = require("./app/config/auth.config");  const app = express();  // parse requests of content-type - application/json app.use(bodyParser.json());  // parse requests of content-type - application/x-www-form-urlencoded app.use(bodyParser.urlencoded({ extended: true }));  app.use(express.static("client/build"));  app.get("*", (req, res) =gt; {  res.sendFile(path.resolve(__dirname, "../client", "build", "index.html"));  });   const db = require("./app/models"); const Role = db.role;  db.mongoose  .connect(config.mongoURI  , {  useNewUrlParser: true,  useCreateIndex: true,  useUnifiedTopology: true  })  .then(() =gt; {  console.log("Successfully connect to MongoDB.");  initial();  })  .catch(err =gt; {  console.error("Connection error", err);  process.exit();  });  // simple route app.get("/", (req, res) =gt; {  res.json({ message: "Welcome to Off Strength" }); });  // routes require("./app/routes/auth.routes")(app); require("./app/routes/user.routes")(app);  // set port, listen for requests const PORT = config.PORT || 8080; app.listen(PORT, () =gt; {  console.log(`Server is running on port ${PORT}.`); });  function initial() {  Role.estimatedDocumentCount((err, count) =gt; {  if (!err amp;amp; count === 0) {  new Role({  name: "user"  }).save(err =gt; {  if (err) {  console.log("error", err);  }   console.log("added 'user' to roles collection");  });   new Role({  name: "moderator"  }).save(err =gt; {  if (err) {  console.log("error", err);  }   console.log("added 'moderator' to roles collection");  });   new Role({  name: "admin"  }).save(err =gt; {  if (err) {  console.log("error", err);  }   console.log("added 'admin' to roles collection");  });  }  }); } 

Я проверил несколько потоков и учебных пособий, и они в основном говорят, что это обратный прокси-сервер директивы о местоположении в файлах конфигурации, но я пробовал несколько комбинаций использования

местоположение /api/ локальный хост:8080,

местоположение /api/ частный IP EC2:8080,

местоположение /api/ общедоступный IP EC2:8080, и ничего не работает.

 server {  #listen 80;  listen 80 default_server;  listen [::]:80 default_server;  server_name http://ec2_public_ip/; large_client_header_buffers 4 16k;  add_header 'Access-Control-Allow-Origin' '*';  add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT' always;  access_log /home/ubuntu/client/server_logs/host.access.log main;      location / {   root /home/ubuntu/client/deploy;  index index.html index.htm;  try_files $uri /index.html;    }    location /api/ {   proxy_pass http://0.0.0.0:8080/;  proxy_http_version 1.1;  proxy_cache_bypass $http_upgrade;  proxy_set_header Upgrade $http_upgrade;  proxy_set_header Connection 'upgrade';  proxy_set_header Host $host;  proxy_set_header X-Real-IP $remote_addr;  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_set_header X-Forwarded-Proto $scheme;     }    error_page 500 502 503 504 /50x.html;  location = /50x.html {  root /usr/share/nginx/html;  }   server_tokens off;   location ~ /.ht {  deny all;  }  }    

Когда мой передний конец делает запрос на заднем конце ее помощью API URL-адрес слова const API_URL = «http://0.0.0.0:8080/api/auth/»; я также попытался с помощью нескольких конфигурациях, IP-адресов и портов для этого URL-адрес запроса как обратный прокси-сервер для расположения директивы (например, http://ec2_public_IP:8080), но безуспешно, он обычно заканчивается 404, 405, или 502. Поэтому я считаю, что моя ошибка заключается в URL-адресе запроса, или я не использую правильные комбинации IP-адресов и портов.

 import axios from "axios";  const API_URL = "http://0.0.0.0:8080/api/auth/";  class AuthService {  login(username, password) {  return axios  .post(API_URL   "signin", {  username,  password  })  .then(response =gt; {  if (response.data.accessToken) {  localStorage.setItem("user", JSON.stringify(response.data));  }   return response.data;  });  }   logout() {  localStorage.removeItem("user");  }   register(username, email, name, age, weight, height, goal, password) {  return axios.post(API_URL   "signup", {  username,  email,  name,  age,  weight,  height,  goal,  password  });  }   getCurrentUser() {  return JSON.parse(localStorage.getItem('user'));;  } }  export default new AuthService(); 

Очевидно, у меня есть некоторые пробелы в знаниях, поэтому я пытаюсь учиться, но я все еще в замешательстве, поэтому буду признателен за помощь.

Ответ №1:

У всех есть пробелы.

С беглого взгляда я бы сказал, что ваша проблема заключается в URL-адресе запроса в вашем коде реакции

 const API_URL = "http://0.0.0.0:8080/api/auth/";  

Это должен быть домен вашего сервера. Для AWS они это называют Public IPv4 DNS . Кроме того, вы автоматически обновляетесь до HTTPS конфигурации Nginx, так что вы можете начать с этого. Попробуйте это:

 const API_URL = "https://lt;lt;Public IPv4 DNSgt;gt;:8080/api/auth/";  

Этот код выполняется в браузере пользователей

Комментарии:

1. Спасибо! Я все понял. Это было ключевым моментом. Это было так, И я не разрешил порт 8080 с помощью команды sudo ufw разрешить 8080.Я также переучил то, что я уже узнал, а именно порт 80 и 443 предназначены для http и https.

2. Это здорово! Отметьте это как принятый ответ, если это было то, что вам нужно