Powyższe rozwiązanie Stephena Kargera jest poprawne, musisz się dostosować, aby skonfigurować serwer ELB do obsługi proxy. Oto dokumentacja AWS do wykonania dokładnie tego: http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html. Dokumenty są początkowo nieco zniechęcające, więc jeśli chcesz, możesz po prostu przejść do kroków 3 i 4 w sekcji Enable Proxy Protocol Using the AWS CLI
. Są to jedyne niezbędne kroki w celu umożliwienia channelingu proxy. Dodatkowo, jak zasugerował Stephen, musisz upewnić się, że twój ELB używa TCP
zamiast http
lub https
, ponieważ oba te elementy nie będą zachowywały się poprawnie z implementacją proxy ELB. Sugeruję przeniesienie twojego kanału gniazda z popularnych portów, takich jak 80 i 443, tak, aby nadal móc utrzymywać standardowe połączenia z ich domyślnym działaniem. Oczywiście nawiązanie tego połączenia zależy całkowicie od tego, jak wygląda stos aplikacji.
Jeśli to nie pomaga, można użyć pakietu npm
wscat
debugować połączeń websocket tak:
$ npm install -g wscat
$ wscat --connect 127.0.0.1
Jeśli połączenie działa w lokalnej, to jest na pewno wyważarki swój ładunek. Jeśli jednak nie, to prawie na pewno problem z hostem gniazda.
Dodatkowo narzędzie takie jak nmap
pomoże Ci odkryć otwarte porty. Miła lista kontrolna do debugowania:
npm install -g wscat
# can you connect to it from within the server?
ssh [email protected]
wscat -c 127.0.0.1:80
# can you connect to it from outside the server?
exit
wscat -c 69.69.69.69:80
# if not, is your socket port open for business?
nmap 69.69.69.69:80
Możesz także użyć nmap z serwera, aby odkryć otwarte porty. zainstalować nmap na ubuntu, po prostu sudo apt-get install nmap
. na osx, brew install nmap
Oto działająca konfiguracja, którą mam, mimo że obecnie nie obsługuje ssl. W tej konfiguracji mam port 80 zasilający moją aplikację szynową, port 81 zasilający gniazdo przez mój abel i port 82 otwarty dla wewnętrznych połączeń gniazdowych. Mam nadzieję, że to pomoże komuś !! Każdy, kto używa Railsów, jednorożca i Faye do wdrożenia, powinien uznać to za pomocne. :) szczęśliwy hacking!
# sets up deployed ruby on rails server
upstream unicorn {
server unix:/path/to/unicorn/unicorn.sock fail_timeout=0;
}
# sets up Faye socket
upstream rack_upstream {
server 127.0.0.1:9292;
}
# sets port 80 to proxy to rails app
server {
listen 80 default_server;
keepalive_timeout 300;
client_max_body_size 4G;
root /path/to/rails/public;
try_files $uri/index.html $uri.html $uri @unicorn;
location @unicorn {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded_Proto $scheme;
proxy_redirect off;
proxy_pass http://unicorn;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /path/to/rails/public;
}
}
# open 81 to load balancers (external socket connection)
server {
listen 81 proxy_protocol;
server_name _;
charset UTF-8;
location/{
proxy_pass http://rack_upstream;
proxy_redirect off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# open 82 to internal network (internal socket connections)
server {
listen 82;
server_name _;
charset UTF-8;
location/{
proxy_pass http://rack_upstream;
proxy_redirect off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Wygląda na to, że jest na 443. Jak to działa na porcie 80? Czy jest też tryb ELB w trybie HTTPS (nie TCP)? –
Port 80 jest obsługiwany przez pierwszy blok - po prostu przekierowuje do https. Jest w trybie TCP/SSL, więc działają websockets. –
Ten sam problem. Czy używasz Kubernetes przez przypadek? Próbuję to ustawić w klastrze Kubernetes i myślę, że może 'kube-proxy' miał coś z tym wspólnego. – iameli