菜鳥之旅: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協議,等那天明白了在完善補充這個問題
相關文章
相關標籤/搜索