我的Spring启动应用程序有一个websocket入口点,Web浏览器客户端连接,服务器将流式传输数据。
问题是,当我将应用程序置于nginx代理后面时,它无法正常工作:javascript客户端已连接,在服务器端调用afterConnectionEstablished方法,但会话中没有任何内容发送来自服务器。
我知道服务器应该发送一些内容,因为如果我直接使用实例端口进行定位,则应用程序可以正常运行。
奇怪的是,在nginx上使用与python中的另一个应用程序相同的配置,nginx代理正常工作。
这是我的配置:
Nginx:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream myupstream{
server myserver:myport;
}
server {
listen 80 ;
listen [::]:80 ;
server_name mydomain.tld;
location / {
proxy_pass http://myupstream;
}
location /user {
proxy_pass http://myupstream;
proxy_redirect off;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /media {
proxy_pass http://myupstream;
proxy_redirect off;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Application Spring Boot(仅限websocket配置部分)
@Configuration
@EnableWebSocket
public class WebsocketSpringBootConfigurator implements WebSocketConfigurer {
@Autowired
private UserWsEndpoint userWsEndpoint;
@Autowired
private MediaWsEndpoint mediaWsEndpoint;
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(MediaWsEndpoint(), "/media").addInterceptors(new HttpSessionHandshakeInterceptor());
registry.addHandler(UserWsEndpoint(), "/user").addInterceptors(new HttpSessionHandshakeInterceptor());
}
@Bean
public WebSocketHandler MediaWsEndpoint() {
return mediaWsEndpoint;
}
@Bean
public WebSocketHandler UserWsEndpoint() {
return userWsEndpoint;
}
Thx!