使用分布式方法搭建OpenDevOps时,是根据官网的指导文档https://docs.opendevops.cn/zh/guide/install/distribute/ 来搭建的,最后还是报502的错,用了大半天的时间各种找问题后终于解决了,现在记录一下。具体解决过程如下

报错

搭建完前端和后台后,在部署网关前使用命令检查了一下各服务的是否健康,发现都返回200,就直接进入下一步。

部署完网关之后用命令测试

[root@localhost api-gateway]# curl -I -X GET -m 10 -o /dev/null -s -w %{http_code} http://gw.opendevops.cn:8888/api/accounts/are_you_ok/

显示502错误

转到文档的FAQ部分,发现有关于502报错的解决思路

既然502是网关配置错误,要我们检查网关配置和DNS配置,那我就从这两个方面再看看吧。

DNS检查

DNS是严格按照文档内容部署的,而且之前检查各服务健康的时候也显示200了,ping所有域名的时候都能ping通,按理来说域名是没有问题的。但是以防万一,还是要检查一下配置文件。

检查/etc/resolv.conf 文件

[root@localhost api-gateway]# vim /etc/resolv.conf

文件内容如下:

其中192.168.134.156是内部DNS的IP地址,确实放在了第一条,没有问题。

检查/etc/resolv.dnsmasq文件

[root@localhost api-gateway]# vim /etc/resolv.dnsmasq

文件内容如下:

搭建文档中说这个文件用来设置上游DNS,但是我之前测试过,我使用代理上网,如果配置了这个DNS就ping不通OpenDevOps的域名了,所以我注释掉了。
这里也没有问题

检查/etc/dnsmasqhosts文件

[root@localhost api-gateway]# vim /etc/dnsmasqhosts

文件内容如下:

我是单机部署所有模块,所有域名都指向同一个IP,解析出来也是解析到同一个IP上,所以这里仔细看了一下,也没问题。
后来想了一下DNS监听端口是53/udp端口,是不是docker中的服务通过dns配置去查dns服务器的时候无法连接到该端口导致拿不到IP才导致的502报错,我在其他服务器上telnet了一下这个端口,发现确实不通,于是在防火墙上开通了53端口:

[root@localhost api-gateway]# firewall-cmd --zone=public --add-port=53/udp --permanent

重载防火墙规则

[root@localhost api-gateway]# firewall-cmd --reload

然后发现,依然不可以。502错误依然存在。

但是53端口确实是要开放的,因为后来我的502问题解决了之后尝试关闭53端口之后发现确实会出现502报错,日志中显示

至此,dns检查完毕,最后不死心把dns重启了一遍,发现结果依然不行,所有域名dig都能解析,但是网关还是报502。
只能继续下一步了

网关检查

网关检查其实就是顺着之前搭建网关的步骤重新再看一遍。
检查nginx.conf文件

[root@localhost api-gateway]# vim /opt/codo/api-gateway/conf/nginx.conf

文件内容如下:
nginx.conf中只修改了resolver的dns地址,也确实是本地dns的地址,没有问题。

检查gw.conf文件

[root@localhost api-gateway]# vim /opt/codo/api-gateway/conf/conf.d/gw.conf

文件内容如下:

仔细看了又看,觉得这个部分就保持默认就好,我之前也没修改,也没必要修改。这部分没问题。

检查configs.lua文件

[root@localhost api-gateway]# vim /opt/codo/api-gateway/lua/configs.lua

文件内容如下:

上半部分是主要关注redis配置和tocker_sercret、rewrite_cache_tocken和管理后台的配置文件/opt/codo/codo-admin/settings.py中的token_secret、secret_key是否一致。这里仔细对比之后没问题

后半部分主要是检查rui和域名端口是否匹配,这里没有修改,保持默认的,仔细对比后发现没有问题。
检查Dockerfile文件

[root@localhost api-gateway]# vim /opt/codo/api-gateway/docker-compose.yml

文件内容如下:

Dockerfile文件其实就是直接从文档中复制粘贴过来的,完全不用修改,只要再查看下是否和文档中一致就好。 我检查了一下,没有问题。
至此,网关文件检查完毕。
总觉得不应该这样,每一个步骤都是按照文档来的,最后还会报错。我就重新下载源码、导入镜像、修改配置然后编译启动docker。最后满怀希望检查了一下。还是报502。

查看网关日志-端口开放

顺着官网的排错思路没找到问题,这时候突然想到看网关日志(应该一开始就看网关日志的,但是当时想着先照着官网的方式走就没留意)

网关的错误日志为:/usr/local/openresty/nginx/logs/error.log。官方说明文档中没有特别标注,但是可以从配置文件中找到。

日志中看到有一个报错

日志当时没保留清了,这是后期模拟的

显示no route to host,妥妥的端口没开放啊。于是在防火墙上开放了以下端口

[root@localhost supervisor]# firewall-cmd --zone=public --add-port=8010/tcp --permanent
[root@localhost supervisor]# firewall-cmd --zone=public --add-port=8020/tcp --permanent
[root@localhost supervisor]# firewall-cmd --zone=public --add-port=8030/tcp --permanent
[root@localhost supervisor]# firewall-cmd --zone=public --add-port=8040/tcp --permanent
[root@localhost supervisor]# firewall-cmd --zone=public --add-port=8050/tcp --permanent
[root@localhost supervisor]# firewall-cmd --zone=public --add-port=8060/tcp --permanent
[root@localhost supervisor]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
[root@localhost supervisor]# firewall-cmd --zone=public --add-port=8888/tcp --permanent
[root@localhost supervisor]# firewall-cmd --zone=public --add-port=9900/tcp --permanent
[root@localhost supervisor]# firewall-cmd --reload

然后查看网关日志,果然不报no route to host错误了,开始报(5: Operation refused)了

这个refused表明后台各模块域名是通的,但是拒绝连接,我就开始怀疑有的模块可能是没有正常启动,于是我又去检查了后台各模块的问题。

查看各模块日志

前端
前端的日志路径在/var/log/nginx下,总共有6个日志文件,其中error.log是错误日志。主要看error.log是否有报错。

[root@localhost api-gateway]# vim /var/log/nginx/error.log


只有一开始部署的时候域名不通的错,因为我这台测试机是内网的,不能直接上网,用的是代理连接外网,设置了代理之后前端nginx找不到域名就会报错,取消代理之后重启前端就可以了。

后台
后台的所有日志都在/var/log/supervisor/下

其中:

  • cmdb_cron.log和cmdb.log是资产管理模块的日志
  • codo_dns是域名管理模块的日志
  • cron_jobs.log和cron.log是定时任务模块的日志
  • exec_task.log、task_cron_app.log、task_other.log和task_scheduler.log是任务系统模块的日志
  • kerrigan.log是配置中心模块的日志
  • tools.log是运维工具模块的日志
  • mg.log是管理后端的日志。

日志中可能会出现mysql、redis、mq等连不上的报错信息,如下所示:
5672端口是RabbitMQ的默认端口,这里报错信息显示连不上RabbitMQ,检查一下发现是mq的IP配置错误。如果这些日志中有报错,主要检查一下相关模块的配置即可。如果配置确认没有问题还是报错,那就有可能是端口没有在防火墙上开放。使用以下命令开放5672端口(redis和mysql的默认端口最好也开放)

[root@localhost supervisor]# firewall-cmd --zone=public --add-port=5672/tcp --permanent

重载防火墙规则

[root@localhost supervisor]# firewall-cmd  --reload

重启模块后再看日志就没有报错了。
通过以上方法将所以模块都检查了一遍,然后重启网关,测试发现还是报502……502错误其实本来就和后台服务是否健康没有关系,因为如果服务没有正常启动的话,浏览器上会报500的错,但是检查一下更好。
再去查看网关的日志

[root@localhost supervisor]# vim /usr/local/openresty/nginx/logs/error.log

发现仍然报(5: Operation refused)

查看网关日志–问题解决

我能想到会出错的地方都看过了,问题还是没有解决。最后决定还是从日志入手,开始百度。百度搜索内容为"5: operation refused nginx",一个个翻下来找到了这个链接:

NGINX resolver 配置中的 “坑”

其中有一段说
于是我进入docker容器中查看了一下我的nginx的版本

[root@localhost supervisor]# docker exec -it api-gateway_gateway_1 bash
[root@84229c61f571 sbin]# cd /usr/local/openresty/nginx/sbin/ && ./nginx -v

看到版本为openresty/1.15.8.1 ,果然比1.11.5版本高。

于是我在容器内修改nginx的配置文件,加上了ipv6=off这个参数。

[root@84229c61f571 sbin]# vi /usr/local/openresty/nginx/conf/nginx.conf

重启网关容器后再检查就发现报正常200了。

[root@localhost api-gateway]# curl -I -X GET -m 10 -o /dev/null -s -w %{http_code} http://gw.opendevops.cn:8888/api/accounts/are_you_ok/


然后浏览器访问–>输入账密–>成功登录

分布式部署OpenDevOps报502错问题解决全过程相关推荐

  1. 【iOS工具】rvm、Ruby环境和CocoaPods安装使用及相关报错问题解决(2016 12 15 更新)...

    〇.前言 在iOS开发中 [CocoaPods](https://github.com/CocoaPods/CocoaPods) 作为库依赖管理工具就是一把利器. 有了 CocoaPods 则无需再通 ...

  2. django 使用json.dumps转换queryset的datatime报错问题解决

    django 使用json.dumps转换queryset的datatime报错问题解决 参考文章: (1)django 使用json.dumps转换queryset的datatime报错问题解决 ( ...

  3. python3的urllib2报错问题解决方法

    python3的urllib2报错问题解决方法 参考文章: (1)python3的urllib2报错问题解决方法 (2)https://www.cnblogs.com/marsggbo/p/66229 ...

  4. mysql max字符串报错_mysql [Warning] max_join_size报错问题解决办法

    文章介绍了关于mysql [Warning] max_join_size报错问题解决办法,有需要的同学看看. 100716 06:32:45 d started 100716 6:32:45 [War ...

  5. java.sql.SQLException: Access denied for user ‘‘@‘localhost‘ (using password: NO)报错问题解决

    java.sql.SQLException: Access denied for user ''@'localhost' (using password: NO)报错问题解决 参考文章: (1)jav ...

  6. 全局安装gulp 报错问题解决

    全局安装gulp 报错问题解决 参考文章: (1)全局安装gulp 报错问题解决 (2)https://www.cnblogs.com/haibiancao/p/10756473.html (3)ht ...

  7. DEVC++编译奇怪报错问题解决

    DEVC++编译奇怪报错问题解决 平时都是在linux下编软件,偶尔才会编两个windows工具程序方便大家使用.所以一直使用轻量级的IDE DEVC++来编译,但有天突然发现以前可以通过DEVC++ ...

  8. Build path entry is missing: /src/test/java missing 报错问题解决

    Build path entry is missing: /src/test/java missing 报错问题解决 参考文章: (1)Build path entry is missing: /sr ...

  9. 记一次升级node版本后,运行原vue项目报错问题解决方法

    记一次升级node版本后,运行原vue项目报错问题解决方法 参考文章: (1)记一次升级node版本后,运行原vue项目报错问题解决方法 (2)https://www.cnblogs.com/happ ...

  10. Zookeeper集群部署及报错分析

    安装 下载压缩包 解压 修改zoo.cfg文件 创建myid文件 启动 自启动配置 有时间再补hhh 报错处理 很荣幸的遇到了大部分报错,日志再zookeeper目录的bin下的zookeeper.o ...

最新文章

  1. python给一列数据增加前缀_python自制工具----给文件添加前后缀。
  2. 搭建Ubuntu18.04+Anaconda3.x+Pycharm+SimpleITK(三)
  3. 2转单通道 python_机器学习用Python—Python集成工具包Anaconda安装步骤
  4. Python爬虫实战(5):模拟登录淘宝并获取所有订单
  5. git 检查更新文件_Git通过差异比对快速打包待更新文件(SQL)
  6. ACM卡常处理办法(虽然我到现在没遇到)
  7. 吃透 | Elasticsearch filter和query的不同
  8. 临时生成oracle快照,oracle 11g dataguard 使用快照实现临时读写
  9. brave mysql_MYSQL常用命令
  10. Elasticsearch(待学习)
  11. android intent json,如何从android中的Intent服务中的服务器获取Json响应?
  12. 通过I2C总线向EEPROM中写入数据,记录开机次数
  13. java生成word,营业执照获取信息,cookie
  14. 漫话:如何给女朋友解释什么是RPC
  15. 白话Elasticsearch59-数据建模实战_ Nested Aggregation/ Reverse nested Aggregation对嵌套的博客评论数据进行聚合分析
  16. 微信发朋友圈和朋友圈点赞测试用例
  17. moses 编译_MOSES安装以及使用说明
  18. http://wenku.baidu.com/view/d6433106a6c30c2259019e63.html
  19. 2020.9.10丨Pacbio技术三代建库、测序原理
  20. VC API常用函数简单例子大全(1-89)

热门文章

  1. 美团的2020年:千亿美元帝国的贪吃蛇游戏,气势汹汹也危机重重
  2. 先进驾驶员辅助系统ADSA
  3. Linux命令大全(在线手册)
  4. 学习使用php的stripslashe()函数去除反斜杠
  5. 批处理文件——BAT学习
  6. stm32F407的串口6卡死问题
  7. 社交网络叠加直播功能,会产生什么化学反应?
  8. INT_MAX和INT_MIN的含义和用法
  9. 中小企业OA系统自动办公软件
  10. 猜数游戏--python(设定猜测次数)