2017-01-25 17 views
8

Jak skonfigurować websockets z PHP w nginx?Sieci web PHP z nginx przez SSL

Mam spojrzał na tym kursie, ale nie mogę zrobić to praca

https://www.sanwebe.com/2013/05/chat-using-websocket-php-socket

skopiowano trzy pliki do głównego katalogu www

/index.php /jquery-3.1.1.js /websocket/server.php

W index.php zmieniłem URI

var wsUri = "wss://domain.com/websocket/server.php"; 

W nginx Dodałem ten

http { 
    map $http_upgrade $connection_upgrade { 
     default upgrade; 
     ''  close; 
    } 
    server { 
     location /websocket/ { 
      proxy_pass https://domain.com:9000/websocket/server.php; 
      proxy_http_version 1.1; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection $connection_upgrade; 
     } 
    } 
} 

http://nginx.org/en/docs/http/websocket.html

Aby uruchomić serwer websocket

php -q /var/www/websocket/server.php 

czat znajduje się https://domain.com/chat.php i ładunku, ale ten błąd na czacie okno Error Occurred - Connection closed

też próbował się połączyć za pomocą tego narzędzia, ale ten błąd

http://www.websocket.org/echo.html

ERROR: undefined 
DISCONNECTED 

żądanie przez przeglądarkę

wss://domain.com/websocket/server.php 


ERR_DISALLOWED_URL_SCHEME 
+1

Zakładam, że błąd jest wyświetlany w oknie przeglądarki, nie nginx lub dzienniki PHP. Czy przypadkiem używasz Google Chrome do przetestowania tego (https://productforums.google.com/forum/#!topic/chrome/leVmLPNVISI)? Jeśli tak, spróbuj z inną przeglądarką. –

+0

Tak, błąd występuje w przeglądarce Google Chrome .. Próbowałem również z FF .. Tutaj nawet nie dostaję błędu – clarkk

+1

Spróbuj podsłuchać ruch między klientem a nginx i nginx i php, respectivley, używając np. 'tcpdump', aby sprawdzić, czy konfiguracja działa zgodnie z oczekiwaniami na poziomie sieci. –

Odpowiedz

2

Używasz portu 9000 w konfiguracji nginx, podczas gdy wbudowany serwer WWW PHP działa na porcie 8000.

Spróbuj zmienić port na 8000 i zobacz i f to rozwiązuje.

proxy_pass http://domain.com:8000/websocket/; 

Edit:

chodzi ERR_DISALLOWED_URL_SCHEME

Chrome od wersji ~ 50 wymaga, aby cała komunikacja websocket być over SSL. Prawdopodobnie będziesz musiał włączyć tę funkcję, aby aplikacja działała w Chrome.

Masz dwie opcje:

  1. użyć certyfikat wystawiony przez zaufany urząd certyfikacji
  2. Dodaj certyfikat ręcznie do swoich korzeni zaufanych certyfikatów. Twoja aplikacja internetowa nie będzie działać dla każdego, kto nie robi tego ręcznie
+0

Ten sam błąd przy żądaniu adresu URL strony internetowej 'ERR_DISALLOWED_URL_SCHEME' – clarkk

+0

Zmieniono teraz konfigurację nginx, aby uruchomić SSL, ale nadal otrzymuję ten sam błąd: – clarkk

+0

Czy certyfikat, który używasz samopodpisany? Chrome może odrzucić to z tego powodu –

1

Zauważyłem kilka trzasków w twoim pliku konfiguracyjnym; moje obserwacje są następujące:

  • Uruchomienie php -q /var/www/websocket/server.php uruchomi prosty serwer gniazd.To nie będzie SSL; myślę, że właśnie dlatego przekazujesz to przez nginx. prawda?
  • Tak więc proxy_pass https://domain.com:9000/websocket/server.php; nie powinno być https. Nie potrzebujesz również pełnej ścieżki, ponieważ jest to proste gniazdo TCP, a nie ścieżka pliku. W związku z tym wystarczy proxy_pass http://127.0.0.1:9000;.
  • Jeśli implementujesz SSL w nginx; gdzie są te ustawienia?
  • We wszystkich nowych przeglądarkach; nie można uzyskać dostępu do niezabezpieczonych zasobów http lub ws z zabezpieczonej strony https.

W ten sposób jest mój plik konfiguracyjny, który wydaje się działać zgodnie z przeznaczeniem.

server { 
    listen 8080 default_server; 
    listen 8443 ssl; 

    ssl_certificate /home/ubuntu/Desktop/php-sock/newcert.pem; 
    ssl_certificate_key /home/ubuntu/Desktop/php-sock/newkey.pem; 

    root /home/ubuntu/Desktop/php-sock; 

    index index.php index.html index.htm; 

    location/{ 
     try_files $uri $uri/ =404; 
    } 

    location ~ \.php$ { 
     include snippets/fastcgi-php.conf; 
     fastcgi_pass unix:/run/php/php7.0-fpm.sock; 
    } 

    location /websocket/ { 
     proxy_pass http://127.0.0.1:9000; 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_read_timeout 86400; 
    } 
} 

dokonać również zmiany w index.php do var wsUri = "wss://localhost:8443/websocket/";