负载均衡是指一台主服务器接收请求,转发到多台服务器组成的服务器集群,让多台服务器平均分担负载。
我在VMware上装了3台centos,其中一台作为反向代理服务器,其余两台组成服务器集群。
A:192.168.0.167
B:192.168.0.168
C:192.168.0.169 反向代理服务器
用户直接访问C服务器,由C服务器转发请求到A和B服务器。
C服务器nginx.conf 配置:
在 http { 内添加以下代码
upstream myserver { #myserver为自定义的名称
server 192.168.0.167:80; #服务器A的ip
server 192.168.0.168:80; #服务器B的ip
}
在location / { 内添加以下代码
proxy_pass http://myserver; #转发到哪个服务器集群,我这里为http://myserver
A、B服务器nginx.conf 配置(如果服务器中只有一个server域,这一步可以省略)
把 server { 内的server_name改成服务器C的ip或域名
server_name 192.168.0.169;
然后把两个完全一样的项目分别部署到服务器A、B上。
这里为了测试,我把两个index.php文件分别放到A、B服务器上
并分别写入内容
<?php
echo '这里是服务器A';
<?php
echo '这里是服务器B';
在浏览器输入反向代理服务器C的IP:
反复刷新浏览器,结果为两个内容交替显示,说明反向代理服务器是轮流把请求转发到服务器集群中的服务器的。至此完成了一个简单的负载均衡配置。
为什么会轮流交替转发呢?因为upstream默认是以轮询的方式,按照请求的时间顺序向服务器集群中的服务器轮流分配,如果遇到宕机的服务器,即把请求转向下个服务器。upstream还有其他分配策略,下面介绍其中几种:
ip_hash
根据IP分配,相同IP的请求会分配到同一服务器,可以解决session的问题。
upstream 192.168.0.169 {
ip_hash;
server 192.168.0.167:80;
server 192.168.0.168:80;
}
还可以为每个服务器分别设置分配规则:
- weight:权重,设置值越大,被分配到几率越大。
- backup:备用服务器,当其他服务器宕机的时候才会启用。
- down:表示不使用该服务器。
upstream 192.168.0.169 {
server 192.168.0.165:80 weight=1;
server 192.168.0.166:80 weight=2;
server 192.168.0.167:80 backup;
server 192.168.0.168:80 down;
}
以上,反向代理服务器C仅仅只作为一个负责转发请求的中转站,是否有点浪费?
那么我们可以把服务器C也配置成一个可以提供后端服务的服务器,让其既作为一个反向代理服务器,又作为服务器集群中的一份子。
在nginx.conf的http { 内添加一个server段,让其侦听与反向代理服务器不同的端口
server {
listen 8080; #侦听端口
server_name 192.168.0.169; #反向代理服务器IP或域名
root /www; #网站根目录
location / {
index index.html index.php;
}
location ~ \.php {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
然后在upstream内加入此sever的ip和端口
upstream myserver {
server 192.168.0.167:80;
server 192.168.0.168:80;
server 192.168.0.169:8080; #添加此IP和端口
}
再把网站部署到根目录里面就可以了。
又或者,可以把反向代理服务器配置为缓存服务器
在http中写入以下代码:
proxy_cache_path /cache/servercache levels=1:2 keys_zone=testCache:1m inactive=1h max_size=30m;
各参数解释:
proxy_cache_path /cache/servercache 缓存路径,缓存文件夹的上级文件夹必须要指定,否则会保存,如这里要手动建立 /cache 文件夹;
levels=1:2 缓存目录的层级名称,这里指定两层目录,第一次名称为一个字母,第二层为两个;
keys_zone=testCache:1m 指定缓存区名称和内存缓存空间大小;
inactive=2h 缓存数据超过两小时没人访问将会自动删除;
max_size=30m 指定硬盘缓存空间大小;
然后加入一下代码
proxy_cache testCache; #指定使用的缓存去,设置为上面keys_zone指定的缓存区
proxy_cache_valid 200 304 12h; #设置各状态码的缓存时间,若不指定状态码只写12h,即默认只缓存200、301、302
#proxy_cache_valid any 1m; #也可以用any代替所有状态码
这些代码写在 http server location 任一个域里面都可以
访问一下网站,看有没有生成缓存文件