菜鸟之旅:nginx+docker+springcloud部署

 阅读约 11 分钟

背景

后台采用spirngcloud的eureka做服务注册与发现,前台vue部署nginx代理服务器统一访问zuul网关。本地服务经过测试好以后,部署服务器上出现一堆问题,敲了2天的liunx命令,看似简单的部署,实际小问题不断,这篇文章记录一下出现的问题解决过程

问题列表

  • eureka由于保护机制导致一些已经下线的服务器依旧存在,通过feign访问到的服务是下线的服务,出现访问问题
本地idea启动服务A往eureka集群x注册一个服务,liunx使用docker生成一个镜像,通过docker run启动服务A,往eureka集群y注册了一个服务,在eureka集群上存在两个相同服务名的服务A,关闭本地idea中启动的服务,eureka保护机制存在集群x上的服务还存在,现在有些feign访问的是eureka集群x的服务,有些feign访问的是eureka集群y的服务。这导致集群x的服务A由于关闭了访问不通。解决办法最简单的重启eureka集群服务
  • idea服务部署上去是代码不是最新问题
出现这个问题是maven打包时没有做 maven clean的操作,对相关的依赖模块做maven clean maven install 重新打包部署到服务器上
  • nginx网关502问题
出现这个问题是目标服务器开启了防火墙没有加入可访问的端口,导致nginx代理访问目标服务器失败,可以在centos7上安装telnet工具测试一下ip 端口是否通畅,其他的端口检查方法:https://www.cnblogs.com/kerry...
  • docker重启服务出现iptables: No chain/target/matchby that name.
开启了防火墙增加了一些端口,重启防火墙以后,重启docker服务遇到上面的问题,需要重启docker服务,centos7下使用sudo systemctl restart docker命令。
  • 阿里云服务器有些端口不可用
安全组策略添加了端口,服务器防火墙开启并加入安全组的端口,发现还是不能访问.使用nmap查看开放的端口:nmap 服务器地址,发现有部分端口关闭了,如下图
clipboard.png
防火墙端口开发情况
clipboard.png
安全组加入情况
clipboard.png
实在解决不了,提交工单给售后工程师,售后工程师第一步要求在服务器执行命令:netstat -ano | grep 6666 查看端口连接情况,输出的是空信息,说明没有处于监听状态
clipboard.png
检查一下使用端口的应用程序是否已经正常启动,如果没有应用程序使用端口,那么这个端口通过telnet是访问不通的。
这里的原因:没有应用程序使用访问不通的端口,docker 安装nginx 外部6667端口映射容器80 端口,在nginx.conf配置了两个server 一个server监听80端口,这时候外部访问6667就会来到这个80端口上,另外一个server配置了6666端口,这个6666端口在docker nginx启动容器中没有指定映射,因此6666端口是没有在使用的,可以在运行docker的nginx容器时映射多端口,这样宿主机的6666端口映射到第二个server绑定的端口上,docker run -p 80:80 -p 6666:6666 这里的第二个-p的第二个6666就是server绑定的端口
  • docker 部署nginx容器已经运行,但是外网访问不了
检查云服务器安全组配置,服务器防火墙配置,这里都配置好了,之所以出现这个原因是我端口映射出问题,docker run --name nginx-test -p 6667:6667 -d nginx 因为第二个6667没有在nginx.conf的server下绑定所以不对访问不了,可以增加一个server进行端口绑定,也可以改成docker run --name nginx-test -p 6667:80 -d nginx ,因为nginx的默认配置文件conf.d下有个default.conf 里面已经存在一个server绑定了80端口,这样成功成功运行且能够通过外网访问到6667端口
  • google浏览器对一些端口做了屏蔽,比如6666
也就是说上面费劲千辛万苦部署的6666端口不能访问,具体查看google屏蔽的端口:https://www.jianshu.com/p/7b5...
解决办法二级域名绑定同一个服务器上,nginx做域名分发。这样二级域名也可以使用80端口
  • 单点登陆问题
什么是单点登陆及原理可以先看这篇文章了解一下基本的机制,至于怎么变思路不变:https://sp0.baidu.com/5bgWsji...
这里采用的是zuul网关进行登录鉴权,zuul网关模块maven依赖一个实现了springsecurty的服务,在这个依赖的服务中鉴权,登录时返回一个token,前端请求带有权限的页面携带这个token就可以。问题来了如何实现单点登陆呢? 网站A使用的了一个主域名,网站B使用了二级域名,因为主域名的cookies能被二级域名读取到,所以在将token存在cookies的指定一个主域名属性就可以,访问网站B就能获取到主域名里面的cookies中的token请求到zuul网关服务进行鉴权
  • docker容器里面的资源如何永久保存
涉及到上传的公共服务通过docker部署,指定的上传路径是项目所在的linux系统的绝对路径,实际这个绝对路径是存放到docker容器里面的,同理一些日志文件的路径也是一样的,这时候有个问题就是容器被删除以后里面的资源全部消失不见了。这时候需要docker一个数据容器,宿主机的一个目录和docker容器的某个目录进行映射,如果docker容器这个目录不存在会自动创建,但是宿主机的目录事先要创建好。
创建步骤:
1.使用docker pull busybox 拉取最小的docker容器
2.docker run --name data-volume -v `pwd`/platform:/home/platform busybox echo "数据容器-勿删" 创建一个停止的容器实例,数据容器不需要运行,通过和宿主机当前目录下的platform目录挂载,也可以指定一个绝对路径,自行定制
3.docker run --name example-name -p 9090:9090 --volumes-from data-volume -d example-image 运行一个项目镜像 通过--volumes-from来挂载数据容器
4.将第三步项目中的日志、资源的父目录指定在第二步挂载的/home/platform下面,这样项目启动后的日志文件以及一些上传的资源可以访问宿主机第二步挂载的`pwd`/platform下面找到
参考:资源永久保存方式:http://dockone.io/article/128 数据卷创建https://blog.csdn.net/xiaojin...。 docker -rm的使用:https://blog.csdn.net/nzjdsds...。使用非常小的镜像创建数据容器:http://cloud.51cto.com/art/20...
  • 将网站http换成https
1.去腾讯云申请免费的证书,在首页的产品下面通过搜索ssl就能找到ssl申请入口,要求验证域名,因为域名是阿里云解析的,所以使用手动验证DNS,在阿里云域名管理页面增加一条解析,类型为txt,信息来自腾讯云申请时待验证的的证书详情信息,具体可以看指引向导中的提示
2.将证书放到服务器上,具体教查看:https://www.qcloud.com/docume...
3.这里使用的是nginx,需要主要的地方:在原有的nginx.conf配置上增加一个server 端口是443,nginx版本关系,教材中ssl开启使用listen 443 ssl;写法。 出现:
no "ssl_certificate_key" is defined问题,是因为在写2_www.domain.com_key的时候前面写成了ssl_certificate,而不是ssl_certificate_key.
记得阿里云的安全组,服务器防火墙开启443端口
4.再次执行nginx 报错:cannot load certificate "/etc/nginx/1_www.thinkoverxx.fun_bundle.crt 根据教材证书存放到了/usr/local/nginx/conf目录下,根据提示改成放到/etc/nginx下面或者在nginx.conf文件中的ssl_certificate ssl_certificate_key 配置指定绝对路径
5.第二步的教材,将普通的http请求转发到https上,配置如下
server {
listen 80;
server_name www.domain.com; #填写绑定证书的域名
rewrite ^(.*)$ https://$host$1 permanent; #把http的域名请求转成https
}
5.子域名不支持主域名申请好的证书,因此需要重新申请,操作步骤类似
6.转成https以后网站内部的链接都要带有https 有可能会显示不安全,如下图
clipboard.png
  • 切换成https后 websocket报错
需要将ws协议转成wss并且通过域名访问,这个域名就是上面配置443服务指定的域名,增加一个location进行wss转发,具体转https对websocket出现的坑请看:https://blog.51cto.com/kusorz...https://blog.csdn.net/qq_2880...
我的问题暂时解决不了,因为通过nginx转发是http协议,而后台使用的是@ServerEndpoint(value = "/websocket.ws/{userId}") 注解来接收,我不知道他能不能接收到http协议,反正网站一直包404,暂时采用ws协议,等那天明白了在完善补充这个问题
阅读 645更新于 8月13日
推荐阅读
Java
用户专栏

Java的一些经验的记录

0 人关注
3 篇文章
专栏主页
目录