日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

利用nginx的proxy_next_upstream實(shí)現(xiàn)線路容災(zāi)

 命運(yùn)之輪 2013-06-24

本文是生產(chǎn)環(huán)境中的一個(gè)案例,主要是為了通過反向代理實(shí)現(xiàn)多條線路容災(zāi)。在原有的基礎(chǔ)上升級(jí)了openssl,openssh,nginx,通過一些模塊來實(shí)現(xiàn)我們的需求。

正常情況下,反向代理會(huì)去請(qǐng)求online下面的主機(jī),使用sticky模塊實(shí)現(xiàn)session粘連。如果online的下面的主機(jī)全部掛掉了,這個(gè)時(shí)候,它會(huì)去出502報(bào)錯(cuò)(或404,具體與你的環(huán)境有關(guān)),此時(shí)它會(huì)啟用下failover下面的主機(jī),以實(shí)現(xiàn)線路容災(zāi)。具體的容災(zāi)方式,你可以選擇多個(gè)。比如使用backup來進(jìn)行標(biāo)識(shí)。使用了nginx_upstream_check_module進(jìn)行后端的主機(jī)健康檢查。

  1. 重新部署新應(yīng)用nginx 
  2.  
  3. 1、升級(jí)openssh 
  4. 2、升級(jí)nginx 
  5. 3、增加nignx模塊 
  6.  
  7. 本次升級(jí)主要是從容災(zāi)的角度和反向代理安全性的角度考慮.通過升級(jí)openssh,避免一些低版本漏洞。 
  8. 添加nginx的一些常規(guī)支持: 
  9. a、支持多個(gè)SSL證書 
  10. b、支持反端http 健康檢查 
  11. c、支持session 粘滯 nginx-sticky-module //支持sticky+rr ,sticky+weight  
  12. d、通過nginx的權(quán)重+粘滯實(shí)現(xiàn)多線路容災(zāi) 
  13. e、添加geoip模塊支持,未來考慮智能CDN+GeoIP配合(在nginx前端對(duì)來源IP,判斷從哪個(gè)機(jī)房取數(shù)據(jù)) 
  14.  
  15.  
  16. 安裝telnet服務(wù)器: 
  17. #yum install -y telnet-server telnet 
  18.  
  19. 編譯托管的服務(wù) 
  20.  
  21. # chkconfig telnet on  
  22. # /etc/init.d/xinetd restart 
  23. Stopping xinetd:                                           [FAILED] 
  24. Starting xinetd:                                           [  OK  ] 
  25.  
  26. # netstat -tnlp  
  27. Active Internet connections (only servers) 
  28. Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name    
  29. tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2632/sshd            
  30. tcp        0      0 0.0.0.0:23                  0.0.0.0:*                   LISTEN      21977/xinetd  
  31.  
  32. //在防火墻中加入自己的IP允許23的規(guī)則 
  33.  
  34. 建立普通用戶進(jìn)行登錄 
  35. # useradd sshinstall 
  36. # echo "123456@sshinstall" | passwd --stdin sshinstall 
  37. Changing password for user sshinstall. 
  38. passwd: all authentication tokens updated successfully. 
  39.  
  40. 將該用戶加入到sudo組里 
  41. echo "sshinstall ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers 
  42.  
  43. 開始安裝包了 
  44. # tar -xzf openssl-1.0.1c.tar.gz  
  45. # cd openssl-1.0.1c 
  46. # ./config enable-tl***t  --prefix=/usr/local/openssl-1.0.0c 
  47. # make  
  48. # make test 
  49. # make install 
  50.  
  51. # echo /usr/local/openssl-1.0.0c/lib/ >> /etc/ld.so.conf  
  52. # ln -s /usr/local/openssl-1.0.0c/ /usr/local/openssl 
  53.  
  54. echo ' 
  55. PATH=/usr/local/openssl/bin:$PATH 
  56. export PATH' >>   /etc/profile 
  57.  
  58. # source /etc/profile  
  59. # openssl version -a 
  60. OpenSSL 1.0.1c 10 May 2012 
  61. built on: Fri Jan  4 00:32:23 CST 2013 
  62. platform: linux-x86_64 
  63. options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)  
  64. compiler: gcc -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -Wa,--noexecstack -m64 -DL_ENDIAN -DTERMIO -O3 -Wall -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM 
  65. OPENSSLDIR: "/usr/local/openssl-1.0.0c/ssl 
  66.  
  67. 開始刪除openssh  
  68. # rpm -e openssh-server-4.3p2-41.el5 --nodeps 
  69. # rpm -e openssh-4.3p2-41.el5 --nodeps 
  70. # rpm -e openssh-askpass-4.3p2-41.el5 --nodeps 
  71. # rpm -e openssh-clients-4.3p2-41.el5 --nodeps 
  72.  
  73. # rm -rf /etc/ssh/ 
  74.  
  75. 開始安裝openssh 
  76. # tar -xzf openssh-6.1p1.tar.gz 
  77. # cd openssh-6.1p1  
  78. # ./configure --prefix=/usr --sysconfdir=/etc/ssh --with-pam --with-ssl-dir=/usr/local/openssl-1.0.0c --with-md5-passwords --mandir=/usr/share/man  
  79. # make 
  80. # make install  
  81.  
  82. 將sshd加入到服務(wù)列表里面去 
  83.  
  84. # cp ./contrib/redhat/sshd.init /etc/init.d/sshd 
  85. # chmod u+x /etc/init.d/sshd 
  86. # chkconfig --add sshd 
  87. # chkconfig sshd on 
  88. # service sshd start 
  89. Starting sshd:  OK  ] 
  90. # ssh -v 
  91. OpenSSH_6.1p1, OpenSSL 1.0.1c 10 May 2012 
  92.  
  93. 關(guān)掉telnetserver,刪除sshinstall用戶 
  94. # chkconfig telnet off 
  95. # /etc/init.d/xinetd restart 
  96. Stopping xinetd:                                           [  OK  ] 
  97. Starting xinetd:                                           [  OK  ] 
  98. # netstat -tnlp  
  99. Active Internet connections (only servers) 
  100. Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name    
  101. tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      29602/sshd           
  102.  
  103. # userdel -r sshinstall  
  104.  
  105. 安裝Nginx 
  106. # tar zxvf libunwind-0.99.tar.gz 
  107. # cd libunwind-0.99/ 
  108. CFLAGS=-fPIC ./configure && make CFLAGS=-fPIC 
  109. # make CFLAGS=-fPIC install 
  110.  
  111. # tar xzf google-perftools-1.6.tar.gz 
  112. # cd google-perftools-1.6 
  113. # ./configure  
  114. # make && make install  
  115.  
  116. # tar -xzf pcre-8.12.tar.gz  
  117. # cd pcre-8.12 
  118. # ./configure && make && make install  
  119.  
  120. 安裝geoip 
  121. # wget http://geolite./download/geoip/api/c/GeoIP.tar.gz 
  122. # tar -xzf GeoIP.tar.gz  
  123. # cd GeoIP-1.4.8/ 
  124. # ./configure && make && make install 
  125. # wget http://geolite./download/geoip/database/GeoLiteCountry/GeoIP.dat.gz 
  126. # gunzip GeoIP.dat.gz  
  127. # echo '/usr/local/lib' > /etc/ld.so.conf.d/geoip.conf 
  128. # ldconfig 
  129.  
  130. 解壓各個(gè)模塊,在安裝nginx時(shí),加入該模塊 
  131. # unzip nginx_upstream_jvm_route.zip    //tomcat session 
  132. Archive:  nginx_upstream_jvm_route.zip 
  133.    creating: nginx-upstream-jvm-route/ 
  134.    creating: nginx-upstream-jvm-route/nginx_upstream_jvm_route/ 
  135.   inflating: nginx-upstream-jvm-route/nginx_upstream_jvm_route/CHANGES   
  136.   inflating: nginx-upstream-jvm-route/nginx_upstream_jvm_route/config   
  137.   inflating: nginx-upstream-jvm-route/nginx_upstream_jvm_route/jvm_route.patch   //補(bǔ)丁文件,需要手工進(jìn)行執(zhí)行 
  138.   inflating: nginx-upstream-jvm-route/nginx_upstream_jvm_route/ngx_http_upstream_jvm_route_module.c   
  139.   inflating: nginx-upstream-jvm-route/nginx_upstream_jvm_route/README   
  140.  
  141. # unzip master.zip  //nginx_upsteam check_module 
  142. # tar -xzf nginx-sticky-module-1.1.tar.gz  //session 
  143. # tar -xzf nginx-1.2.6.tar.gz    
  144. # cd nginx-1.2.6 
  145. 開始打補(bǔ)丁了 
  146. # patch -p0 < /root/upgrade/nginx-upstream-jvm-route/nginx_upstream_jvm_route/jvm_route.patch  
  147. patching file src/http/ngx_http_upstream.c 
  148. Hunk #1 succeeded at 4117 (offset 380 lines). 
  149. Hunk #3 succeeded at 4249 (offset 380 lines). 
  150. Hunk #5 succeeded at 4348 (offset 380 lines). 
  151. patching file src/http/ngx_http_upstream.h 
  152. Hunk #1 succeeded at 90 (offset 5 lines). 
  153. Hunk #3 succeeded at 118 (offset 5 lines). 
  154.  
  155. # patch -p1 < /root/upgrade/nginx_upstream_check_module-master/check_1.2.6+.patch  
  156. patching file src/http/modules/ngx_http_upstream_ip_hash_module.c 
  157. patching file src/http/modules/ngx_http_upstream_least_conn_module.c 
  158. patching file src/http/ngx_http_upstream_round_robin.c 
  159. patching file src/http/ngx_http_upstream_round_robin.h 
  160.  
  161. # ./configure --prefix=/usr/local/nginx  --user=nobody --group=nobody  --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_sub_module --with-http_geoip_module  --with-http_ssl_module  --with-http_ssl_module --with-openssl=/root/upgrade/openssl-1.0.1c --with-pcre=/root/upgrade/pcre-8.12 --add-module=/root/upgrade/nginx-upstream-jvm-route/nginx_upstream_jvm_route/  --add-module=/root/upgrade/nginx_upstream_check_module-master/ --add-module=/root/upgrade/nginx-sticky-module-1.1/ --with-google_perftools_module 
  162. # make && make install  
  163.  
  164. # /usr/local/nginx/sbin/nginx -v 
  165. nginx version: nginx/1.2.6 
  166.  
  167. 如果你的nginx是正常運(yùn)行的,請(qǐng)對(duì)當(dāng)前nginx進(jìn)行在線升級(jí). 
  168. # ps aux | grep master 
  169. root     13589  0.0  0.0  26772  3884 ?        S     2012   0:01 nginx: master process /usr/local/nginx/sbin/nginx 
  170. root     20834  0.0  0.0  61140   768 pts/4    S+   17:14   0:00 grep master 
  171.  
  172. 進(jìn)程替換 
  173. # kill -USR2 13589 
  174. # ps aux | grep master 
  175. root     13589  0.0  0.0  26772  3884 ?        S     2012   0:01 nginx: master process /usr/local/nginx/sbin/nginx 
  176. root     21395  0.5  0.0  40272  3504 ?        S    17:16   0:00 nginx: master process /usr/local/nginx/sbin/nginx 
  177. root     21416  0.0  0.0  61140   768 pts/4    S+   17:16   0:00 grep master 
  178.  
  179. # kill -WINCH 13589   //發(fā)送WINCH信號(hào)到舊的nginx主進(jìn)程以殺掉舊的nginx子進(jìn)程 
  180. # kill -QUIT 13589  // 退出舊的nginx主進(jìn)程  
  181. # ps aux |grep master 
  182. root     21395  0.0  0.0  40272  3504 ?        S    17:16   0:00 nginx: master process /usr/local/nginx/sbin/nginx 
  183. root     21749  0.0  0.0  61140   772 pts/4    S+   17:16   0:00 grep master 
  184.  
  185. 刪除老的版本 
  186. # rm -rf /usr/local/nginx/sbin/nginx.old  
  187. 查看當(dāng)前版本 
  188. # /usr/local/nginx/sbin/nginx -v 
  189. nginx version: nginx/1.2.6 
  190.  
  191. 完成所以安裝,收工! 
  192. # /usr/local/nginx/sbin/nginx -V 
  193. nginx version: nginx/1.2.6 
  194. built by gcc 4.1.2 20080704 (Red Hat 4.1.2-52) 
  195. TLS SNI support enabled  //用于支持SSL多域名證書的喲 
  196. configure arguments: --prefix=/usr/local/nginx --user=nobody --group=nobody --with-http_stub_status_module --with-http_gzip_static_module --with-http_realip_module --with-http_sub_module --with-http_geoip_module --with-http_ssl_module --with-http_ssl_module --with-openssl=/root/upgrade/openssl-1.0.1c --with-pcre=/root/upgrade/pcre-8.12 --add-module=/root/upgrade/nginx-upstream-jvm-route/nginx_upstream_jvm_route/ --add-module=/root/upgrade/nginx_upstream_check_module-master/ --add-module=/root/upgrade/nginx-sticky-module-1.1/ --with-google_perftools_module 
  197.  
  198. 環(huán)境驗(yàn)證: 
  199. 前端一臺(tái)反向代理,后端兩臺(tái)異地機(jī)房(A\B機(jī)房),A機(jī)房具有較高的帶寬、B機(jī)房作為備用機(jī)房。 
  200. 要求: 正常情況下,訪問全部走A機(jī)房,在A機(jī)房不可用時(shí),全部訪問走B機(jī)房。理論上我們不需要進(jìn)行session粘滯便可以輕松實(shí)現(xiàn)。但基于未來多機(jī)房分布,session粘滯還是必須需要的。那么當(dāng)前情況下,我有兩個(gè)模塊nginx_upstream_jvm_route(需要配置tomcat\resin等,應(yīng)用環(huán)境有限),nginx-sticky-module-1.1. 根據(jù)不同情況使用。 
  201.  
  202. 目前可以分為兩種情況: 
  203. 1、只有一條主線路和一條備線路 
  204. 要求: 在主線路可以使用時(shí),盡量使用主線路,備線路在主線路故障時(shí)使用。 
  205. 實(shí)際情況: A機(jī)房一線主線路,B機(jī)房一條備用線路(因?yàn)榫€路質(zhì)量差,所以備用)
  206. 具體配置如下: 
  207. upstream.conf 
  208. // 
  209.         upstream online { 
  210.         server 172.28.10.161:8080 max_fails=0 fail_timeout=3s ; 
  211.         server 172.28.10.163:8080  backup; 
  212.      
  213.         check interval=3000 rise=2 fall=1 timeout=1000 type=http
  214.         check_http_send "GET / HTTP/1.0\r\n\r\n"; 
  215.         check_http_expect_alive http_2xx http_3xx; 
  216.         } 
  217.  
  218. 2、有多條主線路和一條備線路 
  219. 要求: 多條主線路進(jìn)行負(fù)載均衡,在所有主線路都故障時(shí),使用備用線路. 
  220. 實(shí)際情況:A、C兩條線路進(jìn)行負(fù)載均衡、B線路最終備用線路. 
  221. 具體配置如下: 
  222. server.conf 
  223. // 
  224. server { 
  225.         ...... 
  226.         location / { 
  227.         proxy_pass http://online; 
  228.         } 
  229.         error_page  404 502 = @backup; //加502的原因是因?yàn)榫€上系統(tǒng)在online里的upstream全部掛掉時(shí),頁面會(huì)報(bào)502,并不是404 
  230.          
  231.         location @failover { 
  232.             proxy_pass http://backup; 
  233.         } 
  234.  
  235.         location /status { 
  236.                 check_status; 
  237.                 access_log   off; 
  238.                 allow all;  //生產(chǎn)環(huán)境請(qǐng)?jiān)试S特定IP訪問 
  239.         } 
  240.         ...... 
  241.  
  242. upstream.conf 
  243. // 
  244.     proxy_next_upstream  http_404 http_502;  //讓404報(bào)錯(cuò)進(jìn)入max_fails計(jì)數(shù) 
  245.         upstream online { 
  246.         sticky; 
  247.         server 172.28.70.161:8080 max_fails=0 fail_timeout=3s ; 
  248.         server 172.28.70.163:8080  max_fails=0 fail_timeout=3s ; 
  249.      
  250.         check interval=3000 rise=2 fall=1 timeout=1000 type=http
  251.         check_http_send "GET / HTTP/1.0\r\n\r\n"; 
  252.         check_http_expect_alive http_2xx http_3xx; 
  253.         } 
  254.  
  255.         upstream backup { 
  256.         server 172.28.22.29:7777  max_fails=0 fail_timeout=3s
  257.         } 
  258.  
  259.  如果upstream里的主機(jī)全部掛掉了,日志會(huì)報(bào)
  260. 2013/01/12 22:57:37 [error] 7627#0: *23641 no live upstreams while connecting to upstream, client: 100.120.111.94, server: *., request: "GET http://www./.....(省略) HTTP/1.1", upstream: "http://online/.....(省略), host: "www.", referrer: "http://www./.....(省略)" 

 最后需要指出的就是后端的日志記錄問題!這個(gè)在nginx升級(jí)安裝時(shí)已經(jīng)考慮到了,增加http_realip_module模塊。

本文出自 “潛入技術(shù)的海洋” 博客,轉(zhuǎn)載請(qǐng)與作者聯(lián)系!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多