通过SSL使用nginx的PHP websockets

时间:2017-01-25 00:55:55

标签: php nginx websocket

如何在nginx中使用PHP设置websockets?

我看过这个教程,但无法使其正常工作

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

已将这三个文件复制到www目录的根目录

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

index.php我更改了URI

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

在nginx中我添加了这个

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

启动websocket服务器

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

聊天位于https://domain.com/chat.php并加载但在聊天窗口中出现此错误Error Occurred - Connection closed

还尝试通过此工具进行连接,但收到此错误

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

ERROR: undefined
DISCONNECTED

如果通过浏览器请求

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


ERR_DISALLOWED_URL_SCHEME

2 个答案:

答案 0 :(得分:2)

您在nginx配置中使用端口9000,而PHP的内置Web服务器在端口8000上运行。

尝试将端口更改为8000并查看是否可以解析它。

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

编辑:

关于ERR_DISALLOWED_URL_SCHEME

Chrome,因为~50版,要求所有websocket通信都通过SSL。您可能需要启用此功能才能让您的应用在Chrome中运行。

您有两种选择:

  1. 使用由受信任的证书颁发机构颁发的证书
  2. 手动将证书添加到受信任的证书根目录。您的网络应用程序不适用于没有手动执行此操作的任何人

答案 1 :(得分:1)

我在配置文件中发现了一些故障;我的观察如下:

  • 运行php -q /var/www/websocket/server.php将启动简单套接字服务器。它不会成为SSL;我猜你为什么要通过nginx传递它。不是吗?
  • 因此proxy_pass https://domain.com:9000/websocket/server.php;不应该是https。你也不需要完整的路径,因为它是一个简单的tcp套接字而不是文件路径。因此,只需要proxy_pass http://127.0.0.1:9000;
  • 如果您在nginx上实施SSL;那些设置在哪里?
  • 在所有新浏览器中;您无法从安全的https页面访问不安全的http或ws资源。

因此,以下是我的配置文件,似乎按预期工作。

 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;
    }
}

同时在index.php改为var wsUri = "wss://localhost:8443/websocket/";