我有一个 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;
答案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;
}
}