一、 upstream模块
1、nginx的负载均衡功能依赖于ngx_http_upstream_module模块,支持的所有代理方式有proxy_pass,fastcgi_pass,memcached_pass
2、upstream模块语法
upstream配置时应放于http{}标签内;模块默认算法是wrr
3、upstream 参数
参数 | 描述 |
service | 反向服务地址 加端口 |
weight | 权重 |
max_fails | 失败多少次 认为主机已挂掉则,踢出 |
fail_timeout | 踢出后重新探测时间 |
backup | 备用服务 |
backup | 备用服务 |
max_conns | 允许最大连接数 |
slow_start | 当节点恢复,不立即加入 |
4、权重算法
- 轮询+weight 默认的
- ip_hash : 基于Hash 计; 应用场景:保持session 一至性
- url_hash: (第三方); 应用场景:静态资源缓存,节约存储,加快速度
- least_conn 最少链接
- least_time 最小的响应时间,计算节点平均响应时间,然后取响应最快的那个,分配更高权重。
二、http proxy模块
1、http proxy模块参数
http proxy模块参数 | 说明 |
proxy_set_header X-Forwarded-For $remote_adrr | 设置http请求header项传给后端服务节点,例如:可实现让代理后端的服务节点获取访问客户端用户的真实IP地址 |
proxy_set_header Host $Host | 当后端web服务器有多个虚拟主机时,需要用该Header来区分反向代理哪个主机 |
client_body_buffer_size | 用于指定客户端请求主体缓冲区大小,此处如果了解前面的http请求包的原理就好理解了 |
proxy_connect_timeout | 表示反向代理与后端节点服务器连接的超时时间,即发起握手等候相应超时时间 |
proxy_send_timeout | 表示代理后端服务器的数据回传时间,即在规定时间之内后端服务器必须传完所有的数据,否则Nginx将断开这个连接 |
proxy_buffer_size | 设置缓存区大小,默认该缓存区等于指令proxy_buffer设置的大小 |
proxy_buffer | 设置缓存区的数量和大小,Nginx从代理的后端服务器获取的响应信息,会放置到缓存区 |
proxy_busy_buffer_size | 用于设置系统很忙是可以使用的proxy_buffer大小,官方推荐大小为proxy_buffers*2 |
proxy_temp_file_write_size | 指定proxy缓冲临时文件的大小 |
proxy_read_timeout | 设置Nginx从代理的 后端服务器获取信息的时间,表示连接建立成功后,Nginx等待后端服务器的相应时间,其实是Nginx已经进入后端的排队之中等候处理的时间 |
LogFormat "\"%{X-Forwarded-For }i\"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined #web记录通过代理访问的客户真实ip的格式配置,httpd.conf
三、nginx反向代理
服务器环境:centos7 系统,4台
lb01:192.168.1.101
lb02:192.168.1.102
web01:192.168.1.103
web02:192.168.1.104
1、web服务安装
[root@web01 ~]# yum install httpd -y
[root@web02 ~]# yum install httpd -y
[root@web01 ~]# systemctl start httpd
[root@web02 ~]# systemctl start httpd
[root@web01 ~]# netstat -anp | grep httpd #检查httpd是否启动
[root@web02 ~]# netstat -anp | grep httpd #检查httpd是否启动
[root@web01 ~]# echo 192.168.1.103 >/var/www/html/index.html
[root@web02 ~]# echo 192.168.1.104 >/var/www/html/index.html
2、nginx安装
[root@web01 ~]# mkdir -p /app/nginx-1.8.1 #安装包下载及环境准备
[root@web02 ~]# mkdir -p /app/nginx-1.8.1
[root@lb01 ~]# yum install pcre-devel -y
[root@lb01 ~]# yum install openssl-devel -y
[root@lb02 ~]# yum install pcre-devel -y
[root@lb02 ~]# yum install openssl-devel -y
[root@lb01 ~]# yum install gcc gcc-c++ autoconf automake make -y
[root@lb02 ~]# yum install gcc gcc-c++ autoconf automake make -y
[root@lb01 ~]# groupadd nginx && useradd -g nginx nginx -s /bin/false
[root@lb02 ~]# groupadd nginx && useradd -g nginx nginx -s /bin/false
[root@lb01 ~]# tar -xvf nginx-1.8.1.tar.gz #解压安装包
[root@lb02 ~]# tar -xvf nginx-1.8.1.tar.gz
[root@lb01 ~]# cd nginx-1.8.1 #进入解压的安装文件,然后开始安装,以lb01为例
[root@lb01 nginx-1.8.1]# ./configure --prefix=/app/nginx-1.8.1/ --user=nginx --group=nginx --with-http_sub_module --with-http_ssl_module
[root@lb01 nginx-1.8.1]# make
[root@lb01 nginx-1.8.1]# make install
#lb02安装步骤同上,此处省略
[root@lb01 nginx-1.8.1]# /app/nginx-1.8.1/sbin/nginx #启动nginx并检查启动成功否
[root@lb01 nginx-1.8.1]# netstat -anp | grep nginx
[root@lb02 nginx-1.8.1]# /app/nginx-1.8.1/sbin/nginx #启动nginx并检查启动成功否
[root@lb02 nginx-1.8.1]# netstat -anp | grep nginx
[root@lb01 nginx-1.8.1]# curl 192.168.1.101
[root@lb02 nginx-1.8.1]# curl 192.168.1.102
3、配置负载均衡
用192.168.1.101来做负载
[root@lb01 ~]# cd /app/nginx-1.8.1/conf/
[root@lb01 conf]# egrep -v "#|^$" nginx.conf.default > nginx.conf
[root@lb01 conf]# vim nginx.conf #编辑配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream webpools { #upstream配置时,后面不能使用"_"线
server 192.168.1.103:80 weight=5;
server 192.168.1.104:80 weight=5;
server 192.168.1.105:80 weight=5 backup; #备用节点
}
server {
listen 80;
server_name www.shitouji.com;
location / {
root html;
index index.html index.htm;
proxy_pass http://webpools;
}
}
}
[root@lb01 ~]# /app/nginx-1.8.1/sbin/nginx -t #检查配置文件语法
[root@lb01 ~]# /app/nginx-1.8.1/sbin/nginx -s reload
#测试
[root@lb02 ~]# curl 192.168.1.101
192.168.1.103
[root@lb02 ~]# curl 192.168.1.101
192.168.1.104
[root@lb02 ~]# curl 192.168.1.101
192.168.1.103
4、其它应用配置说明
[root@lb01 conf]# vim nginx.conf #编辑配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream webpools { #upstream配置时,后面不能使用"_"线
server 192.168.1.103:80 weight=5;
server 192.168.1.104:80 weight=5;
server 192.168.1.105:80 weight=5 backup; #备用节点
}
server {
listen 80;
server_name www.shitouji.com;
location / {
root html;
index index.html index.htm;
proxy_pass http://webpools;
proxy_set_header Host $Host; #当web服务器上有多个虚拟主机服务时,可以通过此设置来指向对应的虚拟主机
proxy_set_header X-Forwarded-For $remote_addr; #将真实客户机的IP推给后端web服务记录,web服务需要更改日志格式为:LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
}
}
}
5、动静态分离
[root@lb01 conf]# vim nginx.conf #编辑配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream static { #upstream配置时,后面不能使用"_"线
server 192.168.1.103:80 weight=5;
}
upstream dynamic { #upstream配置时,后面不能使用"_"线
server 192.168.1.104:80 weight=5;
}
server {
listen 80;
server_name 192.168.1.103; # 当接收到http请求时,首先host和这里的server_name进行匹配,如果匹配上,则走这个虚拟主机的location路由
location /static/~(.*)(\.jpg|\.png|\.gif|\.jepg|\.css|\.js|\.css){ # 静态资源则路由到这里;#基于扩展名
alias html;
}
location /dynamic/ { # 其他的url则转发到 http://192.168.1.104;基于路径
proxy_pass http://dynamic;
include proxy.conf;
}
proxy_set_header Host $Host; #当web服务器上有多个虚拟主机服务时,可以通过此设置来指向对应的虚拟主机
proxy_set_header X-Forwarded-For $remote_addr; #将真实客户机的IP推给后端web服务记录,web服务需要更改日志格式为:LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
}
}