使用的模块: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