Nacos使用域名做为服务地址遇到的问题及解决方案

2023-11-13

一、发现问题

应用启动时,增加Nacos服务端的配置信息。

应用使用IP加端口连接Nacos服务器时,运行一切正常:

#启动参数增加以下Nacos参数
-Dspring.cloud.nacos.discovery.namespace=DEV 
-Dspring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

但是将server-addr换成解析好的域名就有问题:

#Nacos默认的服务端端口为8848,因而Nacos服务端的端口必须配置,
#否则建立TCP连接的时候会使用9848及9849这两个端口
#可以通过下面指定port的参数配置,也可以在server-addr的域名中增加上端口进行指定。

#启动参数增加以下Nacos参数
-Dspring.cloud.nacos.discovery.namespace=DEV 
-Dspring.cloud.nacos.discovery.server-addr=nacos-dev.xxx.com
-Dnacos.server.port=80 

#或者

#启动参数增加以下Nacos参数
-Dspring.cloud.nacos.discovery.namespace=DEV 
-Dspring.cloud.nacos.discovery.server-addr=nacos-dev.xxx.com:80 

Nacos TCP端口的处理代码:

(代码中应该可以增加一个没有端口配置时,默认为80端口的逻辑,后续我来提个PR)。 

确认Nginx中域名解析配置是正确的,因为可以通过域名正常访问控制台,但是应用启动的时候报“Client not connected,current status:STARTING”错误:

该错误表示Nacos应用客户端与Nacos服务端没有建立TCP连接(一次都没有),是客户端报出来的错误,该请求还没有发送到服务端。错误原因为Nginx中没有开启对9848及9849的TCP代理,于是在Nginx中开启TCP代理。

二、错误配置TCP端口的转发

刚开始使用了错误的操作方式,即在Nginx的http反射代理服务中以http2的方式对开启TCP端口,如下所示:

upstream nacos-server{
        server 192.168.12.50:8848 weight=1;
}

upstream nacos-server-grpc-9848{
        server 192.168.12.50:9848 weight=1;
}

upstream nacos-server-grpc-9849{
        server 192.168.12.50:9849 weight=1;
}

# http代理
server {
        listen       80;
        server_name  nacos-dev.xxx.com;
        access_log /data/nginxlog/access-nacos.imlaidian.com.log main;
        error_log /data/nginxlog/error-nacos.imlaidian.com.log;


        location / {

                #反向代理的地址
                proxy_pass  http://nacos-server;
                proxy_set_header Host $host;
                proxy_set_header X-Real-Ip $remote_addr;
                proxy_set_header X-Forwarded-For $remote_addr;
        }

}
# grpc 代理配置 9848
server {
    #80端口加1000
    listen 1080 http2; # grpc方式对外暴露端口
    location / {
        grpc_pass grpc://nacos-server-grpc-9848; # 此处配置grpc服务的ip和端口
    }
}

# grpc 代理配置 9849
server {
    #80端口加1001
    listen 1081 http2; # grpc方式对外暴露端口
    location / {
        grpc_pass grpc://nacos-server-grpc-9849; # 此处配置grpc服务的ip和端口
    }
}

这种方式暴露端口,应用在启动时客户端与服务端会成功建立一次或多次连接,但是在超时以后会被Nginx自动断开,应用启动时此时就会报如下错误:

这个错误是服务端报回来的错误,调试客户端RpcClient.request(Request, long)代码:

获取到服务端响应内容为如下:

metadata {
  type: "ErrorResponse"
}
body {
  value: "{\"resultCode\":500,\"errorCode\":301,\"message\":\"Connection is unregistered.\",\"success\":false}"
}

查看服务端的代码GrpcRequestAcceptor.request(Payload, StreamObserver<Payload>),其中返回错误内容“Connection is unregistered.”的代码块如下:

 出现这个错误是原因是因为客户端往服务端发起请求时,服务端根据客户端传上来的connectionId在connectionManager中找不到对应的客户端连接,就报了这个错误(因为建立的连接被Nginx断开了,连接在服务端已经被删除,自然就找不到了)。

三、正确配置TCP端口转发

Nginx对TCP的代理支持,是从v1.9开始的,支持的模块为stream,在编译nginx的时候需要增加stream模块相关的参数,因为默认编译是不包括stream模块:

#编译时增加以下参数
--with-stream

编译并安装好后,在nginx的配置目录/etc/nginx中增加tcp.d目录,并在nginx.conf中增加tcp.d目录中stream配置的加载:

stream {

    log_format proxy '$remote_addr [$time_local] '
                 '$protocol $status $bytes_sent $bytes_received '
                 '$session_time "$upstream_addr" '
                 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

    access_log /var/log/nginx/access-stream.log proxy;
    error_log /var/log/nginx/error-stream.log;

    open_log_file_cache off;

    # tcp层转发的配置文件夹
    include /etc/nginx/tcp.d/*.conf;

然后在tcp.d中新建包括Nacos TCP转发的配置,如nacos.conf:

upstream erp-nacos-grpc{
        hash $remote_addr consistent;
        server 192.168.12.50:9848 weight=1;
}
upstream erp-nacos-grpc9{
        hash $remote_addr consistent;
        server 192.168.12.50:9849 weight=1;
}
# grpc 代理配置
server {
    listen 1080; # grpc方式对外暴露端口
    proxy_connect_timeout 10s;
    proxy_timeout 10s;
    proxy_pass erp-nacos-grpc;
}

# grpc 代理配置
server {
    listen 1081; # grpc方式对外暴露端口
    proxy_connect_timeout 10s;
    proxy_timeout 10s;
    proxy_pass erp-nacos-grpc9;
}

Nginx中原来关于域名的80端口配置,可以继续用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nacos使用域名做为服务地址遇到的问题及解决方案 的相关文章

  • 如何将 CORS(跨源策略)添加到 NGINX 中的所有域?

    我创建了一个文件夹 用于提供静态文件 CSS 图像 字体和 JS 等 我最终会将文件夹 CNAME 到子域中 以便在 CDN 上使用 以便与我的 Magento 2 设置一起使用 我想允许所有域通过 CORS 跨源策略进行所有访问 并且我也
  • 为从 nginx 反向代理转发的请求添加唯一 id

    我们运行 nginx 作为反向代理 将请求转发到运行 Compojure 的 Clojure 应用程序 Compojure 是一个封装 Jetty 的库 为我们的应用程序提供服务 Web 请求的能力 目前 我们捕获 nginx 和 Cloj
  • Amazon ECS - 在 Docker 入口点上使用 IAM 角色时权限被拒绝

    我正在寻找一种将机密 证书注入 Amazon ECS 容器的方法 就我而言 它是一个简单的 nginx 容器 我一直在使用 AWS Parameter Store 关注这篇文章 https aws amazon com blogs comp
  • Docker 与 nginx 组合不断显示欢迎页面

    我是新来的docker并尝试使用最简单的 docker compose yml 显示一个 hello world 页面 并在此基础上构建最终完整的LEMP堆栈它将与我的服务器具有相同的配置 然而大多数教程已经过时 并且有很多使用方法dock
  • ./manage.py 使用 https 运行服务器

    manage py 运行服务器 0 0 0 0 8000 我使用上面的行作为我从 github 借用的代码的一部分 https github com ribeiroit boh puppet https github com ribeiro
  • Kong - 验证上游 ssl(ssl_proxy 打开)

    我已经成功为 API 安装了 kong 网关 该 API 通过上游负载平衡到多个目标 应用程序服务器 现在 我有一个我的应用程序服务器的自签名证书 kong 和目标之间的 ssl 握手应该失败 我推断 kong 不验证上游证书 经过一些研究
  • Kubernetes nginx 入口控制器返回 502,但仅适用于 AJAX/XmlHttpRequest 请求

    我有一个在 nginx 入口控制器后面运行 Kubernetes 的 Web 应用程序 它对于请求浏览工作正常 但来自浏览器的任何 AJAX XMLHTTPRequest 都会从 nginx 收到 502 错误 我捕获了常规请求和 AJAX
  • nginx 将虚拟目录重写为文件

    这应该很容易做到 但我的头撞在墙上了 如果我收到对 www mysite com mypath 的请求 我想提供 www mysite com myotherpath thisfile html 的内容 我如何使用 nginx 配置来做到这
  • 上传大文件(几 GB)时,nginx 返回内部服务器错误

    我在 nginx 后面有一个 Artifactory 上传大于 4 GB 的文件失败 我相当确定这是 nginx 的错误 因为如果文件从本地主机上传 上传到本地主机 则不会出现问题 nginx 设置为client max body size
  • nginx - 记录 SSL 握手失败

    我正在运行启用了 SSL 的 nginx 服务器 我的协议 密码设置相当安全 我已经在 ssllabs com 上检查过它们 但是 因为这是一个由我无法控制的 http 客户端调用的 Web 服务 所以我担心兼容性 重点是 有没有办法在我的
  • 我怎样才能重写这个nginx“if”语句?

    例如 我想这样做 if http user agent MSIE 6 0 http user agent MSIE 7 0 etc etc rewrite ROOT ROOT ancient last break 而不是这个 if http
  • Docker:Nginx 和 php5-fpm docker 不说话

    我想进行完全 Docker 化的 Drupal 安装 我的第一步是让容器与 Nginx 和 php5 fpm 一起运行 两者都基于 Debian 我在 CoreOS alpha 频道 使用 Digital Ocean 我的 Dockerfi
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h
  • 如何正确链接 php-fpm 和 Nginx Docker 容器?

    我正在尝试链接 2 个单独的容器 nginx 最新 https registry hub docker com nginx php fpm https registry hub docker com php 问题是 php 脚本不起作用 也
  • Http POST 删除 URL 中的端口

    我有一个用 Django 构建的网络应用程序 我目前正在家里的路由器后面的笔记本电脑上运行它 我将路由器配置为将发送到特定端口的所有流量路由到该笔记本电脑 我将 Nginx 作为 Apache 的反向代理 使用 mod wsgi 来运行 D
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • 常规请求期间 Django AJAX 请求未通过

    我有一个带有登录网页的 Django 站点 当提交页面上的登录表单时 它会执行登录视图 该视图会在其中运行一个需要很长时间处理 30秒左右 的函数 因此 为了在登录期间向客户端显示进度 一旦提交表单 登录页面上的 JS 函数就会开始向服务器
  • 抑制 nginx 访问被拒绝错误日志

    我在 nginx 中设置了一些规则来拒绝 IP 访问 这很有效 但对于来自被拒绝 IP 的每个请求 都会记录以下开头的错误 error 7325 0 5761 access forbidden by rule client 有没有办法抑制这
  • 错误请求 400:nginx/gunicorn

    我已经遵循了这个教程 http blog wercker com 2013 11 25 django 16 part3 html http blog wercker com 2013 11 25 django 16 part3 html我现
  • 为什么我会收到 ElasticBeanstalk::ExternalInitationError?

    我的应用程序基于 RubyOnRails 构建 并使用乘客部署为弹性 beanstalk 应用程序 我尝试向 nginx 服务器添加标头并重新启动它 这是我的配置文件 是 aws elastic beanstalk 中 ebextensio

随机推荐

  • 从零搭建完整python自动化测试框架(UI自动化和接口自动化 )——持续更新

    目录 一 总体框架 二 PO模式 DDT数据驱动 关键字驱动 三 框架技术选择 四 框架运行结果 五 各用例对应的定义方式 PO DDT 六 API接口定义方式 七 测试执行结果 从零开始搭建项目 一 开发环境搭建 二 新建项目 三 基础功
  • 软件测试分类、分级与软件缺陷管理

    软件测试分类与分级 4 1软件测试分类 4 1 1是否关心内部结构 1 白盒测试 白盒测试一般是静态测试 注重于内部结构 又称为结构测试或逻辑驱动测试 是一种按照程序内部逻辑结构和编码结构设计测试数据并完成测试的一种测试方法 2 黑盒测试
  • 回复上一篇文章,RuntimeError: CUDA error: CUBLAS_STATUS_ALLOC_FAILED when calling cublasCreate(handle)成功解决

    回应自己的上一篇文章地址在这 花了两天时间 找了各种方法 各种案例 以及各种的尝试 修改了很多次 也尝试用CPU去跑 后面发现还是跑不起来这个数据集 我罗列一部分方法 方法一 改batch size 的值 有的人问题就是这个 方法二 系统的
  • 报错“Cannot read properties of null (reading ‘addEventListener‘)“

    场景 控制台报错 Cannot read properties of null reading addEventListener 错误原因 因为 JavaScript 中操作DOM元素的函数方法需要在 HTML 文档渲染完成后才可以使用 如
  • 三层交换机配置----ensp

    没有你需要的三层交换配置类型 评论区留言 博主第一时间补充 说明 交换机统一为S3700 连接线为Ethernet 目录 一 最简形式 二 一交换机 多主机 三 三层交换机 二层交换机 四 两台三层交换机 一 最简形式 system vie
  • 国外那些富有创意的 404 页面

    点击上方 前端号 点亮你的前端技能树 最近在搜集前端相关文章时 无意看到了几篇关于国内外 404 页面的收集 觉得很多网站的 404 页面 特别富有创意 所以趁着周末还有些空余的时间 去梳理了一份富有创意的 国外网站 404 页面 正值周末
  • QT开发(二)(信号和槽)

    QT开发 标准信号和槽 自定义槽 带参信号 Lambda表达式 代码 标准信号和槽 main cpp如图所示 诸多的控件应该在主窗口中去实现而不应在主函数中实现 改变编码 TOOLS gt options gt TextEditor gt
  • Qt之QThread详解

    一 线程管理 1 线程启动 void start Priority priority InheritPriority 调用后会执行run 函数 但在run 函数执行前会发射信号started 操作系统将根据优先级参数调度线程 如果线程已经在
  • mac解决Enter passphrase for key每次输入密码

    欢迎点击领取 前端面试题进阶指南 前端登顶之巅 最全面的前端知识点梳理总结 分享一个使用比较久的 1 理解公钥 私钥 当我们关联好自己的git时 发现每次pull 或 push代码时会让我们重复性输入自己的密码 问题不是出在我们关联的不对
  • centos6和centos7防火墙的关闭

    原文 CentOS6 5查看防火墙的状态 1 zh localhost service iptable status 显示结果 1 2 3 4 5 zh localhost service iptable status Redirectin
  • MATLAB使用单纯形法解决线性规划问题,函数形式调用,举例演示

    线性规划隶属于范畴学 在现实的应用十分广泛 简单来说 就是自变量在线性约束的条件下 求线性函数的最小值或最大值 对于优化问题 其数学模型往往需要提取出关键的三要素 即 自变量相关的约束条件 自变量的取值范围 关于自变量的目标函数 对于线性规
  • 【泛微E9开发】workflowservice创建流程

    最下面附demo下载地址 包括所需要的JAR文件 package test WorkflowServicePortType import org junit Test import weaver workflow webservices W
  • python创意作品-python的作品

    广告关闭 2017年12月 云 社区对外发布 从最开始的技术博客到现在拥有多个社区产品 未来 我们一起乘风破浪 创造无限可能 发现了编程与艺术又一个契合点 小开心一下 其实这个过程非常简单 我们先看作品 后讲解代码 python书法作品1
  • 自定义TableLayoutPanel使它能够在运行时用鼠标改变行高和列宽。

    using System using System Collections Generic using System ComponentModel using System Drawing using System Windows Form
  • 1054 求平均值 (20 分)

    1054 求平均值 20 20 分 本题的基本要求非常简单 给定N个实数 计算它们的平均值 但复杂的是有些输入数据可能是非法的 一个 合法 的输入是 1000 1000 区间内的实数 并且最多精确到小数点后2位 当你计算平均值的时候 不能把
  • TiKV架构解析

    TiKV架构解析 TiKV 的整体架构比较简单 如下 参考资料 1 TiKV 源码解析系列 如何使用 Raft 2 TiKV 源码解析系列 multi raf
  • Connection timed out: connect. If you are behind an HTTP proxy, please configure the proxy settings

    Connection timed out connect If you are behind an HTTP proxy please configure the proxy settings either in IDE or Gradle
  • 我的2018年总结

    前言 本来没有打算总结自己的2018年 毕竟自己就是个普通的不能再普通的学生 没有什么特别值得让人关注的地方 但是今天看到了自己的好朋友昨天写了他的2018年总结 看了感觉记录一下自己的生活还是挺有意义的 所以就也打算稍微写一点 毕竟写这些
  • 启动Nginx报[10013]错误的解决方案

    报错情景 今天自己再本地配置好Nginx 但是启动时报了 10013 的错误 上网查了下 原因是80端口被占用了 错误提示如下图 随后在cmd中输入下列命令 如图示 查看了一下80端口的占用情况 发现果然被占用 情况和网上其他人所遇到的是一
  • Nacos使用域名做为服务地址遇到的问题及解决方案

    一 发现问题 应用启动时 增加Nacos服务端的配置信息 应用使用IP加端口连接Nacos服务器时 运行一切正常 启动参数增加以下Nacos参数 Dspring cloud nacos discovery namespace DEV Dsp