把官网的推送服务切换到了websocket了

把官网的推送服务切换到了websocket了

By lincanbin at 2017-12-26
1人收藏 • 8635人看过

TIM图片20171226174722.png

顺带把环境切换到了PHP 7.1。


https://github.com/lincanbin/Carbon-Forum/blob/d353b910ea4cc643a3d7f7b7d2d63f6c8f143330/console_run.sh

一键WebSocket部署脚本。

65 个回复 | 最后更新于 2017-12-28
lincanbin
2017-12-26
#1

参考的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;
}


lincanbin
2017-12-26
#2

blob.png

根据自己实际调整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天。

测试用户
2017-12-26
#4

看看推送

lincanbin
2017-12-26
#5

blob.png

✿青歌◞
2017-12-26
#6

这玩意有啥用?


lincanbin
2017-12-26
#7

回复#6 @✿青歌◞ :

推送资源占用较低。

✿青歌◞
2017-12-26
#8

我要弄成这样 怎么弄 还是说下个版本改好了直接用?

lincanbin
2017-12-26
#9

回复#8 @✿青歌◞ :

等下个版本直接用。

✿青歌◞
2017-12-26
#10

得了 坐等吧 

lincаnbin
2017-12-26
#11

WebSocket服务用的是什么?

不会是Node.js的SocketIO吧?

如果是,建议改成PHP技术栈中的Swoole.

Swoole内置了WebSocket服务实现,

只需用PHP填充几个事件回调函数完成自己的逻辑,

开发成本不会比SocketIO高.

lincanbin
2017-12-26
#12

回复#11 @lincаnbin :

PHP的,没用Swoole,担心部署麻烦。

怕很多用户部署不起来。

不担心部署问题的话,我直接Socket.IO走起了。

lincanbin
2017-12-26
#13

blob.png

这个socket连了25分钟也没掉线,还可以。

lincаnbin
2017-12-26
#14

回复#12 @lincanbin :

我现在开发的问答社区,全部都是基于Swoole实现,包括消息通知.

不过消息通知没有使用WebSocket,仍然使用HTTP协议.

HTTP长连接(AJAX长轮询)兼容性更好.

Swoole内置HTTP和WebSocket等协议,还是非常简单易用的.

当然,PHP-CLI服务对虚拟主机部署不友好,的确是事实.

lincanbin
2017-12-26
#15

回复#14 @lincаnbin :

所以我现在这个是两套方案,你看下代码就知道了。
Long polling和websocket共存,取兼容方案。

lincаnbin
2017-12-26
#16

回复#15 @lincanbin :

假设使用HTTP长连接的用户foo给使用WebSocket的用户bar发送一条私信,你是怎么推送消息给用户bar的?也就是你的消息中间件用的是什么?我用的是Redis的PubSub.

lincanbin
2017-12-26
#17

回复#16 @lincаnbin :

Memcache轮询。

lincanbin
2017-12-26
#18

回复#16 @lincаnbin :

你的方案部署难度更高了。

lincаnbin
2017-12-26
#19

回复#17 @lincanbin :

嗯,看得出来,你还是热衷于使用PHP原有的那套同步方案来做功能.

轮询Memcached倒是压力不大.

虽然可行,但是对高并发可能不友好.

Swoole + Redis PubSub 这种异步的编程思想在IM上还是更适合的.

基于这套方案,有兴趣搞个WebIM和棋牌游戏都是可以的.


登 录


现在注册

QQ  登 录    Weibo  登 录    GitHub  登 录