当前位置: 首页 > 知识库问答 >
问题:

多个Vue.js站点/NGINX反向代理/热重装不工作

柳豪
2023-03-14

我目前正在开发多个Vue。js SPA是本地的,在尝试使用NGINX反向代理为这些应用提供服务时遇到了各种问题。具体来说,我遇到了许多与websockets或sockjs节点相关的错误,这会破坏vue应用程序的热重新加载功能。(404未找到)的。

这些SPA中的每一个都运行在它们自己的ode.js服务器上,这些服务器在它们的服务器根目录上发送静态文件。应该通过NGINX反向代理访问它们:

http://localhost:6200/ -> http://localhost/my-app1/
http://localhost:6205/ -> http://localhost/my-app2/
http://localhost:6210/ -> http://localhost/my-app3/

对于开发,我使用npm run service运行所有vue.js应用程序,然后通过NGINX代理访问这些网站:http://localhost/my-appX/。网站加载没有任何功能问题,但热重载不工作。

在浏览器中查看开发人员控制台后,有许多GET请求,例如:http://localhost/sockjs-node/info?t=1605955915882。这个URL显然是错误的,因为我们目前正在通过代理访问该站点-我本来希望看到http://localhost/my-appX/sockjs-node/info?t=1605955915882。以下是我在尝试使用各种设备之前的当前配置:

我的NGINX配置:

upstream nodefrontend_myapp1 {
    server localhost:6200;
}
upstream nodefrontend_myapp2 {
    server localhost:6205;
}
upstream nodefrontend_myapp3 {
    server localhost:6210;
}

# Redirect HTTP to HTTPS
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    
    # 307 temporary redirect
    return 307 https://$host$request_uri; 
}

# HTTPS Proxy
server {
    listen 443 ssl http2;
    server_name localhost;
  
    # Proxy "my-app" URI traffic to correct server
    location /my-app1/ {
        proxy_buffering off;
        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;

        # For websockets
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";

        # Proxy to my-app's root
        proxy_pass http://nodefrontend_myapp1/;
    }

    # Note: several other sites are running via the below routes
    location /my-app2/ {
      proxy_pass http://nodefrontend_myapp2/;
      # ...
    }

    location /my-app3/ {
      proxy_pass http://nodefrontend_myapp3/;
      # ...
    }
}

vue。配置。js配置:

module.exports = {
    // options...

    // I want the site to be accessible *RELATIVE* to the current URL.
    // This will make vue.js resources have no leading slash, eg: <link> href="css/file123.css" </link>
    // And should allow me to fetch resources on the current VHOST: eg: http://localhost/my-app/css/file123.css
    publicPath: "",
    
    devServer: {
        //disableHostCheck: true,
        https: false,
        public: "0.0.0.0",
        host: "localhost" ,
        port: 6200,
        sockPath: "", /////////// This has been causing me issues

    },

}

所以在看了webpack文档后,我似乎应该更新每个应用程序vue.config.js中的ockPath,所以我这样做了:

sockPath: "/my-appX/sockjs-node",

这停止了sockjs节点的404 GET错误,但随后出现了关于websocket的不同错误,这些websocket现在无法在以下位置找到其资源:ws://localhost/my-appX/sockjs-node/147/0dj5ee1p/websocket

为了检查问题是Web服务器还是NGINX,我运行了wscat-csws://localhost:6200/my-appX/sockjs-node/147/0dj5ee1p/websocket,这确实有效。这表明NGINX以某种方式杀死了websocket。为了再次检查,我通过NGINX:wscat-csws://localhost/my-appX/sockjs-node/147/0dj5ee1p/websocket测试了websocket,但它不起作用。

在玩了几个小时的配置和NGINX之后,我在网上发现了一篇文章,上面说我应该更改我的NGINX proxy_pass URL以删除尾部的斜杠。我把它改成:

proxy_pass http://nodefrontend_myappX/;

为此:

proxy_pass http://nodefrontend_myappX;

并通过wscat-csws://localhost/my-appX/sockjs-node/147/0dj5ee1p/websocket重新测试了websocket,测试成功了!。然而删除前导斜杠后,现在网站不会加载。我的怀疑是vue。配置。js publicPath,但我不知所措。

是否有人能够运行多个Vue。NGINX反向代理背后的js站点(作为vhost),并且热重新加载功能是否正常工作???

======我确实找到了解决方案,但我不喜欢:

  • 将SPA静态托管在子路由下的服务器上:http://localhost:6200/my-app
  • 使NGINX反向proxy_passgoto:proxy_passhttp://localhost:6200/my-app/
  • 将vue.config.js文件的公共路径设置为:公共路径:/my-app
  • 不要设置vue.config.js的solkPath属性(删除它)。

这种配置的关键是vue.js前端浏览器知道自己位于 /my-app,可以向 /my-app托管的服务器发送请求,NGINX不会真正修改任何URI。

虽然这种配置可以工作,但我不喜欢Web服务器必须在子路由上承载静态文件,并且浏览器必须知道其vhost(publicPath)-除非这是标准做法??我认为浏览器知道它的公共路径(/my appX/)是可以接受的,因为它在历史模式下需要它。

PS.在生产中,我的带有相对公共路径的原始配置工作正常。它只是人力资源管理在发展中中断。

有人能解释一下这个问题吗?干杯

======更新1)找到修复程序,不确定这是否是唯一的修复程序。

我找到了我的vue。配置。js,devserver“public”属性设置不正确。根据webpack devserver文档,在浏览器中运行的devserver客户端(/sockjs node)代码将通过查看其窗口猜测服务器的位置。位置变量。但是,由于我是通过代理访问服务器的,所以在默认情况下它似乎无法处理这个问题。因此,他们的解决方案是设置“public”属性,使客户端直接与服务器对话(跨源请求)。。。如果你问我的话,我觉得有点不对劲。

因此,客户端sockjs节点现在直接从以下位置进行对话:http://localhost/my-appX/ 到http://lcoalhost:62xx/.

这就是(例如)my-app1的vue。配置。js现在看起来像:

module.exports = {
    // options...

    publicPath: "",
    
    devServer: {
        //disableHostCheck: true,
        https: false,
        public: "localhost:6200",  //// This line makes the client browser talk DIRECTLY to this address / server for hot reloading.
        host: "0.0.0.0" ,
        port: 6200,

    },

}

话虽如此,现在通过http,一切都能正常工作。但是更新NGINX以将请求升级为https,会导致webpack devserver sockjs节点抛出CORS错误。这是因为客户端/浏览器已升级为HTTPS,但webpack devserver仅为http。然而,为了解决这个问题,我只是制作了vue。配置。js devserver https,CORS错误消失。

这似乎更像是webpack devserver sockjs节点的问题/限制,而不是stackoverflow问题。我会把问题留在这里。


共有1个答案

濮阳研
2023-03-14

如果您想保持热重新加载(不确定这是否是您想要的),您必须添加这样一个位置

location /sockjs-node {
    proxy_pass http://nodefrontend_myapp;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
}
 类似资料:
  • 据我所知,问题必须与Ngnix反向代理和websockets如何路由有关。服务器对ping请求的答复似乎没有发送到客户端。但我似乎无法确定原因。任何帮助都是非常感谢的。

  • 主要内容:1. 代理服务器介绍,2. 将请求传递给代理的服务器,3. 传递请求标头,4. 配置缓冲区,5. 选择传出IP地址本文介绍代理服务器的基本配置。 您将学习如何通过不同协议将NGINX请求传递给代理的服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应缓冲。 代理服务器的基本配置目录 代理服务器介绍 将请求传递给代理的服务器 传递请求标头 配置缓冲区 选择传出IP地址 1. 代理服务器介绍 代理通常用于在多个服务器之间分配负载,无缝地显示来自不同网站的内容,或者通过

  • Nginx 是一个高性能的 HTTP 和反向代理服务器,代码完全用 C 实现,基于它的高性能以及诸多优点,我们可以把它设置为 hyperf 的前置服务器,实现负载均衡或 HTTPS 前置服务器等。 配置 Http 代理 # 至少需要一个 Hyperf 节点,多个配置多行 upstream hyperf { # Hyperf HTTP Server 的 IP 及 端口 server

  • 我试图使用Apache创建一个反向代理。我正在使用Apache为一个php应用程序提供服务,并在node中编写了一个使用Express的API。 在我的PHP应用程序中,我使用AJAX调用node来检索JSON。我希望使用端口80进行PHP应用程序中的调用,并使用Apache来表达一个反向代理。

  • 而且,如果我添加这样的内容: 单击它,我将正确地发送到,它显示中的内容。 这一切都按预期进行,而且非常完美。 我在这里做错了什么?我需要重写请求路径吗?

  • 我有一个带有Express和Socket.io(Ubuntu18.04)的Nodejs服务器应用程序。在nGinx(1.14)反向代理进入场景之前,它总是工作得很好。nginx服务器运行在Node.js应用程序的不同机器上,每个应用程序都在同一网络中的自己的虚拟机上。 2.1.1版本上的服务器和客户端。 我还尝试删除path选项,并为socket.io东西配置了一个特定的/位置(出于测试目的):