AWS 实例快照后 node js 应用程序出现问题

AWS 实例快照后 node js 应用程序出现问题

我有一个 node.js 应用程序,其中 nginx 在我购买的一个域上运行得很好。它在 ubuntu 服务器上运行,一切正常。我不小心点击了 aws 网站上的“创建图像”,从那时起,该网站就无法正常工作。通过端口 3000 的本地 ip 地址按预期工作,但域却不行。它正在加载第一个 html 文件,但无法获取与之相关的样式表或 javascript,并且没有加载任何 css 或 javascript 文件,而是全部返回 404。我卸载/重新安装了 nginx 等,但没有任何运气。有什么想法吗?如果可能的话,我不想更改任何代码,因为在此之前它完全按预期/期望工作。我想再次表示,除了在 aws 上单击一个按钮之外,没有其他任何事情导致此问题

这是 nginx 的配置文件

#
server {
listen 80;
listen [::]:80;
server_name example.org www.example.org;
return 301 https://$server_name$request_uri;
}

server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name example.org www.example.org;

location / {
proxy_pass http://localhost:3000/login.html;
}
    ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem; # managed by Certbot
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

ssl_session_cache shared:SSL:5m;
ssl_session_timeout 1h;
add_header Strict-Transport-Security “max-age=15768000” always;


}  
#  

另外,这是我的 app.js 的工作情况,这可能是询问我是否做得好的好时机,我相信它可以改进,因为我仍然在学习

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser')
var logger = require('morgan');
var User = require("./models/user");
var db = require('./db.js');

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var devicesRouter = require('./routes/devices')

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/devices', devicesRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

这是我使用服务器时做出的响应(第一个是我在本地主机端口 3000 上,第二个是它变得很奇怪的地方,它看起来像是试图访问 /login.htmlstylesheets/login.css 而不是 /stylesheets/login/css

答案1

嗯,这里的问题很明显:

location / {
proxy_pass http://localhost:3000/login.html;
}

因此,每次 nginx 将请求传递到您的 Node 应用程序时,/login.html都会将其添加到 URI 路径的前面。

我猜你或其他人在几天、几周甚至几个月前做了这个更改,但从未用它重新加载 nginx,并且它最终在你的服务器重新启动时加载。

您应该改为传递到http://127.0.0.1:3000,而没有尾随路径。

location / {
proxy_pass http://localhost:3000;
}

您还应该将文档设置root为包含静态文件根目录的目录,并使用try_files以确保 nginx 而不是 Node 提供静态文件。更好的配置如下:

server {
   ....
   root /srv/www/myapp/public;
   location / {
       try_files $uri @node;
   }

   location @node {
       proxy_pass http://127.0.0.1:3000;
   }
}

相关内容