使用的模块:ngx_http_proxy_module
官方文档:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#example
示例:
location / { proxy_pass //指定upstrem server地址,将请求报文发给哪台web服务器 proxy_set_header Host $host; //客户端请求时浏览器中输入的主机名,记录这个主机名是为了实现虚拟主机映射 proxy_set_header X-Real-IP $remote_addr;//客户端经过代理服务器时源ip会封装为代理服务器的ip,使用X-Real-IP记录她原来的ip,用于日志 }
location /uri {
proxy_pass http://back_server:port/newuri;
rewrite
}
1.这里的/uri会映射到newuri目录
2.但是如果是模式匹配,如~* /uri 那么这里的uri将补在newuri之后,back_server:port/后不能带任何路径
3.如果使用了url重写,那么后面的newurl将失效,会把重写后的结果直接补在back_server:port/后面进行响应
例子:
location / { #root html; #proxy_pass http://192.168.3.139/; index index.html index.htm; } location /forum/ { proxy_pass http://192.168.3.139/bbs/; #proxy_pass http://192.168.3.139/; #将url的forum映射到根目录而不是补到后面 index index.html index.htm; } #下面的例子中\.(jpg|png|gif)只是一种模式,不会像上面一样做url映射 location ~* \.(jpg|png|gif)$ { proxy_pass http://192.168.3.139; }
记录客户端真实ip
location / { #root html; proxy_pass http://192.168.3.139/; index index.html index.htm; proxy_set_header Host $host; proxy_set_header x-Real-IP $remote_addr; }
编辑后端主机http.conf
访问后查看后端主机日志:
proxy_set_header Host $host;
当后端web服务器上也配置有多个虚拟主机时,需要用该Header来区分反向代理那个主机名。在每个server模块中设置,区分每个虚拟主机。
proxy_set_header X-Forwarded-For $remote_addr;
如果后端Web服务器上的程序需要获取用户IP,从该Header头中获取
proxy_cache:缓存基于键值存储,存储格式由以下定义,键存储在内存中,值存储在文件系统上
proxy_cache_path
path
[levels
=levels
]
[use_temp_path
=on
|off
] keys_zone
=name
:size
[inactive
=time
]
[max_size
=size
]
max_size指定缓存最大多少空间
proxy_cache
指定用于缓存内存空间名称后,使用zone
调用这段空间keys_zone
=name
:size
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=one:10m; file names in a cache will look like this: /data/nginx/cache/c/29/b7f54b2df7773722d382f4809d65029c
定义了缓存目录在文件系统上的路径,这个路径属主属组必须是允许nginx进程的用户的属主属组
level定义了层级数,后面表示每个一级子目录只能以1个字符命名,2表示每个二级子目录只能以2个字符命名。keys_zone定义在内存空间中存储的键占据的空间大小和这段空间的名字
proxy_cache_methods
GET
| HEAD
| POST
...:
定义仅在客户端使用哪些方法时才缓存,默认是GET和HEAD
proxy_cache_min_uses 1; 定义响应了客户端多少次请求才缓存,默认为1
proxy_cache_purge string缓存修建,请求哪一个内容就删除哪一个内容,可以实现手动管理缓存
proxy_cache_bypass string: 设置在何种情形下nginx将不从cache取数据的;
例子:$cookie_nocache $arg_nocache $http_authorization---->有cookie不缓存,参数中明显有nocache的不缓存,有http授权信息的不缓存
proxy_cache_path /data/nginx/cache keys_zone=cache_zone:10m; map $request_method $purge_method { PURGE 1; default 0; } server { ... location / { proxy_pass http://backend; proxy_cache cache_zone; proxy_cache_key $uri; proxy_cache_purge $purge_method; } }
proxy_cache_use_stale
error
| timeout
| invalid_header
| updating
| http_500
| http_502
| http_503
| http_504
| http_403
| http_404
| off
是否使用过期缓存响应用户请求,后面的参数指定在什么场景中使用过期缓存
proxy_cache_valid [
按照响应码定义缓存有效时长code
...] time
;
proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m;
开启缓存功能:
编辑nginx.conf proxy_cache_path /cache/nginx/ levels=1:1 keys_zone=mycache:32m; chown -R nginx.nginx /cache/nginx 调用: location /forum/ { proxy_cache mycache; proxy_cache_valid 200 1h; proxy_cache_valid 301 302 10m; proxy_cache_use_stale error timeout invalid_header http_500; proxy_pass http://192.168.3.139/bbs/; index index.html index.htm; }
请求后查看缓存目录发现出现了缓存内容
roxy_http_version
1.0
| 1.1,默认1.0,1.1在长连接中使用
隐藏由proxy响应给客户端响应报文时指定的首部
proxy_read_timeout
和proxy_connect_timeout不同,这个是等待响应报文的超时时间,proxy_connect_timeout是连接请求的超时时间
官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.htm
配置代理后端多个主机:
nginx.conf文件
upstream upservers { #ip_hash此处可以指定使用ip_hash负载均衡算法实现同一客户端访问时一直调度在同一服务器上 server 192.168.3.139; #注意地址后面使用weight可以指定调度时权重,还可以使用down参数,当做临时维护时令前端健康监测监测到此主机down server 192.168.3.140 max_fails=2 fail_timeout=1 backup;backup设置备用服务器,一旦有好的服务器上线,他就失效 } location /forum/ { proxy_pass http://upservers/; index index.html index.htm; }
重启nginx测试,发现轮询调度后端服务器
健康监测相关:
fail_timeout
=time访问失败后多久后
不再调度此服务器
max_fails
=number 最多访问失败两次就不再调度此服务器
session使用ip地址绑定使用ip_hash会破坏负载均衡,大量做了SNAT的用户被识别为同一个而发送到后端同一台服务器。所以我们应该基于应用层做基于cookie的绑定
基于sticky实现session绑定:
cookie:携带cookie信息作为自己的标识符
route:客户端携带去往后端服务器的路由作为自己的标识符
learn ():根据客户端和服务器的交互信息
least_conn: 调度方法,最少连接;相当于wlc中的wlc算法,根据后端服务器承载的请求连接数量作出调度决策
keepalive 5:激活nginx和后端upstream server之间使用持久连接的时长,一般后端是缓存服务器时应设置为长连接,但后面是http服务器时不建议开启长连接
health_check 参数:间断性向后端upstream server发送健康探测指令,可以通过应用层模拟做请求资源进行健康监测,使用healthcheck时建议关闭访问日志,否则会产生大量IO
本文出自 “明天过后” 博客,请务必保留此出处http://leeyan.blog.51cto.com/8379003/1702974
原文地址:http://leeyan.blog.51cto.com/8379003/1702974