使用NGINX的proxy_pass配置Webpack Dev Server

44

我正在尝试将webpack-dev-server运行在 Docker 容器内,并通过 NGINX 主机访问它。初始的index.html加载成功,但是与开发服务器的 Web Sockets 连接无法连接。

VM47:35 WebSocket连接到'ws://example.com/sockjs-node/834/izehemiu/websocket'失败:WebSocket握手过程中出错:意外的响应代码:400

我正在使用以下配置。

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;
}

upstream webpack_dev_server {
  server node;
}

server {
  server_name _;
  listen 80;
  root /webpack_dev_server;

  location / {
    proxy_pass http://webpack_dev_server;
  }

  location /sockjs-node/ {
    proxy_pass http://webpack_dev_server/sockjs-node/;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;  # pass the host header - http://wiki.nginx.org/HttpProxyModule#proxy_pass

    proxy_http_version 1.1;  # recommended with keepalive connections - http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version

    # WebSocket proxying - from http://nginx.org/en/docs/http/websocket.html
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
  }
}
1个回答

48

代理传递应该是您的webpack-dev-server容器的IP和端口,并且您需要使用proxy_redirect off;

location /sockjs-node {
    proxy_set_header X-Real-IP  $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header Host $host;

    proxy_pass http://node:8080; 

    proxy_redirect off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

同时不要忘记将投票功能添加到你的webpack-dev中间件中。

  watchOptions: {
    aggregateTimeout: 300,
    poll: 1000
  }

2
我在处理HTTPS服务器时遇到了一些问题,经过努力解决后,在这里发布了答案:https://dev59.com/UKDia4cB1Zd3GeqPDWxu。希望对其他遇到类似问题的人有所帮助。 - JoelParke
我曾经遇到过类似的问题(nx.dev + React + nginx),而且 proxy_redirect 并不是必需的。更重要的是,它可能是错误的,并导致无效的重定向。 - Paweł Szczur
你救了我的一天 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接