把官网的推送服务切换到了websocket了
- 登录后方可回帖
参考的config.php
define('WebSocketFrontendPort', '443'); define('WebSocketBackendPort', '2000');
参考的Nginx配置:
server { listen 80; listen [::]:80; listen 443 ssl http2; listen [::]:443 ssl http2; server_name www.94cb.com 94cb.com m.94cb.com api.94cb.com cdn.94cb.com; ssl on; ssl_certificate_key /etc/letsencrypt/live/www.94cb.com/privkey.pem; ssl_certificate /etc/letsencrypt/live/www.94cb.com/fullchain.pem; set $redirect_to_https 1; if ($host = 'cdn.94cb.com') { set $redirect_to_https 0; } if ($scheme = https) { set $redirect_to_https 0; } if ($redirect_to_https = 1) { rewrite ^(.*) https://$host$1 permanent; } root /www/web/carbon/public_html; index index.html index.php index.htm; include /www/web/carbon/public_html/nginx.conf; # 开启SSL的WebSocket的配置主要是这部分,如果没使用SSL可以不需要配置这个 location /push { # redirect all HTTP traffic to localhost:2000 proxy_pass http://127.0.0.1:2000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; # WebSocket timeout proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d; } location ~ \.php(.*)$ { fastcgi_pass unix:/tmp/php-71-cgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $DOCUMENT_ROOT$fastcgi_script_name; fastcgi_param PATH_INFO $2; include fcgi.conf; } #图片缓存7天 location ~.*\.(gif|jpg|jpeg|png|bmp|swf|ico)$ { expires 7d; } #js css缓存1天 location ~.*\.(js|css|html)$ { expires 24h; } access_log /www/web_logs/94cb.com_access.log wwwlogs; error_log /www/web_logs/94cb.com_error.log; }
根据自己实际调整Nginx的最大超时时间,我因为用了WSS,所以是用Nginx proxy实现的websocket加密传输。
根据自己情况修改keepalive_timeout等各种timeout。
爆栈网有相关文章:https://stackoverflow.com/questions/10550558/nginx-tcp-websockets-timeout-keepalive-config
proxy_connect_timeout 7d; proxy_send_timeout 7d; proxy_read_timeout 7d;
浏览器会发送ping pong心跳包,所以这个socket长一些也没事,我设置了7天。
回复#6 @✿青歌◞ :
推送资源占用较低。
回复#8 @✿青歌◞ :
等下个版本直接用。
WebSocket服务用的是什么?
不会是Node.js的SocketIO吧?
如果是,建议改成PHP技术栈中的Swoole.
Swoole内置了WebSocket服务实现,
只需用PHP填充几个事件回调函数完成自己的逻辑,
开发成本不会比SocketIO高.
回复#12 @lincanbin :
我现在开发的问答社区,全部都是基于Swoole实现,包括消息通知.
不过消息通知没有使用WebSocket,仍然使用HTTP协议.
HTTP长连接(AJAX长轮询)兼容性更好.
Swoole内置HTTP和WebSocket等协议,还是非常简单易用的.
当然,PHP-CLI服务对虚拟主机部署不友好,的确是事实.
回复#14 @lincаnbin :
所以我现在这个是两套方案,你看下代码就知道了。
Long polling和websocket共存,取兼容方案。
回复#15 @lincanbin :
假设使用HTTP长连接的用户foo给使用WebSocket的用户bar发送一条私信,你是怎么推送消息给用户bar的?也就是你的消息中间件用的是什么?我用的是Redis的PubSub.
回复#16 @lincаnbin :
Memcache轮询。
回复#16 @lincаnbin :
你的方案部署难度更高了。
回复#17 @lincanbin :
嗯,看得出来,你还是热衷于使用PHP原有的那套同步方案来做功能.
轮询Memcached倒是压力不大.
虽然可行,但是对高并发可能不友好.
Swoole + Redis PubSub 这种异步的编程思想在IM上还是更适合的.
基于这套方案,有兴趣搞个WebIM和棋牌游戏都是可以的.