在启用SSR的情况下升级Angular版本后,Nginx出现502错误是什么原因?

jdg4fx2g  于 2023-06-05  发布在  Nginx
关注(0)|答案(1)|浏览(209)

我最近将我的项目从Angular 14升级到15,并开始收到502个错误。
项目与SSR和Nginx合作
所以,我在本地经营

npm run build:ssr

接收服务器和浏览器目录,将它们移动到服务器上,并在服务器上使用配置在docker中运行nginx

server {
    listen 443 ssl;
    gzip on;
    gzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
    gzip_proxied no-cache no-store private expired auth;
    gzip_min_length 1000;
    server_name ${NGINX_HOST};
    ssl_certificate /etc/letsencrypt/live/${NGINX_HOST}/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/${NGINX_HOST}/privkey.pem;
    
    location /api {
        proxy_pass http://core;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location / {
        alias /frontend/browser/;
        index index.html;
        try_files $uri  @universal;
    }
    
    location @universal {
        #port defined in your server.js
        proxy_pass http://localhost:4000; 
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;

    }
}

使用Angular 14的构建结果,这仍然可以完美地工作。
如果我使用Angular 15的构建结果,如果调用/,我会收到Nginx的502错误(连接到上游时connect()失败)。API仍然运行良好。
奇怪的是,如果我用Angular 14准备的服务器和浏览器目录启动nginx,然后不重新启动,用Angular 15文件夹替换这些目录,一切仍然正常(在我的浏览器中,我可以看到新版本的应用程序)。重新启动后,我再次开始接收502。
我的Angular server.ts文件在升级过程中没有改变,但结果main.js文件却大不相同。
这种问题的根源是什么?
我尝试在不同的组合中更改端口(从4000到8000),因此即使在Angular 14版本上也收到了502错误。
想逃跑

npm run serve:ssr

在本地使用Angular 15,一切都很完美(端口为4000)
检查main.js运行日志,发现错误:

nginx    |     SyntaxError: Unexpected token '.'
nginx    |     at wrapSafe (internal/modules/cjs/loader.js:915:16)
nginx    |     at Module._compile (internal/modules/cjs/loader.js:963:27)
nginx    |     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
nginx    |     at Module.load (internal/modules/cjs/loader.js:863:32)
nginx    |     at Function.Module._load (internal/modules/cjs/loader.js:708:14)
nginx    |     at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
nginx    |     at internal/main/run_main_module.js:17:47

但是如何调试,这个'.'在哪里是意外的?

niwlg2el

niwlg2el1#

问题出在节点版本上。
Angular 15中的Server/main.js依赖于node v16+。
Angular 14中的Server/main.js可以与node v12一起工作。
出于某种原因cmd

RUN apt-get update && apt-get upgrade -y && apt-get install npm -y

在我的dockerfile中安装了node 12和npm 7(基于FROM nginx:stable的docker)。
添加两行

RUN npm install -g n && n latest
RUN npm install -g npm@latest

Dockerfile解决了这个问题。

相关问题