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)配置及信息详解_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 操作,都能够在后台读取到信息,同时,后台也能够推送信息过去。
- 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 是 `连接的对象信息
- 能指定发消息的需求
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |