我目前正在开发多个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问题。我会把问题留在这里。
如果您想保持热重新加载(不确定这是否是您想要的),您必须添加这样一个位置
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东西配置了一个特定的/位置(出于测试目的):