**
**
nginx系列之一:nginx入门
nginx系列之二:配置文件解读
nginx系列之三:日志配置
nginx系列之四:web服务器
nginx系列之五: 负载均衡
nginx系列之六:cache服务
nginx系列之七:限流配置
nginx系列之八:使用upsync模块实现负载均衡
转自:在此感谢原博主的整理分享
使用nginx做负载均衡的两大模块:
nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块,所支持的代理方式有 proxy_pass(一般用于反向代理),fastcgi_pass(一般用于和动态程序交互),memcached_pass,proxy_next_upstream,fastcgi_next_pass,memcached_next_pass 。
upstream 模块应该放于http{}标签内。
模块写法:
upstream backend {
ip_hash;
server backend1.example.com weight=5;
server backend2.example.com:8080;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
实例一:
upstream dynamic { zone upstream_dynamic 64k;
server backend1.example.com weight=5; server backend2.example.com:8080 fail_timeout=5s slow_start=30s; server 192.0.2.1 max_fails=3; server backend3.example.com resolve; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup;
}
语法解释:
server IP 调度状态
server指令指定后端服务器IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。
例:如果max_fails是5,他就检测5次,如果五次都是502.那么,他就会根据fail_timeout 的值,等待10秒,再去检测。
server 如果接域名,需要内网有DNS服务器,或者在负载均衡器的hosts文件做域名解析。server后面还可以直接接IP或IP加端口。
upstream backend {
server backend2.example.com:8080;
server backup1.example.com:8080 backup;
keepalive 100;
}
通过该指令配置了每个worker进程与上游服务器可缓存的空闲连接的最大数量。
当超出这个数量时,最近最少使用的连接将被关闭。keepalive指令不限制worker进程与上游服务器的总连接。
location / {
# 支持keep-alive
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://backup;
}
连接池配置建议
location作用:基于一个指令设置URI。
Syntax: location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: —
Context: server, location
=
精确匹配,如果找到匹配=号的内容,立即停止搜索,并立即处理请求(优先级最高)~
区分大小写~*
不区分大小写^~
只匹配字符串,不匹配正则表达式@
指定一个命名的location,一般用于内部重定义请求,location @name {…}匹配是有优先级的,不是按照nginx的配置文件进行。
官方的例子:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
结论:
/
匹配A。/index.html
匹配B/documents/document.html
匹配C/images/1.gif
匹配D/documents/1.jpg
匹配的是E。location / {
return 401;
}
location = / {
return 402;
}
location /documents/ {
return 403;
}
location ^~ /images/ {
return 404;
}
location ~* \.(gif|jpg|jpeg)$ {
return 500;
}
测试结果(重点看):
[root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/
402
[root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/index.html
401
[root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/documents/document.html
403
[root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/images/1.gif
404
[root@lb01 conf]# curl -I -s -o /dev/null -w "%{http_code}\n" http://10.0.0.7/dddd/1.gif
500
结果总结:
匹配的优先顺序,=
>^~
(匹配固定字符串,忽略正则)>完全相等
>~*
>空
>/
。
工作中尽量将’='放在前面
proxy_pass 指令属于ngx_http_proxy_module 模块,此模块可以将请求转发到另一台服务器。
写法:
proxy_pass http://localhost:8000/uri/;
实例一:
upstream blog_real_servers {
server 10.0.0.9:80 weight=5;
server 10.0.0.10:80 weight=10;
server 10.0.0.19:82 weight=15;
}
server {
listen 80;
server_name blog.etiantian.org;
location / {
proxy_pass http://blog_real_servers;
proxy_set_header host $host;
}
}
proxy_set_header host $host;
。proxy_set_header X-Forwarded-For $remote_addr;
配置如下:
log_format commonlog '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
rs_apache节点的httpd.conf配置
LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{U
ser-Agent}i\"" combined修改日志记录
apache
LogFormat "\"%{X-Forwarded-For}i\" %l %u %t \"%r\" %>s %b" common
client_max_body_size 10m;
允许客户端请求的最大的单个文件字节数。client_body_buffer_size 128k;
缓冲区代理缓冲用户端请求的最大字节数 可以理解为先保存到本地再传给用户。proxy_connect_timeout 600;
跟后端服务器连接的超时时间_发起握手等候响应超时时间。proxy_read_timeout 600;
连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理。proxy_send_timeout 600;
后端服务器回传数据时间,就是在规定时间之内后端服务器必须传完所有的数据。proxy_buffer_size 8k;
代理请求缓存区,这个缓存区间会保存用户的头信息以供Nginx进行规则处理,一般只要设置能保存下头信息即可。proxy_buffers 4 32k;
同上 告诉Nginx保存单个页面使用的空间大小,假设网页大小平均在32k以下的话。proxy_busy_buffers_size 64k;
如果系统很忙的时候可以申请更大的proxy_buffers 官方推荐(proxy_buffers*2)。proxy_max_temp_file_size 1024m;
当 proxy_buffers 放不下后端服务器的响应内容时,会将一部分保存到硬盘的临时文件中,这个值用来设置最大临时文件大小,默认1024M,它与 proxy_cache 没有关系。大于这个值,将从upstream服务器传回。设置为0禁用。proxy_temp_file_write_size 64k;
proxy缓存临时文件的大小 proxy_temp_path(可以在编译的时候)指定写到哪那个目录。Nginx提供了health_check语句来提供负载(upstream)时的键康检查机制(注意:此语句需要设置在location上下文中)。
支持的参数有:
一个简单的设置如下,将使用默认值:
location / {
proxy_pass http://backend;
health_check;
}
对就应用,我们可以专门定义一个API用于健康检查:/api/health_check,并只返回HTTP状态码为200。并设置两次检查之间的间隔值为1秒。这样,health_check语句的配置如下:
health_check uri="/api/health_check" interval;
匹配match的方法
http { server { ... location / { proxy_pass http://backend; health_check match=welcome; } }
match welcome { status 200; header Content-Type = text/html; body ~ "Welcome to nginx!"; }
}
match 例子举例
status 200;
: status 等于 200status ! 500;
: status 不是 500status 200 204;
: status 是 200 或 204status ! 301 302;
: status 不是301或302。status 200-399;
: status 在 200 到 399之间。status ! 400-599;
: status 不在 400 到 599之间。status 301-303 307;
: status 是 301, 302, 303, 或 307。header Content-Type = text/html;
: “Content-Type” 得值是 text/html。header Content-Type != text/html;
: “Content-Type” 不是 text/html。header Connection ~ close;
: “Connection” 包含 close。header Connection !~ close;
: “Connection” 不包含 close。header Host;
: 请求头包含 “Host”。header ! X-Accel-Redirect;
: 请求头不包含 “X-Accel-Redirect”。body ~ "Welcome to nginx!";
: body 包含 “Welcome to nginx!”。body !~ "Welcome to nginx!";
: body 不包含 “Welcome to nginx!”。[root@lb01 conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #blog lb by oldboy at 201303 upstream blog_real_servers { server 10.0.0.9:80 weight=1 max_fails=1 fail_timeout=10s; server 10.0.0.10:80 weight=1 max_fails=2 fail_timeout=20s;
} server { listen 80; server_name blog.etiantian.org; location / { proxy_pass http://blog_real_servers; include proxy.conf; } }
}
[root@lb01 conf]# cat proxy.conf
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k; proxy_temp_file_write_size 64k;
## Only allow these request methods ##
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 444;
}
最终实现:
[root@lb01 conf]# cat nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; #blog lb by oldboy at 201303
upstream static_pools { server 10.0.0.9:80; } upstream dynamic_pools { server 10.0.0.10:80; } upstream upload_pools { server 10.0.0.9:80; } server { listen 80; server_name blog.biglittleant.cn; location / { proxy_pass http://static_pools; include proxy.conf; } location /static/ { proxy_pass http://static_pools; include proxy.conf; } location ~* \.(gif|jpg|jpeg)$ { proxy_pass http://static_pools; include proxy.conf; } location /dynamic/ { proxy_pass http://dynamic_pools; include proxy.conf; } location /upload/ { proxy_pass http://upload_pools; include proxy.conf; } }
}
server {
listen 80;
server_name blog.etiantian.org;
location / {
if ($http_user_agent ~* "android")
{
proxy_pass http://android_pools;
}
if ($http_user_agent ~* "iphone")
{
proxy_pass http://iphone_pools;
}
proxy_pass http://pc_pools;
include extra/proxy.conf;
}
access_log off;
}
nginx-proxy_pass官网