zoukankan      html  css  js  c++  java
  • 转——Nginx+keepalived实现负载均衡和高可用性 in ubuntu

    使用Nginx已经有很长一段时间,但是最近才去实践利用Nginx做负载均衡和高可用性。

    大致思路:根据keepalived的特性,通过一个虚拟ip来实现主从服务器的切换,如果一台服务器宕机,可以自动切换到另一台备份服务器,从而不影响用户的访问。

    以下是我的安装配置步骤,请大家参考指正。

    1:服务器准备

    准备两台ubuntu虚拟主机服务器,对应的IP分别是 192.168.1.100   192.168.1.200

    两台主机的ip一定要在相同的网段

    2:虚拟IP准备

    sudo ifconfig  eth0:0 192.168.1.150 netmask 255.255.255.0

    然后查看ifconfig,不难发现与之前的ifconfig 的不同。也可以通过ip a查看,对应的网卡eth0有两个ipaddress

    两台虚拟主机要使用相同的虚拟IP: 192.168.1.150

    3:安装nginx

    sudo apt-get install nginx

    安装完成之后,ps -ef|grep nginx 查看nginx的进程,如果没问题,可以查看http://192.168.1.100  如果显示正常,说明nginx服务正常启动。

    nginx的配置如下:

    C代码  收藏代码
    1. user www-data;  
    2. worker_processes 4;  
    3. pid /var/run/nginx.pid;  
    4.   
    5. events {  
    6.         worker_connections 1024;  
    7.         # multi_accept on;  
    8. }  
    9.   
    10. http {  
    11.   
    12.         ##  
    13.         # Basic Settings  
    14.         ##  
    15.   
    16.         sendfile on;  
    17.         tcp_nopush on;  
    18.         tcp_nodelay on;  
    19.         keepalive_timeout 65;  
    20.         fastcgi_buffer_size  64k;  
    21.         fastcgi_buffers      16  64k;  
    22.   
    23.         types_hash_max_size 2048;  
    24.         # server_tokens off;  
    25.   
    26.         # server_names_hash_bucket_size 64;  
    27.         # server_name_in_redirect off;  
    28.   
    29.         include /etc/nginx/mime.types;  
    30.         default_type application/octet-stream;  
    31.   
    32.         ##  
    33.         # Logging Settings  
    34.         ##  
    35.   
    36.         access_log /var/log/nginx/access.log;  
    37.         error_log /var/log/nginx/error.log;  
    38.   
    39.         upstream server_lb {  
    40.             server 192.168.1.100:9000; //9000为php的端口  
    41.             server 192.168.1.200:9000;  
    42.             ip_hash;  
    43.         }  
    44.   
    45.   
    46.   
    47.     server {  
    48.         listen       80;  
    49.         server_name  _;  
    50.         #root /var/www/html/demo/public;  
    51.         #charset koi8-r;  
    52.   
    53.         try_files $uri $uri/ $uri.php?$args /index.php;  
    54.   
    55.         location ~ .php$ {  
    56.             fastcgi_pass server_lb;//通过fastcgi进行负载均衡  
    57.             include fastcgi_params;  
    58.         }  
    59.         error_page   500 502 503 504  /50x.html;  
    60.         location = /50x.html {  
    61.             root   html;  
    62.         }  
    63.     }  
    64.       
    65. }  

    两台服务器的nginx配置一致

    4:安装keepalived

    sudo apt-get install keepalived

    安装完成之后,查看进程发现并没有keepalived的进程,这是因为keepalived配置文件不存在,需要用户自己创建一个keepalived.conf文件存放到/etc/keepalived目录

    Sh代码  收藏代码
    1. vrrp_script chk_nginx {  
    2.  script "/etc/keepalived/check_nginx.sh" //检测nginx进程的脚本  
    3.  interval 2  
    4.  weight 2  
    5. }  
    6.   
    7. global_defs {  
    8.  notification_email {  
    9.       //可以添加邮件提醒  
    10.  }  
    11. }  
    12. vrrp_instance VI_1 {  
    13.  state MASTER //主服务器  
    14.  interface eth0  
    15.  virtual_router_id 51   
    16.  mcast_src_ip 192.168.1.100  
    17.  priority 250  
    18.  advert_int 1  
    19.   
    20.  authentication {  
    21.         auth_type PASS  
    22.         auth_pass 123456  
    23.  }  
    24.  track_script {  
    25.         chk_nginx  
    26.  }  
    27.  virtual_ipaddress {  
    28.         192.168.1.150  
    29.  }  
    30. }  

    两台服务器的keepalived.conf文件除了优先级,state和mcast_src_ip不一样,其他的完全一致,但是需要注意的几点是:

    • 主服务器的state为MASTER,从服务器的state为BACKUP
    • 主服务器的priority一定要比从服务器的priority大
    • mcast_src_ip就是对应服务器的局域网ip
    • “{”前面一定要有个空格,不能跟前面的字符连起来,否则出现问题很难发现
    • check_nginx.sh脚本文件的执行权限一定要正确。
    • check_nginx.sh的代码如下:
      Sh代码  收藏代码
      1. #more /etc/keepalived/check_http.sh  
      2. #!/bin/bash  
      3. #代码一定注意空格,逻辑就是:如果nginx进程不存在则启动nginx,如果nginx无法启动则kill掉keepalived所有进程  
      4. A=`ps -C nginx --no-header |wc -l`  
      5. if [ $A -eq 0 ];then  
      6.  /etc/init.d/nginx start  
      7. sleep 3  
      8. if [ `ps -C nginx --no-header |wc -l`-eq 0 ];then  
      9.  killall keepalived  
      10. fi  
      11. fi  

    配置文件完成之后,sudo /etc/init.d/keepalived start,然后再查看下keepalived的进程是否存在,如果存在,再检查keepalived的log(sudo tail /var/log/syslog),如果看到nginx Keepalived_vrrp: VRRP_Script(chk_nginx) succeeded,则说明配置成功。

    两台服务器的keepalived配置和启动命令是一致的

    5:测试

    因为check_nginx的缘故,当启动keepalived是,nginx也会同时被启动,所以此时,查看nginx和keepalived的进程应该都是存在的,否则就是配置有问题。

    现在访问http://192.168.1.150,如果访问正常,此时应该显示的是主服务器的页面,也就是192.168.1.100的页面,否则也是配置有问题。

    然后在关闭主服务器的nginx访问,访问http://192.168.1.150页面应该正常,因为check_nginx的缘故。

    再关闭主服务器的keepalived进程,则此时访问http://192.168.1.150应该显示的是从服务器的页面,也就是192.168.1.200的页面,否则也是配置不正确。

    如果再关闭从服务器的nginx和keepalived则http://192.168.1.150无法访问。

    以上就是我的配置步骤,很粗略,还希望大家多指点酷

    另外,以下是版本信息

    ubuntu:Ubuntu 12.04.1 LTS (GNU/Linux 3.2.0-29-generic x86_64)

    Keepalived: v1.2.2

    nginx version: nginx/1.1.19

  • 相关阅读:
    Leetcode: 二分搜索法
    ALM 中查看某个 test 的更改 history 历史
    Python: map() and reduce()
    如何查询注册表的值及 Powershell 应用
    使用 Windows PowerShell 实现 Web UI 自动化 (转)
    zhuan: WAN simulating tool
    Robot Framework 1
    Enable Coded UI Testing of Your Controls
    NetBeans GUI tests on Jenkins + Windows (转)
    (转)JDK 1.8 预览版Lambda语法分析
  • 原文地址:https://www.cnblogs.com/taoboy/p/4809353.html
Copyright © 2011-2022 走看看