配置Nginx实现负载均衡方法
一、Nginx的介绍
1.跨多个应用程序实例的负载平衡是一种用于优化资源利用率,最大化吞吐量,减少延迟和确保容错配置的常用技术。可以将nginx用作非常有效的HTTP负载平衡器,以将流量分配到多个应用程序服务器,并使用nginx改善Web应用程序的性能,可伸缩性和可靠性
二、Nginx优点
1. 作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率。在高连接并发的情况下,Nginx是Apache服务器不错的替代品,能够支持高达 50000 个并发连接数的响应。
2. Nginx 配置简洁, Apache 复杂 ,Nginx 启动特别容易, 并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动. 你还能够不间断服务的情况下进行软件版本的升级 . Nginx 静态处理性能比 Apache 高 3倍以上 ,Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端来使用 ,Apache 的组件比 Nginx 多.
3. 最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;Nginx是异步的,多个连接(万级别)可以对应一个进程 .
4. Nginx的优势是处理静态请求,cpu内存使用率低,apache适合处理动态请求,所以现在一般前端用Nginx作为反向代理抗住压力,apache作为后端处理动态请求。
三、Nginx 工作原理
Nginx会按需同时运行多个进程:一个主进程(master)和几个工作进程(worker),配置了缓存时还会有缓存加载器进程(cache loader)和缓存管理器进程(cache manager)等。所有进程均是仅含有一个线程,并主要通过“共享内存”的机制实现进程间通信。主进程以root用户身份运行,而worker、 cache loader和cache manager均应以非特权用户身份运行 如下图:
四、负载均衡的策略
Nginx负载均衡是通过upstream模块来实现的,内置实现了三种负载策略,配置还是比较简单的。官网负载均衡配置说明:http://nginx.org/en/docs/http/load_balancing.html 三种负载策略如下:
1 轮循(默认)
Nginx根据请求次数,将每个请求均匀分配到每台服务器
2 最少连接
将请求分配给连接数最少的服务器。Nginx会统计哪些服务器的连接数最少。
3 IP Hash
绑定处理请求的服务器。第一次请求时,根据该客户端的IP算出一个HASH值,将请求分配到集群中的某一台服务器上。后面该客户端的所有请求,都将通过HASH算法,找到之前处理这台客户端请求的服务器,然后将请求交给它来处理。
五、配置Nginx在项目中的使用
1.以下是我在实际项目中的完整配置 用的是轮询策略 nginx.conf完整代码如下:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# include /etc/nginx/conf.d/*.conf;
client_max_body_size 50m;
client_header_timeout 1m;
client_body_timeout 1m;
proxy_connect_timeout 60s;
proxy_read_timeout 1m;
proxy_send_timeout 1m;
upstream westos{
server 192.168.10.230; #这里没有写端口号 所以默认配置端口号是80
server 192.168.10.231;
server 192.168.10.232;
}
server {
listen 443 ssl; 端口号
server_name www.baidu.com; // 域名地址
ssl_certificate /etc/nginx/serverpem.pem; #域名pem秘钥文件
ssl_certificate_key /etc/nginx/serverkey.key; #域名key秘钥文件
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://westos;
}
}
}
2.以上proxy_pass http://westos:表示将所有请求转发到westos服务器组中配置的某一台服务器上。upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。westos是服务器组的名称。upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。通过上面的配置,Nginx默认将请求依次分配给230,231,232来处理,可以通过weight(默认为1,将请求平均分配给每台server)修改下面这些参数来改变默认的分配策略:
upstream westos{
server 192.168.10.230 weight=1; # 1/6次
server 192.168.10.231 weight=2; # 2/6次
server 192.168.10.232 weight=3; # 3/6次
}
上例配置,表示6次请求中,230分配1次,231分配2次 ,232分配3次 然后可以继续如下两个参数:
max_fails :默认为1。某台Server允许请求失败的次数,超过最大次数后,在fail_timeout时间内,新的请求将不会分配给这台机器。如果设置为0,Nginx会将这台Server置为永久无效状态,然后将请求发给定义了proxy_next_upstream, fastcgi_next_upstream, uwsgi_next_upstream, scgi_next_upstream, and memcached_next_upstream指令来处理这次错误的请求。
fail_timeout :默认为10秒。某台Server达到max_fails次失败请求后,在fail_timeout期间内,nginx会认为这台Server暂时不可用,不会将请求分配给它
upstream westos{
server 192.168.10.230 weight=1 max_fails=3 fail_timeout=15;
server 192.168.10.231 weight=2;
server 192.168.10.232 weight=3;
}
server 192.168.10.230这台机器,如果有3次请求失败,nginx在15秒内,不会将新的请求分配给它
backup :备份机,所有服务器挂了之后才会生效
upstream westos{
server 192.168.10.230 weight=1 max_fails=3 fail_timeout=15;
server 192.168.10.231 weight=2;
server 192.168.10.232 weight=3 backup;
}
以上在230和231都挂了之前,232为不可用状态,不会将请求分配给它。只有当230和231都挂了,232才会被启用,其他的参数就不一一讲了 具体要是在实际中用到了 可以参考官网的API文档 注意 这几台服务的jar和前端代码包路径都得一模一样,最后启动nginx 从控制台可以看负载均衡的效果