Nginx负载均衡的实现
本篇主要讲解 Nginx + JDK + Tomcat 负载均衡的部署,注重实用性,文章每个部分之间没有太大关系,可根据需求分开学习。
下来看一下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; } }