隐藏

Nginx集群搭建实践及宕机切换

发布:2022/12/11 10:47:26作者:管理员 来源:本站 浏览次数:940

Nginx负载均衡基本原理


负载均衡其实就是将流量或者请求转发到多台应用服务器,使服务器性能能够更好地发挥,一方面可以是整个流程更加稳定,即当一台服务器出现故障,另一台可以对其进行替代,不会产生影响。

流程图如下所示:

在这里插入图片描述这里假设服务器1为radware,也就是起到了负载均衡的作用,它可以把流量通过upstream分发到下面两台Nginx服务器上,然后两台Nginx服务器再将流量转发到应用服务器,实现Nginx双活状态。


环境准备及参数配置

首先准备三台服务器

1、144.121.234.1

2、144.121.234.2

3、144.121.234.3

其中第一台服务器作为radware负载均衡,后两台都作为Nginx

在三台服务器中分别安装Nginx10.1,下载网址为:https://nginx.org/download/

这里有nginx的各种版本,下载自己需要的,本文采用的版本为10.1,将下载好的压缩包放到/usr/local中,


解压:tar -zcvf 包名

创建文件夹:mkdir nginx

进入解压的文件夹,编译:./configure --prefix=/usr/local/nginx

安装:make && make install



编译时有可能会遇到问题,缺少依赖包PCRE,一般都是缺少这个,可以参考这篇文章进行必要环境的安装:https://www.runoob.com/linux/nginx-install-setup.html


三台机器都按照同样的步骤安装完毕,可以进入/usr/local/nginx/sbin执行:./nginx -v检查Nginx版本,看是否安装成功,通过./nginx启动Nginx,在通过ps -ef | grep nginx捕获Nginx进程,如果一切都没问题,通过./nginx -s stop命令关闭Nginx,进入下面配置文件的过程,以radware144.121.234.1为例。


Nginx的配置文件里有很多参数,在网上都可以随便找到,因此本文不再赘述,只介绍一下我在搭建环境中使用到的配置参数以及我认为比较重要的参数,当然,有很多功能我也没有深入探究,只用到了流量转发这一模块,首先是全局配置:

在这里插入图片描述

这一块的worker_process参数还是比较重要的,是个主模块指令,指定了Nginx要开启的进程数。每个Nginx进程平均耗费10M-12M内存。建议指定和CPU的数量一致即可


error_log这块采用默认设置就行,但是要理解它的作用,就是日志的输出,日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。


下一部分是http_proxy配置:

在这里插入图片描述这一部分的主要就是一些超时时间、空间大小,可以根据自己系统实际情况进行相应调整



最核心的部分,负载均衡设置:

在这里插入图片描述

其中server 144.121.234.2:7199,server 144.121.234.3:7199,由于配置的是负载均衡,因此将流量转发到这两台机器的7199端口,

upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。

在上面的设定中,通过upstream指令指定了一个负载均衡器的名称DMP。这个名称可以任意指定,在后面需要的地方直接调用即可。

Nginx的负载均衡模块支持四种调度算法,默认是轮询的方式,即每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;

Weight:指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下;

max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;

fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。


虚拟主机配置:

在这里插入图片描述这里的servername大家将其设置为自己的机器ip,比如这台就应该是144.121.234.1

监听端口为7299,即通过7299端口访问

server标志定义虚拟主机开始,

listen用于指定虚拟主机的服务端口,

server_name用来指定IP地址或者域名,多个域名之间用空格分开。

index用于设定访问的默认首页地址

root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。

Charset用于设置网页的默认编码格式。

access_log用来指定此虚拟主机的访问日志存放路径,


其他两台Nginx机器配置类似,只不过在upstream模块server ip为应用ip


Nginx切换演练

(一)两台Nginx都正常情况下:

发送查询信息,从应用后台查看日志,可以看到每一台应用轮流收到两笔查询,原因是从客户端发送到radware,radware到Nginx经过一次轮询,Nginx到后端又经过一次轮询,因此一共经过两次轮询

(二)宕掉一台Nginx

此时可以看到,后端轮流收到一次查询信息,因为Nginx只剩一台,因此从radware到nginx不再进行轮询

(三)两台Nginx全部宕机

查询失败,流量转发不了


总结

该配置是Nginx双活配置,只要有一台Nginx存活,流量就可以转发到后端服务器

考虑到性能的原因,后续可以采用keepalived机制对Nginx进行主备配置。


完整配置文件如下所示:



#user  www www;

worker_processes  24;


#error_log  logs/error.log;

#error_log  logs/error.log  notice;

error_log  logs/error.log  info;


pid        logs/nginx.pid;

#worker_rlimit_nofile 204800;



events {<!-- -->

   use epoll;

   worker_connections  4096;

}



http {<!-- -->

   include       mime.types;

   default_type  application/octet-stream;

   charset utf-8;

   log_format  main  '"$remote_addr" "$remote_user" [$time_local] "$request" '

                     '"$status" "$body_bytes_sent" "$http_referer" '

                     '"$http_user_agent" "$http_x_forwarded_for" '

                     '"$host" "$http_host" "$request_uri" "$uri" "$http_x_forwarded_for" '

                     '"$proxy_add_x_forwarded_for" "$scheme" '

                     '"upstream_response_time:$upstream_response_time" "request_time:$request_time" ';


   access_log  logs/access.log  main;


   sendfile        on;

   tcp_nopush     on;

   # send_timeout   3600;

   keepalive_timeout  65;


 # http_proxy 设置

   server_names_hash_bucket_size 128;

   large_client_header_buffers 4 4k;

   client_header_buffer_size 4k;

   client_max_body_size   10m;

   client_body_buffer_size   128k;

   proxy_connect_timeout   2;

   proxy_send_timeout   75;

   proxy_read_timeout   75;

   proxy_buffer_size   4k;

   proxy_buffers   4 32k;

   proxy_busy_buffers_size   64k;

  # proxy_max_temp_file_size;

   proxy_temp_file_write_size  64k;

   proxy_temp_path   /nginx/nginx/proxy_temp 1 2;


 # gzip压缩功能设置

   gzip off;

   gzip_min_length 1k;

   gzip_buffers    4 16k;

   gzip_http_version 1.0;

   gzip_comp_level 6;

   gzip_types text/htm text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;

   gzip_vary on;

  # gzip_proxied any;


 # 设定负载均衡后台服务器列表

   upstream  SMARTAU  {<!-- -->

             #ip_hash;

             server   144.121.234.2:7199 weight=1 max_fails=2 fail_timeout=30s ;

             server   144.121.234.3:7199 weight=1 max_fails=2 fail_timeout=30s ;

             #sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];

             #sticky name=smauroute path=/;

             keepalive 200;

             #check interval=3000 rise=2 fall=5 timeout=1000;

             check interval=3000 rise=2 fall=3 timeout=1000 type=http default_down=false;

             check_keepalive_requests 100;

             check_http_send "GET /api/check HTTP/1.1\r\nConnection: keep-alive\r\n\r\n";

             check_http_expect_alive http_2xx;

   }

 # 很重要的虚拟主机配置

   server {<!-- -->

       #监听端口

       listen       9200;

       #ssl安全设置

       #ssl on;

       #ssl_certificate /nginx/nginx/cert/ums/cacert.crt; #cacert.pem 文件路径

       #ssl_certificate_key /nginx/nginx/cert/ums/privkey.key; #privkey.pem 文件路径


       #server_name  bi.chinaums.com;

       #root   /apps/oaapp;

     

       charset utf-8;

       access_log  logs/host.access.log  main;


       #if ($scheme = "http") {<!-- -->

       #rewrite ^/(.*)$ https://$host:$server_port$1 permanent;

       #return 301 https://$http_host$request_uri;

       #}

       #error_page 497 https://$http_host$request_uri;

     

       location /api/smau {<!-- -->

           #index  index.jsp index.html index.htm;


           proxy_pass        http://SMARTAU;

           proxy_redirect off;

           # 后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

           #proxy_set_header  Host  $host:$server_port;

           proxy_set_header  Host  $http_host;

           proxy_set_header  X-Real-IP  $remote_addr;

           proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

           proxy_set_header X-Forwarded-Proto $scheme;

           #proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;

           proxy_next_upstream error timeout;

           proxy_http_version 1.1;

           proxy_set_header Connection "";

           chunked_transfer_encoding off;

       }

     

       #静态文件,nginx自己处理,不去backend请求tomcat

       #location  ~* /download/ {

       #    root /apps/oa/fs;

       #}

       #location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$  

       #{  

       #    root /apps/oaapp;  

       #    expires      7d;

       #}

       location /nginx_status {<!-- -->

           stub_status on;

           access_log off;

           allow 172.16.31.0/24;

           allow 127.0.0.1;

           deny all;

       }


       #location ~ ^/(WEB-INF)/ {  

       #    deny all;  

       #}

       #error_page  404              /404.html;


       # redirect server error pages to the static page /50x.html

       #

       #error_page   500 502 503 504  /50x.html;

       location = /50x.html {<!-- -->

           root   html;

       }

   }



}