Nginx 配置 WebSocket 代理

Nginx 配置 WebSocket 代理

文章目录

  • [Nginx 配置 WebSocket 代理](#Nginx 配置 WebSocket 代理)
    • [Linux 查看安装文件命令手册](#Linux 查看安装文件命令手册)
    • [Nginx 日志配置方案](#Nginx 日志配置方案)
    • [成功解决问题--使用 Nginx 代理 WebSocket](#成功解决问题--使用 Nginx 代理 WebSocket)
    • 可能出现的问题

Nginx 官方文档网址 nginx documentation

nginx 复制代码
...
http:{
  ...
  server{
    ...
    # WebSocket代理
    location /wsUrl/ {
      rewrite ^/wsUrl/(.*)$ /$1 break; #拦截标识去除
      proxy_pass http://192.168.100.20:8080; #这里是http不是ws,不用怀疑,代理的ip和port写ws访问的实际地址
      proxy_http_version 1.1; #这里必须使用http 1.1
      #下面两个必须设置,请求头设置为ws请求方式
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
    }
    ...
  }
  ...
}

官方文档代理样例

nginx 复制代码
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    map $http_upgrade $connection_upgrade {
		default upgrade;
		''      close;
	}
	
    server {
        listen       9001;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location ^~ /websocket {
            proxy_pass http://localhost:8090/;
            proxy_http_version 1.1;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_read_timeout 120s;

            proxy_set_header Upgrade websocket;
            proxy_set_header Connection Upgrade;
        }
    }
}

Linux 查看安装文件命令手册

!起因

我使用指令 whereis nginx 跳出来了很多路径,但是我不太明白每个路径是什么意思,就仔细去看了看,然后发现了一个路径 /usr/share/man/man8/ 这个目录,下面一般都是手册路径,在这里面可以看很多软件的基本指令操作 可使用指令 man nginx 来查看 nginx.8.gz 手册。

Nginx 日志配置方案

可以参考 Nginx访问日志(access_log)配置及信息详解_nginx access.log配置-CSDN博客

一般使用 main 格式

如下

复制代码
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                       '$upstream_addr $upstream_response_time $request_time ';
access_log  logs/access.log  main;
  • $remote_addr: 客户端的IP地址。
  • $remote_user: 使用HTTP基本身份验证的情况下,远程用户的用户名。
  • $time_local: 本地时间的访问时间。
  • $request: 客户端请求的内容。
  • $status: 服务器响应的HTTP状态码。
  • $body_bytes_sent: 发送给客户端的字节数,不包括响应头的大小。
  • $http_referer: 引用页面的URL。
  • $http_user_agent: 客户端的User-Agent字符串,标识客户端的浏览器和操作系统等信息。
  • $http_x_forwarded_for: X-Forwarded-For 头,用于标识原始客户端的IP地址,当请求通过代理服务器时使用。
  • $upstream_addr: 后端(上游)服务器的IP地址。
  • $upstream_response_time: 从后端服务器接收响应的时间。
  • $request_time: 客户端发起请求到收到响应的总时间。

!错误

配置 nginx 日志的时候,由于不知道要将 log_format main 配置放在哪里,就放在了最外层,导致错误提示 nginx: [emerg] "log_format" directive is not allowed here in /etc/nginx/nginx.conf:14

后序解决是 将 log_format main 放在 http {} 里面就解决问题了

成功解决问题--使用 Nginx 代理 WebSocket

nginx.conf具体配置如下, 实现的功能是将所有发往 10.6.30.185:9001 的请求去匹配一下 url

里面有没有 /websocket 这一级,如果有就使用 WebSocket 请求发往 10.6.3.46:8001 ,后序使用了6台服务器进行了一个 nginx 代理 WebSocket 操作,都能够在后台读取到信息,同时,后台也能够推送信息过去。

nginx 复制代码
user nobody;  
worker_processes  6;  
  
  
#nginx 开启多核设置,目前185的机子,都是6核  
worker_cpu_affinity 000001 000010 000100 001000 010000 100000;  
#error_log  logs/error.log;  
#error_log  logs/error.log  notice;  
#error_log  logs/error.log  info;  
  
  
error_log  /var/log/nginx/error.log info;  
  
#进程文件  
pid        /var/run/nginx.pid;  
  
worker_rlimit_nofile 1024;  
  
events {  
    use epoll; # 修改这里  
    worker_connections  1024;  
}

# 设置http 服务器  
http {  
    include       mime.types; #文件扩展名与文件类型映射表  
    default_type  application/octet-stream; #默认文件类型  
    charset utf-8; #默认编码  
    fastcgi_connect_timeout 2000;  
    fastcgi_send_timeout 2000;  
    fastcgi_read_timeout 2000;  
    client_max_body_size 1024m;  
    sendfile on;  
    tcp_nopush on;  
    tcp_nodelay on;  
    keepalive_timeout 120;  
    gzip  on;  
    limit_req_zone $binary_remote_addr zone=test:10m rate=10r/s;  
  
    #日志配置  
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '  
                          '$status $body_bytes_sent "$http_referer" '                          '"$http_user_agent" "$http_x_forwarded_for"'                           '$upstream_addr $upstream_response_time $request_time ';  
            #$remote_addr: 客户端的IP地址。  
            #$remote_user: 使用HTTP基本身份验证的情况下,远程用户的用户名。  
            #$time_local: 本地时间的访问时间。  
            #$request: 客户端请求的内容。  
            #$status: 服务器响应的HTTP状态码。  
            #$body_bytes_sent: 发送给客户端的字节数,不包括响应头的大小。  
            #$http_referer: 引用页面的URL。  
            #$http_user_agent: 客户端的User-Agent字符串,标识客户端的浏览器和操作系统等信息。  
            #$http_x_forwarded_for: X-Forwarded-For 头,用于标识原始客户端的IP地址,当请求通过代理服务器时使用。  
            #$upstream_addr: 后端(上游)服务器的IP地址。  
            #$upstream_response_time: 从后端服务器接收响应的时间。  
            #$request_time: 客户端发起请求到收到响应的总时间。  
    access_log /var/log/nginx/nginx-access.log main;
	map $http_upgrade $connection_upgrade {  
	    default upgrade;  
	    ''      close;  
	}
    server {  
        listen 9001;  
        server_name  10.6.30.185;  
        location ^~ /websocket {  
            proxy_pass http://10.6.3.46:8001;  
            proxy_http_version 1.1;  
            proxy_set_header Host $host;  
            proxy_set_header X-Real-IP $remote_addr;  
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
            proxy_read_timeout 120s;  
            proxy_set_header Upgrade $http_upgrade;  
            proxy_set_header Connection $connection_upgrade;  
        }  
    }  
}

可能出现的问题

  • 同一个网关出来的 IP 可能会重复,所以如果我想要做一个具体的指定连接的WebSocket IP集合中,key 必须是 mac 地址 value 是 `连接的对象信息
  • 能指定发消息的需求
相关推荐
wanhengidc16 小时前
云手机的挂机功能涉及到哪些内容
运维·服务器·网络·游戏·智能手机
菜鸟plus+17 小时前
ElasticSearch
运维·jenkins
西贝爱学习17 小时前
【软件】nginx-1.28.0安装包(Windows版)
运维·nginx
z2023050817 小时前
linux之 remoteproc 内核实现源码分析
linux·运维·服务器
阿方索17 小时前
shell脚本
linux·运维
嗨丶王哪跑17 小时前
网络安全审计技术原理与应用
运维·网络·安全·web安全
斯普信专业组17 小时前
Skywalking从部署集成到动态调优(上)
运维·skywalking·动态调优
斯普信专业组17 小时前
Skywalking从部署集成到动态调优(下)
运维·skywalking·动态调优
zrande18 小时前
Nginx 负载均衡通用方案
nginx·负载均衡
雪碧聊技术18 小时前
关于springboot定时任务和websocket的思考
websocket·springboot定时任务