负载均衡(Load Balance),其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行,例如FTP服务器、Web服务器、企业核心应用服务器和其它主要任务服务器等,从而协同完成工作任务。
例如,当我们网站的访问量少的时候,单台服务器足以处理客户的请求。但随着我们的客户量,访问量越来越多时,单台服务器处理不过来就会造成响应时长过长,用户体验差,甚至造成服务器宕机,此时我们就需要配置服务器集群,多台服务器共同为用户提供服务,减轻单台服务器压力;而且当其中一台服务器出现问题宕机后,其他服务器依然可以正常接收处理用户请求,提高了系统的稳定性,用户体验也更好。
本文介绍Nginx配置反向代理实现负载均衡的步骤
一、正向代理与反向代理
1. 正向代理
正向代理类似一个跳板机,代理访问外部资源
比如我们国内访问谷歌,直接访问访问不到,我们可以通过一个正向代理服务器,请求发到代理服,代理服务器能够访问谷歌,这样由代理去谷歌取到返回数据,再返回给我们,这样我们就能访问谷歌了
正向代理的用途:
- 访问原来无法访问的资源,如google
- 可以做缓存,加速访问资源
- 对客户端访问授权,上网进行认证
- 代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息
2. 反向代理
反向代理(Reverse Proxy)实际运行方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器
反向代理的作用:
- 保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
- 负载均衡,通过反向代理服务器来优化网站的负载
二、负载均衡
现在我们搭建一个由两台服务器组成的集群为用户提供服务。
第一台服务器是:192.168.204.133
第二台服务器是:192.168.204.134
那么我们可以这样配置:所有的用户通过域名解析访问到第一台服务器:192.168.204.133的80端口,80端口由Nginx监听,接收到用户请求后,按照一定的策略(平均,权重,ip_hash等等)分发到真正处理请求的服务器中,我们设置真正处理请求的服务器是192.168.204.133的8080端口 和 192.168.204.134的80端口。这样,假如我们有100个请求同时请求我们的网站,那么可以把50个请求转发到192.168.204.133,另外50个请求转发到192.168.204.134,从而达到负载均衡的效果,减轻单机处理所有请求的压力。
三、负载均衡配置
注意点:
1,新装的Linux可能只允许访问80端口,其他端口不允许访问,此时需要配置防火墙
2,nginx+php环境访问显示access denied 解决办法:将php.ini中cgi.fix_pathinfo从0改为1。
3,fastcgi_pass有两种配置,unix:/tmp/php-cgi.sock 和 127.0.0.1:9000; 默认是前者
1,第一台服务器192.168.204.133的Nginx配置:
其中192.168.204.133:80提供代理服务,负责分发用户发送的请求到集群节点,192.168.204.133:8080提供真实服务,为一个集群节点
#nginx进程数,建议设置为等于CPU总核心数。该配置的数值越大,Nginx的并发能力就越强
worker_processes auto;
worker_cpu_affinity auto;
#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]
error_log /home/wwwlogs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid; #进程pid文件
worker_rlimit_nofile 51200; #指定进程可以打开的最大描述符:数目
events
{
use epoll;
worker_connections 51200;#数值越大,并发能力越强
multi_accept off;
accept_mutex off;
}
http
{
include mime.types; #引入一个外部文件: ./mine.types 该文件放着大量的媒体类型
default_type application/octet-stream;
# 负载服务器节点
upstream my-server
{
server 192.168.204.133:8080;
server 192.168.204.134:80;
}
# 代理服务器配置:
server
{
listen 80; #监听的端口
server_name _; #访问域名
location /
{
proxy_pass http://my-server/; #配置想要分发到的节点
}
}
# 服务器节点192.168.204.133:8080 配置:
server
{
listen 8080; #监听的端口
server_name _; #访问域名
index index.html index.php; #默认访问的文件
root /home/wwwroot/default/balance; #网站根目录
location /
{
index index.html index.php;
}
#命中php文件,交由php-cgi处理,非PHP应用忽略以下配置
location ~ \.php(.*)$
{
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
}
2,第二台服务器192.168.204.134的Nginx配置:
worker_processes auto;
worker_cpu_affinity auto;
error_log /home/wwwlogs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 51200;
multi_accept off;
accept_mutex off;
}
http
{
include mime.types;
default_type application/octet-stream;
# 服务器节点192.168.204.134 配置:
server
{
listen 80; #监听的端口
server_name _; #访问域名
index index.html index.php; #默认访问的文件
root /home/wwwroot/default; #网站根目录
location /
{
index index.html index.php;
}
#命中php文件,交由php-cgi处理,非PHP应用忽略以下配置
location ~ \.php(.*)$
{
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
#include vhost/*.conf;
}
然后我们打开两个浏览器窗口模拟两个请求,共同访问 192.168.204.133 ,可以看,一个请求分发到了192.168.204.133:8080,一个请求分发到了192.168.204.134:80,此时,负载均衡配置完成。