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
来访问即可