美食宝箱-项目问题记录

一.无法请求到容器中的后端程序

解决方法:逐步排查,最终确定内核版本与docker版本不兼容,更新Linux内核版本后问题解决。

参考文章:https://blog.csdn.net/qq_42108331/article/details/135657018

问题描述 :将打包好的程序使用docker部署到阿里云服务器上并启动,使用postman进行测试,发现无法收到程序的响应。

解决过程:

1.使用浏览器同样无法接收到响应,排除postman问题。检查postman的请求路径、协议及请求参数,发现没有错,使用相同的参数和路径请求本地启动的后端程序,可以接收到正确的响应,排除请求有问题的情况。

2.检查服务器上后端程序的日志,确认程序正常运行,并发现未收到刚刚发送的请求,即请求并未进入到后端程序。使用ping命令测试服务器,可以ping通。检查容器端口配置,没有问题。检查服务器防火墙已关闭、SELinux已关闭,阿里云安全组已开放对应端口。运行在服务器上的个人网站可以正常使用。排除请求无法进入到服务器的情况。

3.使用尝试连接MySQL容器,发现无法连接,猜测请求无法进入docker容器。上网查找相关资料,怀疑内核版本与docker版本不兼容。更新Linux内核版本,重新启动容器,请求可以进入容器,问题解决。

 

二.使用docker将jar包构建为镜像时报错

解决方法:重启docker + 清理docker缓存

参考文章:百度智能搜索

问题描述 :使用 “docker build” 将jar包构建为镜像时报错 “failed to solve:layer does not exist”

解决过程:上网查询报错原因,尝试使用 “docker builder prune”清理缓存,清理缓存后再次构建镜像成功。

 

三.小程序上线后无法请求到后端数据

解决方法:使用https协议代替http协议进行请求,并在小程序设置中配置相应的请求路径。

参考文章:见下文

问题描述:在微信开发者工具中可以请求到服务器上的后端程序,但是上线后在微信中测试小程序,发现无法请求到后端数据。

解决过程:

1.上网查询相关资料,说是因为没有在微信后台配置服务器的域名导致的,需要配置服务器信息(域名及端口)。在后台配置好服务器信息后,发现小程序仍然请求不到后端数据。

 

2.根据 https://developer.aliyun.com/article/1486626 一文的相似问题分析,线上小程序在进入调试模式后可以请求到后端数据。进入调试模式测试,果然能够请求到后端数据,着表明小程序端与后端程序的工作都是能正常运行的,应该只是哪一步限制了请求或响应。

3.继续上网查找相关资料表明,检查开发者工具是否勾选了“不校验合法域名”,如果勾选了应该去掉勾选。在开发者工具去掉勾选后,发现开发者工具也无法请求到后端数据。这一现象表明问题就出在“没有配置合法域名”。

4.文章 https://developer.aliyun.com/article/1157022 介绍了小程序要想请求到后端数据应满足的条件(如下图所示)。

对照上述条件,发觉小程序的请求一直使用的是http协议,而微信强制要求使用https协议,因此需要(1)在小程序端修改协议为https(2)配置服务器的https协议。

小程序端只要修改一下协议即可,主要的工作在服务端。由于Tomcat默认工作在http协议,而且直接请求后端并不安全高效,最好的办法是配置Nginx监听443接口并使用http协议将请求转发至后端。

第一步:为域名申请SSL证书并放置于服务器之中。

第二步:修改nginx.conf配置文件。

完成相关配置后,小程序可以顺利请求到后端数据了。

 

四.商户端与服务器无法正确建立WebSocket连接

解决方法:修改请求中的ws协议为wss协议,并在Nginx中正确配置wss转发

问题描述:商户端界面不断提示WebSocket连接建立失败。

解决过程:

1.查看报错信息并上网搜索,提示https加载的界面必须使用wss协议建立WebSocket而不是ws协议。之前一直商户端使用http协议请求服务,而由于微信强制要求使用https协议,配置SSL之后,商户端的请求也变成了https,因此需要将ws协议修改为wss协议。

首先在nginx.conf中配置Nginx转发wss协议。

然后修改前端的请求为wss协议。改完后,浏览器可以与服务器建立WebSocket连接了。

五.服务器中启动两个MySQL内存占用过高

解决方法:停止MySQL的docker容器,让后端程序直接使用服务器上的MySQL

问题描述:服务器上同时运行两个MySQL(个人网站的MySQL服务和后端程序的MySQL容器)导致内存占用过高

项目之前跑在一个2核8G的云服务器上,为了省钱,将其迁移到了一个更便宜的2核2G服务器上。服务器上运行着个人网站以及美食宝箱项目。其中,个人网站使用Nginx与MySQL直接运行在服务器上,美食宝箱后端程序运行在docker容器中,并与一个Redis容器和一个MySQL容器组成了网络。发现服务器内存占用较高,使用top命令排查,占用内存较高的主要是两个MySQL进程。为了节省内存,计划美食宝箱项目直接使用服务器上的MySQL,不再使用MySQL容器。

首先从MySQL容器中导出原有数据库为sql文件,再将sql文件导入到服务器的MySQL数据库中,完成数据迁移。

然后修改后端程序application-cloud.yml中的MySQL配置信息。由于后端程序与MySQL数据库无法通过docker网桥连接,为了让程序能够访问到数据库,上网查询到两种较为简单的修改方式。一种是在run容器时,使用” –net=host ” 让容器共享宿主机的网络命名,但是这样不便直接与redis容器连接,且容器的隔离性不好。另一种是仍然使用桥接模式,使用” ip addr show docker0”命令查看docker网桥中宿主机的ip表示,使用该ip访问宿主机。

选择第二种方式配置了数据库,实现了程序与数据库的连接。