如何在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
答案 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 :(得分: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;
。因此,以下是我的配置文件,似乎按预期工作。
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/";