65 个回复 | 最后更新于 2017-12-28
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;
}


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

看看推送

2017-12-26   #5

blob.png

2017-12-26   #6

这玩意有啥用?


2017-12-26   #7

回复#6 @✿青歌◞ :

推送资源占用较低。

2017-12-26   #8

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

2017-12-26   #9

回复#8 @✿青歌◞ :

等下个版本直接用。

2017-12-26   #10

得了 坐等吧 

2017-12-26   #11

WebSocket服务用的是什么?

不会是Node.js的SocketIO吧?

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

Swoole内置了WebSocket服务实现,

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

开发成本不会比SocketIO高.

2017-12-26   #12

回复#11 @lincаnbin :

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

怕很多用户部署不起来。

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

2017-12-26   #13

blob.png

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

2017-12-26   #14

回复#12 @lincanbin :

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

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

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

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

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

2017-12-26   #15

回复#14 @lincаnbin :

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

2017-12-26   #16

回复#15 @lincanbin :

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

2017-12-26   #17

回复#16 @lincаnbin :

Memcache轮询。

2017-12-26   #18

回复#16 @lincаnbin :

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

2017-12-26   #19

回复#17 @lincanbin :

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

轮询Memcached倒是压力不大.

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

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

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

登录后方可回帖

登 录
信息栏

Carbon Forum是一个基于话题的高性能轻型PHP论坛

下载地址:Carbon Forum v5.9.0
QQ群:12607708(QQ我不常上)

donate

手机支付宝扫描上方二维码可向本项目捐款

粤公网安备 44030602003677号
粤ICP备17135490号

Loading...