作为程序员一定要保持良好的睡眠,才能好编程

nginx配置websocket支持wss

发布时间:2019-05-10

nginx配置websocket支持wss



wss 只能在https的环境下使用。


wss的使用需要websocket服务器的支持。


我websocket服务器使用的是  swoole,swoole原本是不支持 wss的,我这里把原有的代码进行了一定的修改,修改如下:

$anhao = new swoole_websocket_server(
	$swoole_config[ENV . '_server']['host'],
	$swoole_config[ENV . '_server']['port'],
	SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL
);

//第四个参数采用了 swoole_ssl  那么必须  配置sslConfig 中的两个文件,否则系统支持wss的支持。

$sslConfig = [
'ssl_key_file' => '/data/home/songyongzhan/sslCrt/a-test.com.key',
'ssl_cert_file' => '/data/home/songyongzhan/sslCrt/a-test.com.crt'
];

$anhao->set(array_merge($swoole_config[ENV . '_swoole'],$sslConfig));


以上是swoole的配置文件。




那么nginx如何支持wss呢?


首先站点需要是https的,https站点如何配置,请到  进行详细查看。




我这里简单的把80 端口强制跳转到https 443端口上的配置提供出来,如下:



server {
        listen       80;
        server_name a-test.com ;
        access_log /data/log/nginx/songyongzhan/guahaodoctor_im main;
        error_log /data/log/nginx/songyongzhan/guahaodoctor_im.error;
        rewrite ^(.*)$  https://$host$1 permanent;
} 



server {
        listen       443;
        server_name a-test.com ;
        root   /data/home/songyongzhan/doctorworkerim/public/;
        index  index.php index.html index.htm;
        access_log /data/log/nginx/songyongzhan/guahaodoctor_webim main;
        error_log /data/log/nginx/songyongzhan/guanhaodoctor_webim.error;

        ssl on;
        #证书
        ssl_certificate /data/home/songyongzhan/sslCrt/a-test.com.crt;
        #私钥
        ssl_certificate_key /data/home/songyongzhan/sslCrt/a-test.com.key;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        fastcgi_param HTTPS on;
        fastcgi_param HTTP_SCHRMR https;

        location / {
        try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
                expires      3d;
                access_log off;
        }
        location ~ .*\.(js|css)?$ {
                expires      1d;
                access_log off;
        }
        location ~ /\. {
                access_log off;
                deny all;
		}		
		location ~ \.php$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                include        fastcgi_params;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
        location /index.php {
                fastcgi_pass 127.0.0.1:9000;
                include        fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root/index.php;
        }
        error_page 404 /404.html;
}



nginx 支持wss配置如下

map $http_upgrade $connection_upgrade {  
    default upgrade;  
    '' close;  
}  

upstream syzwebsocket {
        server 127.0.0.1:1130 weight=1;
}
server {
        listen      1129;
        server_name a-test.com;

        ssl on;
        #证书
        ssl_certificate /data/home/songyongzhan/sslCrt/a-test.com.crt;
        #私钥
        ssl_certificate_key /data/home/songyongzhan/sslCrt/a-test.com.key;
        ssl_verify_client off;
        ssl_session_timeout 20m;
        location / {
                proxy_pass http://syzwebsocket;
                proxy_read_timeout 300s;
                proxy_send_timeout 300s;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
        }
}



127.0.0.1:1129是真正的服务端地址,nginx所在域名是a-test.com,代理的端口号是1129,所以前端访问的时候这样配置:


WEBSOCKET_URL: 'wss://a-test.com:1129',  



通过上面的配置 ,采用  /usr/local/nginx/sbin/nginx -t 进行检测是否正确,如果正确 使用 /usr/local/nginx/sbin/nginx -s reload  进行重新启动。




2.png



可以看到,系统已经正常执行了。 




https://www.jianshu.com/p/def7027b787f


这篇文章是真谛,使用NGINX  将 wss 转换成  ws 

https://blog.csdn.net/chopin407/article/details/52937645



说明下:这个是通过nginx将wss反向代理成ws,服务端仍然是ws,而不是wss代理到wss


 用了这个配置出现502 bad gateway




server {
        listen      1129;
        server_name guahao-test.com;
        ssl on;
        #证书
        ssl_certificate /data/home/songyongzhan/sslCrt/guahao-test.com.crt;
        #私钥
        ssl_certificate_key /data/home/songyongzhan/sslCrt/guahao-test.com.key;
        ssl_verify_client off;
        ssl_session_timeout 20m;
        location / {
                proxy_pass http://127.0.0.1:1130;
                proxy_read_timeout 300s;
                proxy_send_timeout 300s;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "Upgrade";
        }
}



/data/home/songyongzhan/im/server.php &




//$anhao = new swoole_websocket_server(
//  $swoole_config[ENV . '_server']['host'],
//  $swoole_config[ENV . '_server']['port'],
//  SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL
//);
//
//
//$sslConfig = [
//  'ssl_key_file' => '/data/home/songyongzhan/sslCrt/guahao-test.com.key',
//  'ssl_cert_file' => '/data/home/songyongzhan/sslCrt/guahao-test.com.crt'
//];
//
//$anhao->set(array_merge($swoole_config[ENV . '_swoole'],$sslConfig));