$args 请求中的参数
$binary_remote_addr远程地址的二进制表示
$body_bytes_sent 已发送的消息字节数
$content_lengthHTTP请求信息里的”Content-Length“
$content_type HTTP请求信息里的”Content-Type“
$server_port
$server_protocol
$uri 请求的URI,可能和最初值不同,可能经过重定向之类的
$server_name
$server_addr
$scheme
$request_uri
$request_method
$request_filename
$request_body_file
$remote_addr
$remote_port
$request
$request_string
$nginx_version
$http_cookie
$http_referer
$http_post
$document_uri与uri相同
$document_root针对当前请求的根路径设置值
events{
}
http{
}
server{
listen80;
server_name*.*;
charsetutf-8;
root
sslon;
location~.*\.(php|php5)?${
fastcgi_pass127.0.01:9000;
fastcgi_indexindex.php;
includefastcgi.conf;
}
location~.*\.(gif|jpg|jpeg|png|bmp|swf)${
expires 30d;
}
location~.*\.(js|css)${
#dosomething
}
}
fastcgi.conf
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param REDIRECT_STATUS 200;
#定义负载均衡
nginx 的upstream 目前支持4种方式的分配
1、轮询 每个请求按时间逐一分配到不同的后端服务器,如果后端down掉,能自动剔除
2、weight 指定轮询几率,weight和访问率成正比,用于后端服务器性能不均衡的情况
3、ip_hash 每个请求按访问ip的hash结果分配,可以解决session共享问题
4、fair(第三方)按后端服务器响应时间来分配
5、url_hash(第三方)
配置
upstream myServer{
server127.0.0.1:9090 down;
server127.0.0.1:8080 weight=2 fail_timeout=30s;
server127.0.0.1:8081 weight=2 fail_timeout=30s;
}
proxy_pass http://myServer;
down: 表示当前的server不参与负载
weight: 默认为1,越大附在权重越大
max_fails:允许失败的次数默认为1,当超过最大次数时,返回prox_next_upstream 模块定义的错误
backup:其他所有非backup的服务器down的时候或忙的时候,请求。
fail_timeout:max_fails次失败后,暂停的时间
session共享
1) 不使用session,换作cookie
2) 应用服务器自行实现共享memcache或数据库保存
3)ip_hash
ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用:
1/ nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。
2/ nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。
4)upstream_hash
为了解决ip_hash的一些问题,可以使用upstream_hash这个第三方模块,这个模块多数情况下是用作url_hash的,但是并不妨碍将它用来做session共享:
假如前端是squid,他会将ip加入x_forwarded_for这个http_header里,用upstream_hash可以用这个头做因子,将请求定向到指定的后端:
可见这篇文档:http://www.sudone.com/nginx/nginx_url_hash.html
在文档中是使用$request_uri做因子,稍微改一下:
hash $http_x_forwarded_for;
这样就改成了利用x_forwarded_for这个头作因子,在nginx新版本中可支持读取cookie值,所以也可以改成:
hash $cookie_jsessionid;
假如在php中配置的session为无cookie方式,配合nginx自己的一个userid_module模块就可以用nginx自发一个cookie,可参见userid模块的英文文档:
http://wiki.nginx.org/NginxHttpUserIdModule
另可用姚伟斌编写的模块upstream_jvm_route:http://code.google.com/p/nginx-upstream-jvm-route/