#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. Это здорово! Отметьте это как принятый ответ, если это было то, что вам нужно