今天工作主要是起项目,打开网站曝出请求过多的问题,由于后台没有抛任何异常,所以首先想到的是nginx的问题,又重新把nginx的配置文件重新温习下
首先是nginx的模块分为handler、filter、upstream。其中upstream模块,式nginx跨越单机的限制。完成网络数据的接收、处理和转发。
数据转发功能,为nginx提供了跨越单机的横向处理能力,使nginx拜托只能为中端节点提供单一功能的限制,而使它具备了网络应用级别的拆分、封装和整合的战略功能。在云模式大行其道的今天,数据转发使nginx有能力构建一个网络应用的关键组件。
nginx的配置系统提供的层次化和松耦合使得系统的扩展也达到了比较高的程度。
Upstream模块接口:
本质上说属于handler,只是不产生自己的内容,而是通过请求后端服务器得到内容,所以才被成为upstream(上游)。请求并取得响应内容的整个过程已经被封到nginx内部。所以upstream模块只需要开发若干的回调函数,完成构造请求和解析响应等具体的工作。
create_request生成发送到后端服务器的请求缓冲(缓冲链),在初始化upstream
时使用。
reinit_request在某台后端服务器出错的情况,nginx会尝试另一台后端服务器。
nginx选定新的服务器以后,会先调用此函数,以重新初始化
upstream模块的工作状态,然后再次进行upstream连接。
process_header处理后端服务器返回的信息头部。所谓头部是与upstream server
通信的协议规定的,比如HTTP协议的header部分,或者memcached
协议的响应状态部分。
abort_request在客户端放弃请求时被调用。不需要在函数中实现关闭后端服务
器连接的功能,系统会自动完成关闭连接的步骤,所以一般此函
数不会进行任何具体工作。
finalize_request正常完成与后端服务器的请求后调用该函数,与abort_request
相同,一般也不会进行任何具体工作。
input_filter处理后端服务器返回的响应正文。nginx默认的input_filter会
将收到的内容封装成为缓冲区链ngx_chain。该链由upstream的
out_bufs指针域定位,所以开发人员可以在模块以外通过该指针
得到后端服务器返回的正文数据。memcached模块实现了自己的
input_filter,在后面会具体分析这个模块。
input_filter_init初始化input filter的上下文。nginx默认的input_filter_init
直接返回。
nginx的upstream目前支持4种方式的分配
1、轮询(默认)
每个请求按时间顺序注意分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如 upstream xxx{
seserver 127.0.0.1 weight=10;
server 127.0.0.2 weight=10;
}
3、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决Session的问题
例如
upstream xxx{
ip_hash;
server 192.168.0.18:88;
server 192.168.0.19:88;
}
3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream xxx{
server server1;
server server2;
fair;
}
4、url hash(第三方)
按照访问的url的hash结果来分配请求,使每个url定向到同一个后端服务i器,后端服务器为缓存时比较有效。
例如 在upstream中加入hash语句,server语句不能写入weight等其他参数,hash_method时用的hash算法。
upstream xxx{
server server1;
server server2;
hash $request_uri;
hash_method crc32;
}
tips
upstream xxx{
ip_hash;
server server1 down;
server server2 weight=2;
server server3;
server server4 backup;
}
其中 down表示当前的server暂不参与负载;
weight 值越大,负载的权重越大。
max_fails:允许请求失败的次数默认为1,超过返回错误。
fail_timeout:max_fails次失败后,暂停的时间
backup 其他所有的非backup机器down或者忙的时候,才请求到backup机器。所以压力最轻。
server{
listen 80;--监听接口
server_name xxxx.xxx.com;--配置访问域名
location ~*\.(map3|exe)${}对以“MP3或者exe结尾的地址进行负载均衡。
proxy_pass http://xxxx_server
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
将代理服务器收到的用户信息传到真实服务器上
}
location ~ /\.ht {deny all;}
#禁止访问.htxxx文件
}
注释:变量
Ngx_http_core_module模块支持内置变量,他们的名字和apache的内置变量是一致的。
首先是说明客户请求title中的行,例如$http_user_agent,$http_cookie等等。
此外还有其它的一些变量
$args此变量与请求行中的参数相等
$content_length等于请求行的“Content_Length”的值。
$content_type等同与请求头部的”Content_Type”的值
$document_root等同于当前请求的root指令指定的值
$document_uri与$uri一样
$host与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样
$limit_rate允许限制的连接速率
$request_method等同于request的method,通常是“GET”或“POST”
$remote_addr客户端ip
$remote_port客户端port
$remote_user等同于用户名,由ngx_http_auth_basic_module认证
$request_filename当前请求的文件的路径名,由root或alias和URI request组合而成
$request_body_file
$request_uri含有参数的完整的初始URI
$query_string与$args一样
$sheeme http模式(http,https)尽在要求是评估例如
Rewrite ^(.+)$ $sheme://example.com$; Redirect;
$server_protocol等同于request的协议,使用“HTTP/或“HTTP/
$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。
$server_name请求到达的服务器名
$server_port请求到达的服务器的端口号
$uri等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index
网友评论