nginx简介
nginx是一款高性能的http服务器,目前国内包括BAT在内的众多互联网企业均采用其作为反向代理服务器,一个很重要的用途就是用来实现负载均衡。其具有优异的性能和丰富的配置功能。nginx一般由一个master进程和多个worker进程组成,其中master进程主要用来管理worker进程,包含:接收来自外界的信号,向各worker进程发送信号,监控worker进程的运行状态,当worker进程退出后(异常情况下),会自动重新启动新的worker进程。worker进程主要负责处理基础的网络事件。各个worker进程之间是相互独立的,且一个网络请求的处理仅会由一个worker进程独立处理。为了避免多个worker进程竞争cpu资源,一般worker进程的数目与cpu的核数相等。
nginx配置管理
nginx支持丰富的配置选项,包括http,server等,还是支持tcp代理。给出一个配置例子:
//定义nginx运行的用户
user flying_mgr;
//nginx进程数
worker_processes 4;
//更改wroker进程的最大打开文件数限制,默认为操作系统的限制
worker_rlimit_nofile 262140;
//开启利用多核特性,1000表示启用第1个核
worker_cpu_affinity 1000 0100 0010 0001;
error_log logs/error.log;
pid run/nginx.pid;
events
{
//设置IO事件模型
use epoll;
//worker进程能并发处理(发起)的最大连接数
worker_connections 65535;
}
http
{
include mime.types;
default_type application/octet-stream;
//aio与directio配合使用,超过512k启用directio
aio on;
directio 512;
//sendfile系统调用,可以在磁盘和TCP socket之间互相拷贝数据,立即将数据从磁盘读到os缓存
sendfile on;
output_buffers 1 128k;
//是否在error_log中记录不存在的错误
log_not_found off;
keepalive_timeout 65;
//关闭在错误页面的nginx版本数字,提高安全性
server_tokens off;
//设置压缩参数
gzip on;
gzip_comp_level 6;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/javascript application/json;
//日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$request_time" "$upstream_response_time"';
//访问日志
access_log logs/${server_name}.access.log main;
//是否传递4xx和5xx错误信息到客户端
fastcgi_intercept_errors on;
error_page 500 502 503 504 /50x.html;
//限制访问命令
limit_req_zone $binary_remote_addr zone=allips:10m rate=20r/s;
limit_conn_zone $binary_remote_addr zone=perip:10m;
server {
listen 80;
server_name example.net;
access_log /var/log/nginx/example.net.log;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 443;
server_name example.net.net;
access_log /var/log/nginx/example.net.log;
error_log /var/log/nginx/example.net-error.log;
ssl_certificate /etc/nginx/example_net.crt;
ssl_certificate_key /etc/nginx/example_net.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 5m;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";
//添加返回请求头
add_header Strict-Transport-Security "max-age=31536000";
add_header X-Xss-Protection 1;
add_header X-Frame-Options DENY;
location / {
proxy_pass http://127.0.0.1:3003;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
location /api {
proxy_pass https://127.0.0.1:8091;
proxy_connect_timeout 120;
proxy_send_timeout 120;
proxy_read_timeout 120;
send_timeout 120;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
location /api/test {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
client_max_body_size 50M;
}
}
}
//tcp代理
stream{
upstream proxy_20000{
//出现特点的状态,404,502,503,504,500,则认为后端服务区失效,失效次数超过3次,则设置30s的不可使用时间
server 127.0.0.1:20000 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.2:20000 weight=1 max_fails=3 fail_timeout=30s;
}
server{
listen 20000;
allow all;
proxy_pass proxy_20000;
proxy_connect_timeout 24h;
proxy_timeout 24h;
}
}
nginx负载均衡
nginx的负载均衡方式一共有四种: rr、ip_hash、fair、url_hash,前两种为自带,后两种为第三方插件,默认采用rr(轮询模式)
RR负载均衡模式
每个请求按时间顺序逐一分配到不同的后端服务器,如果超过了最大失败次数后(max_fails,默认1),在失效时间内(fail_timeout,默认10秒),该节点失效权重变为0,超过失效时间后,则恢复正常,或者全部节点都为down后,那么将所有节点都恢复为有效继续探测,一般来说rr可以根据权重来进行均匀分配。
IP_hash负载均衡模式
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题,但是ip_hash会造成负载不均,有的服务请求接受多,有的服务请求接受少,所以不建议采用ip_hash模式,session共享问题可用后端服务的session共享代替nginx的ip_hash。
fair负载均衡模式
按后端服务器的响应时间来分配请求,响应时间短的优先分配.
url_hash负载均衡模式
对每个请求按url的hash结果分配,使每个URL定向到一个同 一个后端服务器,但是也会造成分配不均的问题,这种模式后端服务器为缓存时比较好。
参考文献
- [Nginx配置文件nginx.conf中文详解] (http://www.ha97.com/5194.html)
- [Nginx 做负载均衡的几种轮询策略] (http://blog.sina.com.cn/s/blog_9c3ba23d01010rof.html)