分布式系统架构:技术栈详解与快速进阶
上QQ阅读APP看书,第一时间看更新

4.3 Nginx配置

nginx.conf配置文件如代码清单4-5所示。

代码清单4-5 nginx.conf配置文件

# 启动进程
worker_processes  2;
# 全局错误日志及PID文件
error_log  /var/log/nginx/error.log;
pid        /var/nginx.pid;
# 工作模式及连接数上限
events {
use epoll;                #epoll是多路复用I/O中的一种方式, 可以大大提高nginx的性能
worker_connections 1024;  #单个后台worker process进程的最大并发连接数
# multi_accept on;
}

#设定HTTP服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型, 类型由mime.type文件定义
include       /etc/nginx/mime.types;
default_type  application/octet-stream;
#设定日志格式
access_log    /var/log/nginx/access.log;
#sendfile 指令指定Nginx是否调用sendfile函数(zero copy方式)来输出文件,对于普通应用,
#必须设为on, 如果用来进行下载等应用磁盘I/O重负载应用,可设置为off,以平衡磁盘与网络I/O#处理速度,降低系统的uptime
sendfile        on;
#将tcp_nopush和tcp_nodelay两个指令设置为on以防止网络阻塞
tcp_nopush      on;
tcp_nodelay     on;
#连接超时时间
keepalive_timeout  65;
#开启Gzip压缩
gzip  on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
#设定请求缓冲
client_header_buffer_size    1k;
large_client_header_buffers  4k;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

#设定负载均衡的服务器列表
upstream zachary.sh.cn {
#ip_hash
# weigth参数表示权值,权值越高被分配到的概率越大
# 默认weight=1,不推荐使用ip_hash,客户端IP会变化,如动态IP、翻墙、代理
server 192.168.10.1:3128 weight=5;
server 192.168.10.2:80  weight=1;
server 192.168.10.3:80  weight=6;
}


server {
#侦听80端口
listen       80;
#默认请求
location / {
    root   /root;                 #定义服务器的默认网站根目录位置
    index index.html index.htm;   #定义首页索引文件的名称
}
# 定义错误提示页面
error_page   500 502 503 504 /50x.html;
    location = /50x.html {
    root   /root;
}

#静态文件,Nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
    root /zachary/shop;
    #这里设置为30天过期,若静态文件不经常更新,过期时间可以设大一点,若文件频繁更新,则可    #以设置得小一点
    expires 30d;
}

}

server {

listen       8081;
server_name  zachary.sh.cn;

#对http:// zachary.sh.cn:8081/shop 进行负载均衡请求
location ~* ^/shop {

    #定义服务器的默认网站根目录位置
    root   /root;

    #定义首页索引文件的名称
    index index.html index.htm;

    #zachary 定义的服务器列表
    proxy_pass  http:// zachary.sh.cn;
#失败的请求被发送到下一台服务器重试;只有在没有向客户端发送任何数据以前,将请求转给下一台后#端服务器才是可行的
    proxy_next_upstream http_502 http_504 http_404 error timeout invalid_header;
    #以下是一些反向代理的配置,可删除
    proxy_redirect off;

    #Web服务器可以通过X-Forwarded-For获取用户真实IP
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size 10m;       #允许客户端请求的最大单文件字节数
    client_body_buffer_size 128k;   #缓冲区代理缓冲用户端请求的最大字节数
    proxy_connect_timeout 90;       # Nginx跟后端服务器连接超时时间(代理连接超时)
    proxy_send_timeout 90;          #后端服务器数据回传时间(代理发送超时)
    proxy_read_timeout 90;          #连接成功后,后端服务器响应时间(代理接收超时)
    proxy_buffer_size 4k;           #设置代理服务器(Nginx)保存用户头信息的缓冲区大小
    proxy_buffers 32k;              #  proxy_buffers缓冲区,这里设置为32KB以下
    proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
    proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服
    }                               #务器传
}
}

代码清单4-5所示的处理过程如下:

1)Worker接收到请求后会监控80/8081端口,在请求反向代理到后台服务器(如tomcat)的过程中,可自定义多种负载均衡算法,默认为轮询方式。

2)静态资源不代理到后台服务器,直接可以到专有静态资源服务器、分布式共享存储获取,如NFS/MFS。

3)Nginx单点的HA高可用:proxy_next_upstream可配置,如果指向服务器1,此时服务器1处于异常,它会重新把请求指向下一台服务器,依次类推。

注意,关于worker_processes进程数设置,通常是CPU个数的2倍,对于http://zachary.sh.cn:8081/shop进行负载均衡请求,其中会根据服务器的权重分配请求次数,以求达到负载均衡效果。在其中一台服务器在没有向客户端发送任何数据之前就处理失败的情况下,系统会重新把当前请求分配给下一台服务器消费,以保证请求不丢失。