nginx - WebSocket

nginx - WebSocket

因为工作涉及到使用nginx代理webSocket在加上最近本来就计划系统的学习一下nginx。正好先行一波。

随后会进行系统学习。

nginx linux安装

下载地址:http://nginx.org/en/download.html

window和linux版本自己选择

这里只写linux安装的笔记,下载安装包后上传至虚机或者服务器,也可以使用wget命令。

我下载的是稳定版本 1.18.0

## 解压
> tar -zxvf nginx-1.18.0.tar.gz
# 删除压缩包
> rm nginx-1.18.0.tar.gz
# 检查是否已经安装相关依赖
> yum list installed | grep "gcc"
> yum list installed | grep "pcre-devel"
> yum list installed | grep "zlib-devel"
> yum list installed | grep "openssl"
> yum list installed | grep "openssl-devel"
# 对未安装的进行安装  如果没全选需要使用su 
# yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
> yum -y install pcre-devel
# 再次检查安装依赖
> yum list installed | grep "pcre-devel"
#进入nginx目录
> cd nginx-1.18.0
# 配置
> ./configure --prefix=/usr/local/nginx
# make
> make
> make install
# 在 nignx目录下创建 logs目录并授权
> mkdir logs
> chmod 700 logs

# 启动nignx
# 切换到安装目录
> cd /usr/local/nginx
# 检查配置文件是否正确
> ./sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
# 启动nginx
> ./sbin/nginx -c /usr/local/nginx/conf/nginx.conf

# 测试链接 但是访问很遗憾访问失败了
# 检查端口开放情况 nginx默认是80端口 这里要看下centos版本,6.x和7.x命令可能不一样
# 查看centos版本命令 cat /etc/redhat-release
# 处理端口这比较乱要各种尝试,这里不写了以后需要了在进行总结吧

# 查看进程
> ps -ef |grep nginx
root      5973     1  0 10:12 ?        00:00:00 nginx: master process ./sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    5974  5973  0 10:12 ?        00:00:00 nginx: worker process  

代理webSocket

其实这部分官网写的很明白

参考地址: http://nginx.org/en/docs/http/websocket.html

这里我直接把我们的配置文件贴出来。

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    keepalive_timeout  65;

	# 定义变量 
	map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
       
    upstream websocket {
        server 127.0.0.1:8445;
    }
      
    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }           
    }
   
    server {
		# 监听端口
        listen       2345;
		# 地址
        server_name  10.1.109.202;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        #location / {
        #    root   html;
        #    index  index.html index.htm;
        #}
		
		location /ws {
           proxy_pass http://10.1.109.202:8445/ ;
		   
		   # 设置链接持续时间
		   proxy_read_timeout 300s;		   		  
		   
		   proxy_set_header Host $host;
 		   proxy_set_header X-Real-IP $remote_addr;
		   proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			
		   # 设置为webSocket
		   proxy_http_version 1.1;
		   proxy_set_header Upgrade $http_upgrade;
		   proxy_set_header Connection $connection_upgrade;
        }
			
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

页面调用代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>websocket通讯</title>
</head>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script>
    var socket;
    function openSocket() {
        if(typeof(WebSocket) == "undefined") {
            console.log("您的浏览器不支持WebSocket");
        }else{
            console.log("您的浏览器支持WebSocket");
            //实现化WebSocket对象,指定要连接的服务器地址与端口  建立连接
            //等同于socket = new WebSocket("ws://localhost:8888/xxxx/im/25");
            //var socketUrl="${request.contextPath}/wxCustomerService/"+$("#userId").val();
            // var socketUrl="http://10.11.32.153:8445/"+$("#userId").val();
            var socketUrl="http://10.1.109.202:2345/"+$("#userId").val();
            // var socketUrl="http://www.sinosafe.websocket/ws/"+$("#userId").val();
            socketUrl=socketUrl.replace("https","ws").replace("http","ws");
            console.log(socketUrl);
            if(socket!=null){
                socket.close();
                socket=null;
            }
            socket = new WebSocket(socketUrl);
            //打开事件
            socket.onopen = function() {
                console.log("websocket已打开");
                //socket.send("这是来自客户端的消息" + location.href + new Date());
            };
            //获得消息事件
            /* 
			socket.onmessage = function(msg) {
                console.log(msg.data);
                //发现消息进入    开始处理前端触发逻辑
            };
			*/
            //关闭事件
            socket.onclose = function() {
                console.log("websocket已关闭");
            };
            //发生了错误事件
            socket.onerror = function() {
                console.log("websocket发生了错误");
            }
			
			// 接收服务端数据时触发事件
			socket.onmessage = function (evt) {
			   var received_msg = evt.data;
			   var bcy = typeof(received_msg);
			   console.log(received_msg);
			   console.log(bcy);			 
			};
			
        }
    }
    function sendMessage() {
        if(typeof(WebSocket) == "undefined") {
            console.log("您的浏览器不支持WebSocket");
        }else {
            console.log("您的浏览器支持WebSocket");
            console.log('{"toUserId":"'+$("#toUserId").val()+'","contentText":"'+$("#contentText").val()+'"}');
            
            // socket.send('{"toUserId":"'+$("#toUserId").val()+'","contentText":"'+$("#contentText").val()+'"}');
            socket.send(JSON.stringify(getParam()));
        }
    }

    function getParam(){
        var data = {	
            "receiver":$("#toUserId").val(),
            "openId":$("#toUserId").val(),
            "messageType":"message",
            "optType":"",
            "clientType":"cusService",
            "sender":$("#userId").val(),                        
            "message":$("#contentText").val(),
            "senderName":"jimmy-001",
            "contentType":"text",            
            "scene":"1"            
        } 

        return data;
    }

</script>
<body>
<p>【userId】:<div><input id="userId" name="userId" type="text" value="jimmy"></div>
<p>【toUserId】:<div><input id="toUserId" name="toUserId" type="text" value="10"></div>
<p>【消息】:<div><input id="contentText" name="contentText" type="text" value="hello jimmy websocket"></div>
<p>【操作】:<div><input type="button" onclick="openSocket()">开启socket</input></div>
<p>【操作】:<div><input type="button" onclick="sendMessage()">发送消息</input></div>
</body>

</html>

2020年12月16日
补充如果涉及到Https,可以参考官网

http://nginx.org/en/docs/http/configuring_https_servers.html

需要在server中增加

server_name         www.example.com;
ssl_certificate     www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         HIGH:!aNULL:!MD5;

另外前端访问的时候使用 wss来访问即可

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值