如何使用 NGINX 作为使用 WebSockets 的 Wicket 应用程序的代理

How to use NGINX as a proxy for Wicket application using WebSockets

我有一个使用 WebSockets 的 Wicket 应用程序 运行 在端口 9090 上的 Jetty 中。我想做的是使用 NGINX 作为代理,这样用户就可以使用标准 80 端口访问该应用程序.

使用在此线程中找到的说明:

How do I configure nginx as proxy to jetty?

我已将以下条目添加到 /etc/nginx/sites-available/default:

location /myapp {
    proxy_pass       http://localhost:9090/myapp;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
}

但是现在当我通过 80 端口打开应用程序时,我可以在 Chrome 控制台中看到一个错误:

与 'ws://xxx.xxx.xxx.xxx/myapp/wicket/websocket?pageId=2&wicket-ajax-baseurl=whatmovie%3F2&wicket-app-name=myapp' 的 WebSocket 连接失败:WebSocket 握手期间出错:意外的响应代码:404

WebSockets 不再有效。所以我一直在谷歌搜索并找到了这个线程:

NGINX to reverse proxy websockets AND enable SSL (wss://)?

所以我在 NGINX 配置中添加了以下条目:

location /myapp/wicket/websocket {
    proxy_pass http://localhost:9090/myapp/wicket/websocket;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

在那之后,当我访问应用程序时,控制台不再有任何错误,我可以在日志中看到创建了 websockets。不幸的是,客户端和应用程序之间的通信似乎不再有效。有人可以帮我吗?

我的配置详情:

原来将 nginx 升级到 1.8.0-1 版本解决了这个问题。这就是我的 /etc/nginx/conf.d/default.conf:

的内容
server {
    listen       80;
    server_name  localhost;

    location /app {
        proxy_pass             http://localhost:9090/app;
        proxy_set_header       Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

}