1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    基于nginx實現上游服務器動態自動上下線無需reload的實現方法_nginx

    來源:腳本之家  責任編輯:小易  

    網上關于nginx的介紹有很多,這里講述的是上游服務(如下圖的Java1服務)在沒有“網關”的情況下,如何通過nginx做到動態上下線。

    傳統的做法是,手動修改nginx的upstream文件,將Java1的配置注釋或者標記為down,然后reload nginx生效。當然可以做成腳本自動化修改,然而對于一個繁忙的nginx來說,貿然reload輕則響應緩慢,重則雪崩丟失流量。

    那么怎樣做到nginx動態加載upstream配置呢?網上大體有3種方案:

    通過Lua腳本結合nginx,也就是Openresty方案; 給nginx的每個server額外添加一個端口,每次通過調用這個端口修改upstream; 給nginx添加數據庫,upstream數據放在數據庫中,通過修改數據庫數據實現修改upstream配置。

    對于一個正在運行的生產環境nginx來說,第3個方案無疑是成本最低的。下面讓我們具體看一下:

    技術方案:nginx1.16+nginx_upstream_check_module+nginx-upsync-module+consul

    說明:

    這里的consul就是上面所說的數據庫,它不只是key/value類型的庫,還有一個簡潔的web管理頁面,可以很方便的管理鍵值對數據; nginx_upstream_check_module是阿里開源的針對上游服務的健康檢測模塊; nginx-upsync-module是微博開源的可以與consul/etcd結合的模塊。

    下面分別通過consul集群部署、nginx改造、創建upstream數據3個方面逐一討論實施細節。

    一、部署consul集群

    官網:https://www.consul.io/

    假設用下面3臺機器組成一個Consul集群:

    192.168.21.11
    192.168.21.12
    192.168.21.13
    192.168.21.14 # 這個IP為代理IP,用于代理上面3臺機器

    1. 準備工作

    從官網下載consul壓縮包,分別上傳到上面3臺服務器,這里的consul版本為1.8.4:

    unzip consul_1.8.4_linux_amd64.zip
    mv consul /usr/local/bin/
    [root@nginx-11 tmp]# consul
    Usage: consul [--version] [--help] <command> [<args>]
    
    Available commands are:
     acl Interact with Consul's ACLs
     agent Runs a Consul agent
     catalog Interact with the catalog
     ....

    3臺機器分別創建consul數據、日志、配置文件目錄:

    mkdir -p /data/consul/{data,log}
    mkdir /etc/consul

    2.生成consul配置文件

    下面以192.168.21.11的配置文件為例:

    [root@nginx-11 tmp]# cat /etc/consul/config.json
    {
     "datacenter":"dc1",
     "primary_datacenter":"dc1",
     "bootstrap_expect":3,
     "start_join":[
     "192.168.21.11",
     "192.168.21.12",
     "192.168.21.13"
     ],
     "retry_join":[
     "192.168.21.11",
     "192.168.21.12",
     "192.168.21.13"
     ],
     "advertise_addr": "192.168.21.11",
     "bind_addr": "192.168.21.11",
     "client_addr": "0.0.0.0",
     "server":true,
     "connect":{
     "enabled":true
     },
     "node_name":"192.168.21.11",
     "ui": true,
     "data_dir":"/data/consul/data",
     "enable_script_checks":false,
     "enable_local_script_checks":true,
     "log_file":"/data/consul/log/",
     "log_level":"info",
     "log_rotate_bytes":100000000,
     "log_rotate_duration":"24h",
     "encrypt":"a2zC4ItisuFdpl7IqwoYz3GqwA5W1w2CxjNmyVbuhZ4=",
     "acl":{
     "enabled":true,
     "default_policy":"deny",
     "enable_token_persistence":true,
     "enable_key_list_policy":true,
     "tokens":{
     "master":"6c95012f-d086-4ef3-b6b9-35b60f529bd0"
     }
     }
    }

    說明:

    另外2臺服務器的配置文件,分別將上面的advertise_addr、bind_addr、node_name對應值修改為對應IP,其他配置不需要改變; 參數 "bootstrap_expect":3 意為希望部署一個3個節點的集群,請根據實際情況配置; encrypt與tokens對應的值,3臺機器應保持一致,encrypt值可以通過consul keygen命令生成,token值可以通過uuidgen命令生成,也可以都通過這2個工具生成; 相關參數的理解可以參考:https://juejin.im/post/6844903860717240334

    3. 創建consul集群

    分別在3臺機器上啟動consul即可:

    consul agent -config-file=/etc/consul/config.json &

    通過瀏覽器訪問http://192.168.21.14:8500(或者任意一個IP:Port)即可訪問consul后臺界面,輸入上面master的tokens值可以看到里面具體內容。

    注意:

    上面配置文件中的acl配置,“enable_key_list_policy”配置一定要加上,且值要配成“true”,否則匿名用戶可能訪問不到consul配置內容。

    4. 為非管理員創建consul訪問權限

    1)創建訪問策略

    通過瀏覽器訪問consul,點擊ACL -> Access Controls -> Policies -> 右上角Create創建一個只讀“upstreams”kv策略,名稱為:readonlykv,Rules內容為:

    key_prefix "upstreams/" {
     policy = "list"
    }

    創建一個可以寫“upstreams”kv策略,名稱為:writekv,Rules內容為:

    key_prefix "upstreams/" {
     policy = "write"
    }

    創建好的2條策略截圖如下:

    2)創建訪問token

    在匿名用戶token中加入允許訪問只讀“upstreams”kv策略,用于允許nginx模塊匿名讀取consul配置:
    點擊00000002,在Policies中選擇readonlykv即可。

    創建可以寫“upstreams”kv的token,用于腳本帶此token修改consul配置:
    通過瀏覽器訪問consul,點擊ACL -> Access Controls -> Tokens -> 右上角Create,在Policies中選擇writekv。
    修改/創建好的2條token截圖如下:

    到此Consul集群部署完成。

    二、nginx改造

    1. 升級nginx

    下載nginx相關模塊:

    nginx-upsync-module:https://github.com/weibocom/nginx-upsync-module

    nginx_upstream_check_module:https://github.com/xiaokai-wang/nginx_upstream_check_module

    注意:

    下載nginx_upstream_check_module模塊時請一定到xiaokai-wang的GitHub上下載,千萬不要到阿里的官方GitHub上下載,否則版本不兼容編譯不過去; 在對Nginx升級前請先做好數據備份。

    1)對nginx_upstream_check_module打patch

    cd nginx-1.16.0
    patch -p1 < /usr/local/src/nginx-1.16/nginx_upstream_check_module-master/check_1.12.1+.patch 

    說明:我把下載的2個nginx模塊源碼包放在了/usr/local/src/nginx-1.16/路徑下。

    2)編譯nginx

    ./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/nginx-1.16/nginx_upstream_check_module-master --add-module=/usr/local/src/nginx-1.16/nginx-upsync-module-master ...

    說明:

    我把nginx安裝在/usr/local/下面;

    命令后面的省略號是你要安裝的模塊,請根據實際情況添加,通過nginx -V可以看到當前安裝了哪些模塊,然后加上去即可。

    3)安裝nginx

    make
    # 如果是平滑升級,該步不要執行 
    make install

    4)升級nginx

    #再次備份nginx二進制文件
    mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx16.old
    #用新nginx二進制文件替換老的
    cp objs/nginx /usr/local/nginx/sbin/
    #查看已安裝的nginx模塊
    /usr/local/nginx/sbin/nginx -V

    提醒:經過測試發現nginx1.6通過reload或者發送kill -USR2命令,老的nginx進程并不會退出,需要重啟nginx才可以生效,不知道是不是Bug。

    /usr/local/nginx/sbin/nginx -s stop
    #如果老的nginx進程仍未推出,使用kill -9強制殺掉ps -ef |grep nginx
    #開啟nginx
    /usr/local/nginx/sbin/nginx 
    # 說明:發送kill -USR2命令
    kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

    到此,nginx升級完成。

    2. 配置nginx

    1)首先配置nginx展示頁面,用于快速了解nginx運行狀態

    cat nginx.conf
     server {
     listen 80;
     server_name localhost;
    
     # 在server 80中展示upstream,相當于全局配置,其他配置文件不需要配置          # 瀏覽器訪問http://nginx-ip:80/upstream_show能查看到nginx upstream的具體配置信息
     location = /upstream_show {
      upstream_show;
     }
    
     # 在server 80中展示check詳情,相當于全局配置,其他配置文件不需要配置          # 瀏覽器訪問http://nginx-ip:80/status能查看到上游服務的健康狀態,報紅即為有問題,白色即為正常
     location /status {
      check_status;
     }
    
     # 在server 80中展示nginx自帶的狀態,相當于全局配置,其他配置文件不需要配置          # nginx原生自帶功能
     location /NginxStatus {
      stub_status on;
      access_log off;
      allow 192.168.0.0/16;
      deny all;
     }
     }
         # 引入具體server配置,每個server需要配置nginx-upsync-module模塊的配置
     include /usr/local/nginx/conf/vhosts/*.conf;

    2)server配置

    http方式檢測

    upstream rs1 {
     server 127.0.0.1:11111;
     upsync 192.168.21.14:8500/v1/kv/upstreams/rs1/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
     upsync_dump_path /usr/local/nginx/conf/servers/servers_rs1.conf;
    
     check interval=1000 rise=2 fall=2 timeout=3000 type=http default_down=false;
     check_http_send "HEAD /health.htm HTTP/1.0\r\n\r\n";
     check_http_expect_alive http_2xx http_3xx;
    }
    
    server {
     listen 80;
    ...

    tcp方式檢測(tcp為默認檢測方式)

    upstream rs2 {
     server 127.0.0.1:11111;
     upsync 192.168.21.14:8500/v1/kv/upstreams/rs2/ upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
     upsync_dump_path /usr/local/nginx/conf/servers/servers_rs2.conf;
    
     check interval=1000 rise=2 fall=2 timeout=3000 type=tcp default_down=false;
    }
    
    server {
     listen 80;
    ...

    說明:

    推薦使用http方式檢測,http比tcp方式更準確,該檢測方式為nginx_upstream_check_module提供,功能強大,參數簡單解釋:每隔1秒進行1次健康檢查,每次超時時間為3秒,連續2次健康檢查成功則認為這個上游服務健康,將會被上線或一直保持在線;連續2次健康檢查失敗則認為這個上游服務不健康,將會被剔除下線。“/health.htm”是上游服務的健康檢查接口,通過它判斷服務是否健康。具體參數解釋可參考:http://tengine.taobao.org/document_cn/http_upstream_check_cn.html 參數簡單解釋:nginx-upsync-module模塊會每隔0.5秒向consul數據庫檢查一次配置,每次超時時間為6分鐘。具體參數解釋可參考:https://github.com/weibocom/nginx-upsync-module nginx會在/usr/local/nginx/conf目錄下面創建servers子目錄,該子目錄下會自動創建相關server配置文件。

    到此,nginx配置修改完成。

    三、創建upstream數據(consul鍵值對)

    可以通過web頁面或者腳本創建upstream數據,方法如下:

    1. web頁面操作

    如果需要創建目錄,在要創建的字段后面加上"/"即可,如:upstreams/ 。

    "Key/Value"中必須先創建"upstreams"目錄(后面有字母s),然后再創建對應的server名稱,截圖如下:

    2. 命令行操作

    使用命令行時不需要先創建"upstreams/"目錄,命令會自動創建目錄以及server數據。

    下面以上游服務Java1(IP為192.168.20.100,端口號為8080,upstream分組名稱為rs1)為例:

    添加記錄

    curl -X PUT http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token
    

    上述命令執行后,會形成一條nginx的upstream默認配置信息,即:

    server 192.168.20.100:8080 weight=1 max_fails=2 fail_timeout=10s;
    

    可以通過下面命令自定義權重等值:

    curl -X PUT -d "{\"weight\":100, \"max_fails\":2, \"fail_timeout\":10}" http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token
    # 或者 
    curl -X PUT -d '{"weight":100, "max_fails":2, "fail_timeout":10}' http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token

    刪除記錄

    curl -X DELETE http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token
    

    更新權重

    curl -X PUT -d "{\"weight\":100, \"max_fails\":2, \"fail_timeout\":10}" http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token
    # 或者 
    curl -X PUT -d '{"weight":100, "max_fails":2, "fail_timeout":10}' http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token

    下線服務

    curl -X PUT -d "{\"weight\":2, \"max_fails\":2, \"fail_timeout\":10, \"down\":1}" http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token
    # 或者
    curl -X PUT -d '{"weight":2, "max_fails":2, "fail_timeout":10, "down":1}' http://192.168.21.14:8500/v1/kv/upstreams/rs1/192.168.20.100:8080?token=$token

    查看upstream rs1下面有哪些上游服務器

    curl http://192.168.21.14:8500/v1/kv/upstreams/rs1?recurse
    

    推薦使用命令行操作,建議將命令行組裝成腳本實現DevOps

    四、一點感悟

    在改造該動態發現方案期間,遇到了很多問題,最棘手的一個問題是測試環境種nginx一直報錯,upstream數據始終無法完整下載,經過各種排查還是沒有發現問題,中間我懷疑過是consul的問題,換成了etcd還是同樣的報錯,最后通過抓包跟蹤,發現是Linux內核參數配置不當,導致隊列溢出tcp三次握手失敗,影響nginx與consul通信。

    很多方案理論上是沒有問題的,甚至說有人已經成功運用了,但是實際上親自實施的話還是會遇到各種各樣的問題,有些甚至是致命的,這時候就需要耐心的解決。希望大家在看到這篇文章的時候也去動手試試,如果遇到了問題請靜下心來耐心排查。

    還有一個是,很多人說運維是不產生價值的,我認為這么說是不對的,運維需要體現的價值有很多,SRE就是其中的一種。

    到此這篇關于基于nginx實現上游服務器動態自動上下線無需reload的文章就介紹到這了,更多相關nginx上游服務器自動上下線內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

    您可能感興趣的文章:centos7.2搭建nginx的web服務器部署uniapp項目vue項目部署到nginx/tomcat服務器的實現linux服務器nginx的卸載與安裝教程使用nginx設置代理服務器nginx 隱藏版本號與WEB服務器信息的解決方法詳解Nginx服務器之負載均衡策略(6種)配置nginx保證frps服務器與web共用80端口的方法一臺nginx服務器多域名配置的方法

  3. 本文相關:
  4. nginx + tomcat實現請求動態數據和請求靜態資源的分離詳解
  5. nginx1.8.0版本平滑升級新版本1.9.7
  6. ubuntu+nginx+mysql+php+zend+eaccelerator安裝配置文字版
  7. 封80端口應對策略 nginx反向代理for win2003超級傻瓜式配置
  8. nginx 負載均衡的三種參數設置
  9. nginx配置pathinfo隱藏thinkphp index.php
  10. nginx反向代理用做內網域名轉發
  11. nginx 轉發匹配規則的實現
  12. nginx proxy_cache批量清除緩存的腳本介紹
  13. nginx中使用gzip_http_version解決cdn只支持http 1.0問題
  14. 如何讓nginx不用reload,upstream的配置能實時動態...
  15. nginx的輪詢不是自動剔除down掉的服務器么 為什么...
  16. 如何設置nginx反向代理實現服務器瞬間故障轉移
  17. Nginx 如何優雅的實現這個需求
  18. 怎么用nginx實現路由自動切換
  19. nginx tcp負載均衡,一臺后端服務當掉,另一個能自...
  20. nginx可以把動態地址重定向偽靜態地址么
  21. nginx 將請求代理到后臺特定的服務器 怎么實現
  22. nginx 速度控制 怎么實現
  23. 如何實現這個動態的nginx反向代理NAT
  24. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全星外虛擬主機華眾虛擬主機linuxwin服務器ftp服務器dns服務器tomcat nginxzabbix云和虛擬化服務器其它首頁服務器centos7.2搭建nginx的web服務器部署uniapp項目vue項目部署到nginx/tomcat服務器的實現linux服務器nginx的卸載與安裝教程使用nginx設置代理服務器nginx 隱藏版本號與web服務器信息的解決方法詳解nginx服務器之負載均衡策略(6種)配置nginx保證frps服務器與web共用80端口的方法一臺nginx服務器多域名配置的方法nginx + tomcat實現請求動態數據和請求靜態資源的分離詳解nginx1.8.0版本平滑升級新版本1.9.7ubuntu+nginx+mysql+php+zend+eaccelerator安裝配置文字版封80端口應對策略 nginx反向代理for win2003超級傻瓜式配置nginx 負載均衡的三種參數設置nginx反向代理用做內網域名轉發nginx 轉發匹配規則的實現nginx proxy_cache批量清除緩存的腳本介紹nginx中使用gzip_http_version解決cdn只支持http 1.0問題nginx提示:500 internal servernginx 多站點配置方法集合權限問題導致nginx 403 forbiddenginx fastcgi錯誤primary scripnginx服務器的反向代理proxy_pasnginx 403 forbidden的解決辦法詳解nginx服務器中配置超時時間的nginx偽靜態配置和常用rewrite偽nginx下301重定向域名的方法小結windows下nginx+php5的安裝與配置nginx 代理服務器配置雙向證書驗證的方法nginx中path模式配置示例nginx配置ssl證書實現https訪問的示例nginx服務器搭建和基本配置詳解在nginx服務器上安裝配置博客程序typechocentos 7.0下nginx實現每天定時分割日志nginx http運行狀況健康檢查配置過程解析nginx開啟gzip壓縮大幅提高頁面加載速度的使用nginx中自帶的模塊配置縮略圖功能的教在nginx服務器上配置google反向代理的基本
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载