Linux系统中使用Nginx实现负载均衡
Posted aiguangyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统中使用Nginx实现负载均衡相关的知识,希望对你有一定的参考价值。
1. 负载均衡的种类
1. 通过硬件来进行解决。
常见的硬件有 NetScaler、F5、Radware 和 Array 等商用的负载均衡器,价格比较昂贵,一般应用于几十万甚至百万的互联网应用。
2. 通过软件来进行解决。
常见的软件有 LVS、nginx、apache 等,它们是基于 Linux 系统并且开源的负载均衡策略,处理并发一般在一到两万。
Nginx 的特点是占有内存少,并发能力强,Nginx 的并发能力在同类型的网页服务器中表现最好,很多大公司都在使用它。
2. Nginx负载均衡的分配方式
1. 轮询
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某一服务器挂了,自动剔除,轮询访问方式为默认方式。
2. 权重
指定轮询几率,权重和访问比率成正比,一般用于后端服务器性能不均的情况。
3. 哈希算法
每个请求按访问IP的哈希算法结果分配,这样每个访客固定访问一个后端服务器, 可以解决多个服务器的 session 问题。
3. 配置Nginx实现负载均衡
1. 准备工作
(1). 准备两台服务器;
假设目前有两台虚拟机服务器,一台为192.168.1.128,另一台为192.168.1.129。
(2). 关闭这两台服务器上的ESLinux;
vi etc/selinux/config
执行上面的命令打开SELinux的配置文件,按 i 键进入编辑模式,将SELINUX=enforcing 改为 SELINUX=disabled,然后按esc退出编辑模式,输入:wq 保存退出,执行以下命令使配置生效。
soure etc/selinux/config
如果配置没有生效,建议重启Linux。
init 6
(3). 打开这两台服务器上的端口号;
查询开启的端口号。
firewall-cmd --zone=public --list-ports
开启80端口号,如果服务应用程序访问的是其它端口号,则需要一并开启。
firewall-cmd --zone=public --add-port=80/tcp --permanent
2. 配置单个网站的负载均衡
以www.aaa.com网站为例,配置负载均衡的文件,放到192.168.1.128的服务器里面,代码如下:
# www_aaa_com 与下面的proxy_pass中的对应
upstream www_aaa_com {
# 默认按轮询分配访问
# server 127.0.0.1:3001;
# server 127.0.0.1:3002;
# server 192.168.1.129:3001;
# 如果有地址后加了权重weight的值,代表按比率轮询
# server 127.0.0.1:3001 weight=1;
# server 127.0.0.1:3002 weight=1;
# server 192.168.1.129:3001 weight=3;
# 加了ip_hash代表将IP地址进行哈希算法后进行分配
ip_hash;
server 127.0.0.1:3001 weight=1;
server 127.0.0.1:3002 weight=1;
server 192.168.1.129:3001 weight=3;
}
server {
listen 80;
server_name www.aaa.com;
# charset koi8-r;
# access_log /var/log/nginx/host.access.log main;
location / {
# 设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 禁用缓存
proxy_buffering off;
# 反向代理的地址
proxy_pass http://www_aaa_com;
}
# 配置socket.io(如果不需要,可以取消)
location /socket.io {
proxy_pass http://127.0.0.1:3001;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
# 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 /usr/share/nginx/html;
}
}
然后在192.168.1.128 的服务器里放两套www.aaa.com网站相同的代码,端口号分别为3001和3002,在192.168.1.129的服务器里也放www.aaa.com网站的代码,端口号为3001,这样便实现了服务器的负载均衡,当某个服务器挂了之后,服户访问便会自动切换到另一台服务器作出响应。
3. 配置多个网站的转发
以实现下面的网络拓扑结构为例。
首先配置www.aaa.com的nginx的配置文件,放到192.168.1.128的服务器里面,代码如下:
# www_aaa_com 与下面的proxy_pass中的对应
upstream www_aaa_com {
# 默认按轮询分配访问
# server 127.0.0.1:3001;
# server 127.0.0.1:3002;
# server 192.168.1.129:3001;
# 如果有地址后加了权重weight的值,代表按比率轮询
# server 127.0.0.1:3001 weight=1;
# server 127.0.0.1:3002 weight=1;
# server 192.168.1.129:3001 weight=3;
# 加了ip_hash代表将IP地址进行哈希算法后进行分配
ip_hash;
server 127.0.0.1:3001;
}
server {
listen 80;
server_name www.aaa.com;
# charset koi8-r;
# access_log /var/log/nginx/host.access.log main;
location / {
# 设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 禁用缓存
proxy_buffering off;
# 反向代理的地址
proxy_pass http://www_aaa_com;
}
# 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 /usr/share/nginx/html;
}
}
配置www.bbb.com的nginx的配置文件,放到192.168.1.128的服务器里面,代码如下:
# www_bbb_com 与下面的proxy_pass中的对应
upstream www_bbb_com {
# 默认按轮询分配访问
# server 127.0.0.1:3001;
# server 127.0.0.1:3002;
# server 192.168.1.129:3001;
# 如果有地址后加了权重weight的值,代表按比率轮询
# server 127.0.0.1:3001 weight=1;
# server 127.0.0.1:3002 weight=1;
# server 192.168.1.129:3001 weight=3;
# 加了ip_hash代表将IP地址进行哈希算法后进行分配
ip_hash;
server 127.0.0.1:3002 ;
}
server {
listen 80;
server_name www.bbb.com;
# charset koi8-r;
# access_log /var/log/nginx/host.access.log main;
location / {
# 设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 禁用缓存
proxy_buffering off;
# 反向代理的地址
proxy_pass http://www_bbb_com;
}
# 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 /usr/share/nginx/html;
}
}
配置www.ccc.com的nginx的配置文件,放到192.168.1.128的服务器里面,代码如下:
# www_ccc_com 与下面的proxy_pass中的对应
upstream www_ccc_com {
# 默认按轮询分配访问
# server 127.0.0.1:3001;
# server 127.0.0.1:3002;
# server 192.168.1.129:3001;
# 如果有地址后加了权重weight的值,代表按比率轮询
# server 127.0.0.1:3001 weight=1;
# server 127.0.0.1:3002 weight=1;
# server 192.168.1.129:3001 weight=3;
# 加了ip_hash代表将IP地址进行哈希算法后进行分配
ip_hash;
server 192.168.1.129:3001;
}
server {
listen 80;
server_name www.ccc.com;
# charset koi8-r;
# access_log /var/log/nginx/host.access.log main;
location / {
# 设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 禁用缓存
proxy_buffering off;
# 反向代理的地址
proxy_pass http://www_ccc_com;
}
# 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 /usr/share/nginx/html;
}
}
然后在192.168.1.128 的服务器里放www.aaa.com的代码,端口号为3001;在192.168.1.128 的服务器里放www.bbb.com的代码,端口号为3002;在192.168.1.129的服务器里放www.ccc.com的代码,端口号为3001,这样便利用nginx服务器实现了多个网站的转发。
以上是关于Linux系统中使用Nginx实现负载均衡的主要内容,如果未能解决你的问题,请参考以下文章
玩转Linux系统之搭建Nginx+Tomcat群集实现负载均衡