为了账号安全,请及时绑定邮箱和手机立即绑定

nginx websocket(16)

标签:
Nginx

获取全套nginx教程,请访问瓦力博客

websocket实现在HTTP连接的基础上,并通过HTTP中的Upgrade协议头将连接从HTTP升级到Websocket。这样就可以实现多次双向通讯,直到连接被关闭。小菜推荐有兴趣的小伙伴去看下这篇博客

ssl

1.nginx代理webscocket

nginx代理webscocket和代理一般服务请求一样,就是在客户端和服务器做一个转发。

ssl

2.websocket代理配置

演示websocket配置服务器端用nodejs,因为node环境很容易安装,测试也很简单。这里主要是演示nginx下如何配置websocket代理。

安装node环境

安装node环境具体请查nodejs 安装教程{:target="_blank"}

安装yarn

安装yarn,具体查看官方文档yarn 安装{:target="_blank"}

添加websocket库,cd /opt/app/websocket

yarn add ws

演示服务目录

/opt/app/websocket
|-node_modules
|-package.json
|-server.js
|-yarn.lock

/opt/app/code
|-index.html

/etc/nginx/cond.f
|-websocket.conf

websocket目录下面只需要注意server.js文件,其他文件都是通过yarn add ws命令自动生成的。

server.js

server文件是在服务器启动一个服务,端口为8010

console.log("start NodeServer"); 
var msg = ""; 
var webSocketServer = require('ws').Server;
var wss = new webSocketServer({port:8010});

wss.on('connection',function(ws){
   ws.send('hello!');
   ws.on('message',function(message){
      console.log( message);
      ws.send(message);
   })  
})

index.html

这个demo是自己写的,样式没有分开,主要是做一个简单的演示界面。

<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>	
	<style>
		*{
			margin:0;
			padding:0;
		}
		#app{
			margin:50px auto;
			width: 600px;
			border: 1px solid #000;
		}
		ul{
            height:500px;
            overflow: auto;
			list-style-type: none;
		}
		.receive{
			margin:5px 0;
			display: flex;			
			align-items: center;
			justify-contet: flex-start;
		}
		.send{
			margin:5px 0;
			display: flex;			
			align-items: center;
			justify-content: flex-end;
		}
		.s_avatar,.f_avatar{
			display:inline-block;
			width:50px;
			height:50px;
			line-height:50px;
			font-size:14px;
			text-align:center;
			color:#fff;
			background-color:#FF66FF;
			border-radius:50%;
		}
		.f_avatar{
			background-color:#199ED8;
		}
		p{
			background: #86DA51;
			height: 50px;
			line-height: 50px;
			border-radius: 19px;
			padding: 0 20px;
		}
		.input-box{
			margin:30px 0;
			display: flex;			
			justify-content: flex-start;
			align-items: center;
		}
		input{
			width:500px;
			height:50px;
		}
		button{
			width:100px;
			height:50px;
		}
	</style>
</head>
<body>


	<div id="app">
		<ul>
			<li v-for="mes in message">
				<div :class="[mes.type]" v-if="mes.type == 'receive'">
                     <span class="s_avatar"></span><p>{{mes.value}}</p>
				</div>
				<div :class="[mes.type]" v-else>
			        <p>{{mes.value}}</p><span class="f_avatar"></span>
				</div>
			</li>
		</ul>
		<div class="input-box">
			<input type="text" @keyup.enter="send" v-model="input">
			<button @click="send">发送</button>
		</div>
	</div>
	
</body>
</html>
<script src="https://cdn.bootcss.com/vue/2.5.21/vue.js"></script>
<script>
	var app = new Vue({
		el:'#app',
		data:function(){
			return {
				input:'',
				message:[],
				socket:null
			}
		},
		methods:{
			send(){
				let obj={'type':'send',value:this.input}
				this.message.push(obj);
				this.socket.send(this.input); 
			}
		},
		mounted(){
			let self = this;
			self.socket = new WebSocket('ws://walidream.com/websocket');
			self.socket.onopen = function () {
				console.log('开始连接!');				 
			};
			self.socket.onmessage = function (event) {
				let obj={'type':'receive',value:event.data}
				self.message.push(obj);
				//socket.close();
			};
			self.socket.onclose = function () {
				console.log('关闭连接!');
			};
			self.socket.onerror = function () {
				console.log('关闭连接出错!');
			};
			
		}
	
	})
</script>

websocket.conf

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

upstream websocket {
    server 127.0.0.1:8010;  #监听8010端口
}

server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    access_log  /var/log/nginx/host.access.log  main;

    location / {
        root /opt/app/code;
        index index.html;
    }

    location ~ ^/websocket {
        proxy_pass http://websocket;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;       
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

}

启动8010端口服务

cd /opt/app/websocket

运行

node ./server.js

在浏览器上输入域名访问http://www.walidream.com,下面是小菜配置好的demo

ssl

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消