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

背景

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

问题列表

  • 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协议,等那天明白了在完善补充这个问题
相关文章
相关标签/搜索