Eu acho que o problema está em buffer. Conjunto:
proxy_buffering off;
dentro da configuração de localização do websocket.
Usando a versão de desenvolvimento do nginx (1.3.12). No meu arquivo relevante em sites habilitados:
upstream twisted {
server 127.0.0.1:8088;
}
server {
listen 80; ## listen for ipv4
server_name *.clurn.co.uk clurn.co.uk;
access_log /var/log/nginx/clurn.co.uk.access.log;
location / {
root /var/www/clurn.co.uk;
index index.html index.htm;
}
location /websocket {
proxy_pass http://twisted;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location /websocket/server {
deny all;
}
[...snip...]
}
A única diferença do exemplo no site do nginx é a capital u na atualização, que parecia ser necessário para que as instâncias Autobahn e / ou txWS reconheçam os websockets corretamente (não me lembro qual deles era atm).
Agora, se eu acessar os websockets via 127.0.0.1:8088
no servidor, então parece funcionar, mas se eu acessá-lo via 127.0.0.1/websockets
não, então tem que haver algo errado com o empacotamento do pacotes via nginx.
Se eu rodar netcat -l -p 8088
ao invés do Twisted websocket backend, eu posso ver que as requisições são idênticas se acessadas via nginx ou diretamente (originalmente elas não eram, mas mudar o "upgrade" para "Upgrade" fez o cabeçalho linha Connection: Upgrade
o mesmo), então esta parte está fazendo proxy corretamente.
No entanto, se eu fizer o telnet em 127.0.0.1:8088
e 127.0.0.1/websocket
, copiando e colando a solicitação correta, obtenho uma resposta com o 127.0.0.1:8088
direto e não com o 127.0.0.1/websocket
. O que estou fazendo de errado, e como posso configurá-lo para permitir websockets em ambos os lados?