2016-04-21 20 views
1

Also habe ich versucht, eine Rails-App mit Bryan Bates private_pub-Juwel (ein Wrapper für das Faye-Juwel) zu erstellen, um Chat-Kanäle zu erstellen. Es funktioniert gut auf meinem lokalen Computer im Dev-Modus.faye private_pub rails ubuntu verbindung abgelehnt

ich auch den private_pub Server auf Port 8080 zur gleichen Zeit meiner Rails-Anwendung startet, indem eine initializer Datei mit den Linien Boote:

Thread.new do 
    system("rackup private_pub.ru -s thin -E production -p 8080") 
end 

jedoch nach der Bereitstellung zu aws EC2-Instanz mit ubuntu Der Nginx-Webserver und der Puma-App-Server zeigen die Chrome-Konsole alle zwei Sekunden an und die Echtzeit-Chat-Funktionen funktionieren nicht.

GET http://localhost:8080/faye.js net::ERR_CONNECTION_REFUSED 

Wenn ich Port öffnen 8080 in meiner aws Sicherheitsgruppe, kann ich den großen Teil von JavaScript-Code in faye.js sehe mit curl von localhost: 8080/faye.js, wenn ich in die Instanz ssh. Ich kann auch von meinem Browser aus darauf zugreifen, wenn ich auf http://my.apps.public.ip:8080/faye.js gehe. Ich kann nicht darauf zugreifen, wenn ich 8080 aus der Sicherheitsgruppe entferne, also glaube ich nicht, dass dies ein Firewall-Problem ist.

Wenn ich die Adresse von localhost in 0.0.0.0 oder die öffentliche IP für meine ec2-Instanz ändere, ist der Chrome-Konsolenfehler verschwunden, aber der Echtzeit-Chat funktioniert immer noch nicht.

Ich vermute, ich könnte mehr Konfiguration zu tun haben, nginx, weil alles, was ich bisher getan haben die nginx-Server in/etc/nginx/sites-available/default zu konfigurieren, die ich habe:

upstream app { 
    server unix:/home/deploy/myappname/shared/tmp/sockets/puma.sock fail_timeout=0; 
} 

server { 
    listen 80; 
    server_name localhost; 

    root /home/deploy/myappname/public; 

    try_files $uri/index.html $uri @app; 

    location/{ 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header Host $host; 
    proxy_redirect off; 
    proxy_http_version 1.1; 
    proxy_set_header Connection ''; 
    proxy_pass http://app; 
    } 

    location ~ ^/(assets|fonts|system)/|favicon.ico|robots.txt { 
    gzip_static on; 
    expires max; 
    add_header Cache-Control public; 
    } 

    error_page 500 502 503 504 /500.html; 
    client_max_body_size 4G; 
    keepalive_timeout 10; 
} 

Aber vielleicht hat das auch nichts mit nginx zu tun, ich bin ziemlich verloren. Hat jemand dies erfahren oder könnte es eine alternative Lösung vorschlagen? Ich könnte hier bei Bedarf zusätzliche Konfigurationsdateien posten.

+0

Ich habe keine vollständige Antwort, aber ich kann einen Teil des Problems mit Ihrer Verwendung von 'server_name localhost;' in nginx feststellen. Chrome weist darauf hin, dass dies dem Client (in diesem Fall) die Verbindung zu Ihnen mit dem Namen "localhost" sagt, und Sie erhalten daher die GET http: // localhost: 8080/faye.js net :: ERR_CONNECTION_REFUSED 'weil Ihr Browser versucht, sich mit localhost: 8080 (Ihrem eigenen Computer) zu verbinden, der die Verbindung ablehnt, da Sie keinen Server betreiben. Siehe hier für Hilfe zu server_name: http://nginx.org/en/docs/http/server_names.html –

+0

Vielen Dank Ian, ich denke, Sie haben Recht.Nachdem Sie darauf hingewiesen haben, erkannte ich, dass der Grund, warum ich den Fehler in Chrome sehe und manchmal nicht, weil ich manchmal auch den Faye-Server auf meinem lokalen Rechner habe. Ich habe es getestet, indem ich meine Haupt-App gestartet habe, ohne den Faye-Server lokal zu starten, und ich sehe den gleichen Fehler. Jetzt muss ich nur die richtige Nginx-Konfiguration für einen Faye-Server finden. Danke vielmals! – ChaiTea

+1

Es sieht so aus, als könntest du es entweder als IP deines AWS-Servers einstellen (wenn es statisch ist) oder, wenn du dich verrückt fühlst, ist _ _ (Unterstrich) ein Catch-All. Das bedeutet, dass eine Verbindung (zu Port 80) akzeptiert wird. Dies wird hauptsächlich verwendet, damit ein Server mehrere Websites hosten kann und ordnungsgemäß weitergeleitet wird. Ich habe auch gerade beim Start bemerkt, dass es Port 8080 verwendet, und Ihre Konfiguration nur 80 gesetzt hat, also gibt es das auch ... –

Antwort

1

Gelöst

erste habe ich Ian Rat und setzen server_name auf meine öffentliche IP-

dann

basierend auf Führung von http://www.johng.co.uk/2014/02/18/running-faye-on-port-80/

ich den Standort Block

hinzugefügt
location ^~ /faye { 
    proxy_pass   http://127.0.0.1:9292/faye; 
    proxy_redirect  off; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    proxy_http_version 1.1; 
    proxy_buffering off; 
    proxy_cache_bypass $http_pragma $http_authorization; 
    proxy_no_cache  $http_pragma $http_authorization; 
    } 

schließlich für meine private_pub.yml stellte ich den faye Einstiegspunkt für die Produktion:

production: 
    server: "http://my.public.ip:80/faye/faye" 
    secret_token: "mysecrettoken" 
    signature_expiration: 3600 # one hour 

und jetzt in meinem app das Chatten als viel schneller reagiert, als ich den Remote-Standalone-Chat-Server mit I auf Heroku setzte auf weil sowohl der Chat-Server als auch meine Haupt-App in derselben Instanz laufen.

Verwandte Themen