Nginx反向代理与负载均衡应用实战(三)
一、Nginx负载均衡核心组件介绍
1、Nginx upstream 模块介绍
Nginx的负载均衡功能依赖于ngx_http_upstream_module模块,所支持的代理方式包括proxy_pass、fastcgi_pass、memcached_pass等。
2、upstream模块语法
upstream模块的语法相当简单。
基本的upstream配置:
upstream www_server_pools {
server 10.0.0.9:80 weight=1;
server 10.0.0.10:80 weight=1;
}
备注:www_server_pools作为upstream集群组的名字,可以自己起名字,调用的时候就用这个。
较完整的upstream配置案例:
upstream www_server_pools {
server 10.0.0.5; #这一行标签和下一行是等价的
server 10.0.0.6:80 weight=1 max_fails=1 dail_timeout=10s;
server 10.0.0.7:80 weight=1 max_fails=2 dail_timeout=20s backup;
server 10.0.0.8:80 weight=1 max_fails=2 dail_timeout=20s backup;
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
二、Nginx负载均衡反向代理实践
1、利用upstream定义一组WWW服务器池
先定义一个名字为“www_server_pools”的服务池,里面有两台Web服务器
#这里定义web服务器池,包含了7,8两个web节点
upstream www_server_pools {
server 10.0.0.7:80 weight=1;
server 10.0.0.8:80 weight=1;
}
注意:默认调度算法是weighted round-robin,即权重轮询算法。
upstream仅仅是定义服务器池,并不会直接处理用户请求,必须要有其它方式将请求转给这个服务器池才行.
虽然定义的是WWW服务器池,但是这个服务器池也可以作为BBS等业务的服务器池。因为节点服务器的虚拟主机都是根据访问的主机头字段区分的。
2、配置WWW服务的虚拟主机Server负载代理
下面是Nginx反向代理WWW服务的虚拟主机配置:
三、反向代理多虚拟主机节点服务器企业案例
上一节代理的结果不对,究其原因是当用户访问域名是确实时携带了www.etiantian.org主机头请求Nginx反向代理服务器,但是反向代理向下面节点重新发起请求时,默认并没有在请求里告诉节点服务器要找那台虚拟机,所以WEB节点服务器接收到请求后发现没有主机头信息。因此就把节点服务器的第一个虚拟主机发给了反向代理。
解决这个问题的办法,就是当反向代理向后重新发起请求时,要携带主机头信息,以明确告诉节点服务器要找那个虚拟机。
具体的配置办法:proxy_set_header Host $host;
在代理向后端服务器发送的http请求头中加入host字段信息后,若后端服务器配置有多个虚拟主机,他就可以识别代理的是那个虚拟机.这是节点服务器多虚拟机时的关键配置。
整个Nginx代理配置:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#这里定义web服务器池,包含了9,10两个web节点
upstream www_server_pools {
server 10.0.0.7:80 weight=1;
server 10.0.0.8:80 weight=1;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://www_server_pools;####访问www.etiantian.org,请求发送给www_server_pools里面的节点
proxy_set_header Host $host;
}
access_log off;
}
}
再次访问,访问的域名就可以就完全可以对应上了,这样代理多虚拟主机节点服务器就不会出现问题了。
解决:反向代理后的节点服务器记录用户IP企业案例
解决反向代理时,节点服务器获取用户真实IP的必要功能配置:
proxy_set_header X-Forwarded-For $remote_addr;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
#这里定义web服务器池,包含了9,10两个web节点
upstream www_server_pools {
server 10.0.0.7:80 weight=1;
server 10.0.0.8:80 weight=1;
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://www_server_pools;####访问www.etiantian.org,请求发送给www_server_pools里面的节点
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log off;
}
}
注意:修改完配置文件后重新启动加载。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
特别注意:虽然反向代理这块已经配置好了,但是节点服务器需要的访问日志如果要记录用户真实IP,还必须进行日志格式配置,这样才能把代理传过来的X-Forwarded-For头信息记录下来,具体配置为:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ##就是这个<$http_x_forwarded_for>参数,如果希望在第一行显示,可以替>换掉第一行$remote_addr变量,这个日志格式前面章节已经详细讲解了。
}
server {
listen 80;
server_name www.etiantian.org;
location / {
proxy_pass http://www_server_pools;####访问www.etiantian.org,请求发送给www_server_pools里面的节点
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
access_log off;
}
}