nginx反向代理工作方式
nginx作为方向代理服务器,其工作方式有两个点需要注意:
- 当转发请求的时候,nginx会接收完所有的请求数据,再去转发请求。
- 在响应的时候,nginx是一边接收响应数据,一边将响应数据返回给客户端的。
配置upstream
配置示例:
upstream testUrl{
#ip_hash;
server 服务器1 #weight=5 max_fails=3 fail_timeout=30s down;
server 服务器2;
}
首先我们需要定义一个上有服务,name为testUrl,这个upstream中包含以下属性:
属性名 | 作用描述 | 备注 |
---|---|---|
ip_hash | 负载均衡策略,如果不配置,默认为轮询 | 不能和weight一起使用 |
server | 指定这个upstrem中包含哪些上游服务 | |
weight | 负载均衡策略为轮询时各服务的比重 | 不能和ip_hash一起使用 |
max_fails | 在fail_timeout时间内,失败次数超过max_fails,则认为服务不可用 | 默认为1 |
fail_timeout | 和max_fails一起使用 | 默认10s |
down | 下线服务器 | 和ip_hash一起使用 |
配置访问日志
我们可以在http模块中使用log_format定义一个log的格式:
log_format format_name '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'$upstream_addr $upstream_cache_status';
这里其实就是拿nignx的一些变量来组装成日志的输出格式,除了nginx默认的日志内容,如果想要添加目标服务器的信息可以添加一下参数:
变量 | 含义 |
---|---|
$upstream_addr | 访问的上游服务器的地址 |
$upstream_cache_status | 是否命中缓存 |
$upstream_status | 上游服务器的响应状态 |
$upstream_response_time | 上游服务器的响应时间 |
更多全量的参数建议去官方文档查看有哪些内置变量。
定义好log_format后,我们只需要在打开日志的时候指定format即可:
access_log 日志输出地址 format_name;
配置server模块
server{
proxy_pass http://testUrl;
proxy_method POST;
proxy_pass_request_body on;
proxy_next_upstream http_404;
}
下表是对server模块中的属性的作用的描述:
属性名 | 作用 | 备注 |
---|---|---|
proxy_pass | 将拦截到的请求转发到指定的上游服务 | 可以是一个具体的地址,也可以是upstram的name |
proxy_method | 将请求转发成指定的method | 不管原始请求的method是什么,经过转发后到上游服务器的method为指定的这个 |
proxy_hide_header | 指定哪些head字段不会被转发 | 默认不转发的有:Date、Server、X-Pad和X-Accel-* |
proxy_pass_header | 指定哪些head字段要转发 | |
proxy_pass_request_body | 是否向上游服务器发送body | 默认是发送 |
proxy_next_upstream | 当处理请求的上游服务器出现异常的时候,继续换一台服务器处理的策略 | 默认是当出现error和timeout的时候,语法为:proxy_next_upstream[error timeout invalid_header http_500 http_502 http_503 http_504 http_404 off]; off为出错就直接转发 |