upstream xxx {
server ip1:port1 status;
server ip2:port2 status;
...
}
server {
...
location ...{
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
proxy_pass ;
...
}
}
# xxx为定义的后端服务器群的名称
# ip:port为后端提供web服务的ip和端口号
# status是后端服务器群各个节点的状态
proxy_set_header的作用:
该指令的意义在于修改http请求头的信息。这里修改的主要是请求头中的host字段和remote_addr字段。在设置了负载均衡之后,客户端的请求先到达负载均衡层,再到真实的web服务器,由此请求经过了一个中间层。Host的含义是表明请求的主机名,因为nginx作为反向代理使用,而如果后端真实的服务器设置根据http请求头中的host字段来进行路由或判断功能的话(即根据host字段判断请求发往哪个虚拟主机),如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败(默认反向代理服务器会向后端真实服务器发送请求,并且请求头中的host字段应为proxy_pass指令设置的服务器,也就是上边的xxx)。x-forward-for表示http请求由谁发起的,如果负载均衡层不重写该字段的ip,则后端真实服务器收到的http请求头中都是负载均衡服务器的ip地址,如果后端有防×××策略的话,那么负载均衡服务器就被真实服务器封掉了。
status的常用状态有
down 表示该web节点不参与负载均衡的调度
weight 定义该web节点的权值
backup 表示预留web节点,只有当所有的非backup的web节点出现故障的时候,backup节点才会接受请求
max_fails 表示请求该web节点的最大的失败次数
fail_timeout 表示该节点在经历max_fails次的失败请求之后,暂停服务的时间
实验环境:
192.168.239.130:80 前端负载均衡节点
192.168.239.129:80 后端提供web服务的节点1
192.168.239.132:80 后端提供web服务的节点2
负载均衡节点的nginx.conf内容如下:
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/error.log notice;
pid /usr/local/nginx/logs/nginx.pid;
events {
use epoll;
worker_connections 1024;
}
http {
include 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 /usr/local/nginx/logs/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60;
gzip on;
upstream webserver {
# web1
server 192.168.239.129:80 weight=4 max_fails=3 fail_timeout=20s;
# web2
server 192.168.239.132:80 weight=3 max_fails=3 fail_timeout=20s;
}
server {
listen 80;
server_name blog.linux.com;
root /data/html;
index index.php index.html index.htm;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
proxy_pass ;
}
节点1就是4.LNMP架构搭建的web服务,这里不再重写其nginx.conf文件的内容
节点2的nginx.conf的配置内容如下: