Nginx负载均衡的实现

本篇主要讲解 Nginx + JDK + Tomcat 负载均衡的部署,注重实用性,文章每个部分之间没有太大关系,可根据需求分开学习。

下来看一下Nginx反向代理的过程:

Nginx反向代理的过程

Nginx负载均衡的过程(会自动选择压力较小的服务器进行访问):

Nginx负载均衡的过程

可以看出,负载均衡是通过反向代理的原理实现的,所以也称 反向代理的负载均衡 。总的来说,负载均衡实现的方式分为软件实现和硬件实现两种,硬件实现运行的效率非常高,但是对应的成本也非常高。软件实现运行效率不如硬件,但是成本相对来说低得多。使用Nginx服务器实现负载均衡,能大大节约企业的成本,并且由于Nginx是服务器软件,其执行效率也是非常高。

负载均衡的核心就是建立一个服务器集群,然后用户首先访问到第三方代理服务器(Nginx),然后由代理服务器选择一个集群中的服务器,然后将请求引入选定的服务器(Tomcat)。如下图,通过反向代理我们实现下面的负载均衡,这里我们 假定 四台服务器公网的ip,一台做代理服务器,三台做负载均衡下的服务器:

具体实现负载均衡

到此整体架构已经非常清晰了,下面具体实现下(这里服务器选择CentOS,通过SSH进行远程操作,本地环境如果是Windows则可以尝试安装PuTTY,如果是Mac则直接使用终端工具即可)。

1.编辑nginx.config

#设置低权限用户,为了安全而设置的
user nginx;
#工作衍生进程数 worker_processes
1;
#指定错误日志存放的路径,错误日志记录级别可选项为:[debug|info|notice|warn|error|crit],默认是crit,记录的日志数量从crit到debug,由少到多。

error_log /var/log/nginx/error.log warn;
#设置pid存放路径(pid是控制系统中重要文件)
pid        /var/run/nginx.pid;

#设置最大连接数
events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    #自定义日志记录格式设置,main为名字,在access_log命令中引用
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      
    #指定日志存放路径,如果想使用默认的combined格式记录日志,可以使用access_log logs/access.log combined; 以下是使用log_format自定义的格式记录日志的。
    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;
 
    keepalive_timeout  65;
    # 开启gzip压缩设置(只能在http模块中设置)
    #gzip  on;    

      #gzip_min_length 1k;
      #gzip_buffers 4 16k;
      #gzip_http_version 1.1;
      #gzip_comp_level 2;
      #gzip_types application/x-javascript text/css application/xml;
      #gzip_vary on;


   #引入负载均衡的配置文件 
    include /etc/nginx/conf.d/*.conf;
}

2.编辑conf.d文件夹下的配置文件

示例:api.wanda-te.com.conf

#upstream设置,设置代理服务器(负载均衡池),默认的负载均衡方式是轮询,另外一种是ip_hash
#weight权重,默认1,权重越大访问概率越大,backup备用服务器,服务器全部崩溃后启动
upstream api_server{

server 192.168.2.21:8080 weight=5;
server 192.168.2.22:8080 weight=5;
server 192.168.2.23:8080 weight=5 backup;


}

server{
# 主机名称 server_name api.wanda
-te.com;
 # 监听的端口
listen
80;

# 设置Nginx的默认首页文件
index index.html index.htm index.jsp index.do;

        location / {

             proxy_pass http://api_server;#这个指令设置被代理服务器的地址和被映射的URI

             proxy_set_header   Host            $host;# 变量$host等于客户端请求头中的Host值。
             proxy_set_header   X-Real-IP        $remote_addr;
             proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;#后端的web服务器可以通过X-Forwarded-For获取真实的IP地址,$remote_addr客户端的ip地址
             proxy_read_timeout 300;#连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
             proxy_next_upstream off;
             proxy_ignore_client_abort on;
#proxy_next_upstream http_502 http_504 error timeout invalid_header;# 如果后端服务器返回502,504,执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现failover。 access_log
/var/log/nginx/api.wanda-te.com_access.log main; } }

 

posted @ 2017-09-21 14:43  十月围城小童鞋  阅读(148)  评论(0编辑  收藏  举报