Eu tenho três blocos de servidores (hosts virtuais) para http e um para websocket na configuração do nginx (nginx 1.6.0, ubuntu 14.04).
server {
listen 80;
listen [::]:80;
server_name h3400.domain.com;
location / {
proxy_pass http://localhost:3400/;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
}
# this one for websocket on ws://h3400.domain.com:3000/
server {
listen 3000;
listen [::]:3000;
server_name h3400.domain.com;
location / {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
server {
listen 80;
listen [::]:80;
server_name h3500.domain.com;
location / {
proxy_pass http://localhost:3500/;
proxy_http_version 1.1;
proxy_set_header Host $host;
}
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name domain.com;
///other default nginx server block settings///
}
Agora, no console do desenvolvedor do navegador (mais recente, ff e chrome), escrevo:
var ws = new WebSocket('ws://domain.com:3000', 'Site');<br>
ws.readyState;
como resultado, obtenho:
> 1
Sequências de conexão que testei:
ws://domain.com:3000
ws://h3400.domain.com:3000
ws://h3500.domain.com:3000
E todas as strings de conexão fornecem um resultado: 1. Significa conexão bem-sucedida ao backend do websocket.
Ele ainda gera conexão com a porta 3001 (vejo nos logs do backend websocket) e não verifica server_name ou port, mas foi configurado como server_name h3400.domain.com;
e no início de cada bloco de servidor.
Tags nginx reverse-proxy