nginx 负载均衡和反向代理的基本配置

负载均衡

  • 此处指的是选择一种策略,尽量把请求均匀的分布到每一个上游服务器

upstream

  • 配置块 http
  • 语法 upstream name{}
  • 定义一个上游服务器的集群,便于反向代理的proxy_pass使用
    upstream backend {
        server 127.0.0.1:5566 weight=1 max_fails=2 fail_timeout=30s;
    }

    server {
        location / {
            proxy_pass http://backend; #backend指上游服务器
        }
    }

server
  • 配置块 upstream
  • 语法 server names[parameters]
  • 指定一台上游服务器的名字 可以是域名,ip,UNIX句柄
parameters 定义
weight=number 上游服务器转发的权重 默认1
max_fails=number 在fail_timeout时间内,如果向上游服务器转发失败次数超过number,就认为该服务器在此时间段里不可用,默认1 设为0就不检查失败次数
fail_timeout=time 用于优化反向代理功能,与连接、读取、响应超时无关,默认10秒
down 永久下线服务器,只在使用ip_hash有效
backup 在使用ip_hash时无效 表示上游服务器只是备份服务器,只有在所有非备份上游服务器失效后,才会指向备份
ip_hash
  • 配置块 upstream
  • 语法 ip_hash;
  • 将单个用户的请求固定到某个上游服务器

先根据客户端的ip地址计算一个key,将可以按照upstream集群的上游服务器数量进行取模,再根据取模的结果把请求地址转发到相应的上游服务器,不能与weight同时使用,在标识上游服务器不可用时,要用down不能直接删除,确保转发策略一贯性

    upstream backend {
        ip_hash;
        server 127.0.0.1:5566 weight=1 max_fails=2 fail_timeout=30s;
        server backend down;
    }

记录日志时支持的变量

变量名 定义
$upstream_addr 处理请求的上游服务器地址
$upstream_cache_status 表示是否命中缓存,取值范围:MISS、EXPIRED、UPDATING、SATLE、HIT
$upstream_status 上游服务器返回的响应中HTTP响应码
$upstream_response_time 上游服务器响应时间,精度毫秒
$upstream_http_$HEADER http头部,如upstream_http_host
log_format timing '$remote_addr - $remote_user [$time_local] $request '
    'upstream_response_time $upstream_response_time '
    'msec $msec request_time $request_time';

log_format up_head '$remote_addr - $remote_user [$time_local] $request '
    'upstream_http_content_type $upstream_http_content_type'

反向代理配置

proxy_pass

  • 语法:proxy_pass URL;
  • 配置块 location、if

将当前请求反向代理到URL参数指定的服务器上,URL可以是主机名或ip地址

proxy_pass http://localhost:3000/uri/;

可以加上负载均衡 使用upstream
upstream backend {...}
server {location / {
            proxy_pass http://backend; #backend指上游服务器
        }}

可以把httpz转换成https
proxy_pass https://192.168.0.1/;

若需要转发host头部
proxy_set_header Host $host;

proxy_method

  • 语法:proxy_method method;
  • 配置块 http、server、location

转发时的协议方法名
proxy_method POST; 客户端的GET请求也会被转发成POST

proxy_hide_header

  • 语法:proxy_hide_header the_header;
  • 配置块 http、server、location

Nginx会将上游服务器的响应转发给客户端,但默认不会转发以下HTTP头部字段:Date、Server、X-Pad和X-Accel-*.使用proxy_hide_header可以指定哪些不能转发

proxy_hide_header Cache-Control;

proxy_pass_header

  • 语法:proxy_pass_header the_header;
  • 配置块 http、server、location

将原来禁止转发的header设为转发

proxy_pass_request_body

  • 语法:proxy_pass_request_body on|off;
  • 默认 on;
  • 配置块 http、server、location
    是否向上游转发http body

proxy_pass_request_headers

  • 语法:proxy_pass_request_headers on|off;
  • 默认 on;
  • 配置块 http、server、location
    是否向上游转发http header

prxoy_redirect

  • 语法:prxoy_redirect [default|off|redirect rep|replacement]];
  • 默认 default;
  • 配置块 http、server、location

当上游返回响应是重定向或刷新请求(301,302),proxy_redirect 可以重设HTTP头部的location或refresh字段。

proxy_redirect http://localhost:8000/two/ http://frontend/one/;

对location字段的URI是http://localhost:8000/two/some/uri.实际转发给客户端的是http://frontend/one/;

可以使用ngx-http-core-module提供的变量来设置

proxy_redirect http://localhost:8000/ http://$host:$server_port/;

可以省略replacement参数的主机名部分,这时会用虚拟主机名称填充
proxy_redirect http://localhost:8000/two/ /one/;

使用default参数时,会按照proxy_pass配置项和所属的location配置项重组

location /one/ {
  proxy_pass http://upstream:port/two/;
  proxy_redirect default;
}
等于
location /one/ {
    proxy_pass http://upstream:port/two/;
    proxy_redirect http://upstream:port/two/ /one/;
}

proxy_next_upstream

  • 语法:proxy_next_upstream [error|timeout|invalid_header|http_500|http_502|http_503|http_504|http_404|off];
  • 默认 error timeout;
  • 配置块 http、server、location

当向一台上游转发请求出错时,继续换一台处理
(invaild_header 上游响应不合法)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 80,860评论 21 356
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,980评论 0 9
  • Nginx的配置文件nginx.conf配置详解如下: user nginx nginx ; Nginx用户及组:...
    IT码农工阅读 839评论 0 0
  • 帮儿子钩了一条江湖传说中的“三万三”围巾,比实际图解缩小和缩短一些。绿色线不够干脆两头换成白色线搭配,看起来也蛮清...
    往事如烟花阅读 3,600评论 3 4