Nacos2.0以上版本集群 使用Nginx代理 报错 Request nacos server failed问题

问题:

使用Nginx代理Nacos集群后,网页可以访问,但是微服务服务连不上服务器报以下错误

com.alibaba.nacos.api.exception.NacosException: Request nacos server failed: 
	at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.requestToServer(NamingGrpcClientProxy.java:288) ~[nacos-client-2.1.0.jar:na]
	at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.doRegisterService(NamingGrpcClientProxy.java:128) ~[nacos-client-2.1.0.jar:na]
	at com.alibaba.nacos.client.naming.remote.gprc.NamingGrpcClientProxy.registerService(NamingGrpcClientProxy.java:114) ~[nacos-client-2.1.0.jar:na]
	at com.alibaba.nacos.client.naming.remote.NamingClientProxyDelegate.registerService(NamingClientProxyDelegate.java:94) ~[nacos-client-2.1.0.jar:na]
	at com.alibaba.nacos.client.naming.NacosNamingService.registerInstance(NacosNamingService.java:145) ~[nacos-client-2.1.0.jar:na]

环境配置

  • 第一台Nacos 192.168.3.22:8848
  • 第二台Nacos 192.168.3.23:8848
  • Nginx配置 192.168.3.100:8850

当前Nginx 配置

#此配置在http模块下

   upstream clusterHttp{
        server 192.168.3.22:8848;
		server 192.168.3.23:8848;
    }
    	server {
		listen 8848;
		server_name localhost;
		location / {
			proxy_pass http://clusterHttp;
		}
	}

原因

Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。

端口 与主端口的偏移量 描述
9848 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
9849 1001 服务端gRPC请求服务端端口,用于服务间同步等

所以我们要在Nginx 里面增加以下配置

#注意此配置与http同级
stream{

   upstream cluster{
        server 192.168.3.22:9848; #访问端口+1000
		server 192.168.3.23:9848; #访问端口+1000
    }
    	server {
		listen 9848;  #映射出来的也是访问端口+1000
		proxy_pass cluster;
	}
    
       upstream clustergrpc{
    server 192.168.3.22:9849; #访问端口+1001
		server 192.168.3.23:9849; #访问端口+1001
    }
    	server {
		listen 9849;  #映射出来的也是访问端口+1001
		proxy_pass clustergrpc;
	}
}

保存好 nginx -s reload 重新加载配置即可

最后微服务就可以正常连上了

服务配置application.yml

server:
  port: 8011
spring:
  application:
    name: order-service
  cloud:
    nacos:
      server-addr: 192.168.3.100:8850
      discovery:
        username: nacos
        password: nacos
        namespace: 5604d165-c335-4981-85b3-f8ceb734aae0
        group: dev
      config:
        namespace: 5604d165-c335-4981-85b3-f8ceb734aae0
        file-extension: yaml
        server-addr: 192.168.3.220:8848

连接成功

2022-11-17 14:57:53.142  INFO 3539 --- [           main] c.a.n.p.a.s.c.ClientAuthPluginManager    : [ClientAuthPluginManager] Load ClientAuthService com.alibaba.nacos.client.auth.ram.RamClientAuthServiceImpl success.
2022-11-17 14:57:54.255  INFO 3539 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8011 (http) with context path ''
2022-11-17 14:57:54.284  INFO 3539 --- [           main] c.a.c.n.registry.NacosServiceRegistry    : nacos registry, dev order-service 192.168.3.11:8011 register finished
2022-11-17 14:57:54.294  INFO 3539 --- [           main] com.hmportel.xxx.OrderApplication        : Started OrderApplication in 3.731 seconds (JVM running for 4.453)

如果加载配置出现以下问题

nginx: [emerg] "stream" directive is not allowed here in /usr/local/nginx/conf/nginx.conf:行数

说明你安装模块的时候 没有去安装 steam模块需要重新编译安装模块

以下以我的nginx演示 我的nginx目录

/usr/local/nginx

1.关闭nginx

ps -ef|grep nginx

image

#杀掉这两个进程 多个进程空格
kill -9 进程号

2.进入之前安装NGINX的安装包我的在 /home/hmpt/nginx-1.21.6/

cd /home/hmpt/nginx-1.21.6/

3.重新配置nginx并加上模块

#--prefix=/usr/local/nginx是编译好输出的位置
#  --with-http_ssl_module 是ssl模块
#--with-stream是stream模块

./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream

4.编译安装

make & make install

5.重新启动就可以了

cd /usr/local/nginx/sbin
./nginx