把官网的推送服务切换到了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和棋牌游戏都是可以的.


