Nginx配置WebSocket代理的示例代码

 更新时间:2024年10月14日 09:41:55   作者:枫飘长安  
本文提供了关于Nginx的配置和日志记录的详细指南,介绍了如何使用whereis命令查找Nginx路径,并通过man命令查看手册,同时,详解了解Nginx访问日志的配置方法及参数含义,并分享了Nginx代理WebSocket的配置示例,感兴趣的可以了解一下

Nginx 官方文档网址 nginx documentation

...
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";
    }
    ...
  }
  ...
}

官方文档代理样例

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)配置及信息详解

一般使用 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 操作,都能够在后台读取到信息,同时,后台也能够推送信息过去。

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 是 `连接的对象信息
  • 能指定发消息的需求

 到此这篇关于Nginx配置WebSocket代理的示例代码的文章就介绍到这了,更多相关Nginx WebSocket代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • upstream模块中常用options选项讲解

    upstream模块中常用options选项讲解

    这篇文章主要为大家介绍了upstream模块中常用options选项讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Nginx启用Brotli算法压缩的示例

    Nginx启用Brotli算法压缩的示例

    这篇文章主要介绍了Nginx启用Brotli算法压缩的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Nginx反向代理实现Vue跨域的示例

    Nginx反向代理实现Vue跨域的示例

    本文主要介绍了Nginx反向代理实现Vue跨域的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Nginx(自定义/预定义)变量,alias虚拟目录解读

    Nginx(自定义/预定义)变量,alias虚拟目录解读

    这篇文章主要介绍了Nginx(自定义/预定义)变量,alias虚拟目录,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-07-07
  • LNMP简介(最新推荐)

    LNMP简介(最新推荐)

    LNMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写,L指Linux,N指Nginx,M一般指MySQL,也可以指MariaDB,P一般指PHP,也可以指Perl或Python
    2023-08-08
  • 基于nginx反向代理获取用户真实Ip地址详解

    基于nginx反向代理获取用户真实Ip地址详解

    我们访问互联网上的服务时,大多数时客户端并不是直接访问到服务端的,而是客户端首先请求到反向代理,反向代理再转发到服务端实现服务访问,这篇文章主要给大家介绍了关于如何基于nginx反向代理获取用户真实Ip地址的相关资料,需要的朋友可以参考下
    2022-03-03
  • Nginx tp3.2.3 404问题解决方案

    Nginx tp3.2.3 404问题解决方案

    这篇文章主要介绍了Nginx tp3.2.3 404问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • nginx 版本升级的实现方法

    nginx 版本升级的实现方法

    文介绍了如何在CentOS7服务器上无中断地将Nginx从1.18.0版本升级到1.19.7版本,提供了两种升级方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-09-09
  • Nginx反向代理在Web应用中的实战分享

    Nginx反向代理在Web应用中的实战分享

    本文将介绍Nginx反向代理的基本原理和配置,以及如何利用Nginx实现高可用性和故障转移,最后,我们将探讨如何监控Nginx反向代理的性能并进行日志分析,需要的朋友可以参考下
    2024-08-08
  • Nginx搭建图片视频服务器的部署步骤

    Nginx搭建图片视频服务器的部署步骤

    这篇文章主要介绍了Nginx搭建图片视频服务器的部署步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论