xxqyzsc 发表于 2016-12-23 11:08:21

nginx 负载均衡,缓存

nginx 负载均衡,缓存
本来想总结一份文档,看到netseek的nginx指南已经整理的很详细,没必要再整了。理论就不废话了,nginx主要配置都在nginx.conf配置文件中. 希望能给正学习ing的童鞋一个参考... 有误的还请指出..

一、nginx框架结构说明


[*]   .......  定义运行nginx worker进程的用户/组,worker进程数,可以打开的最大文件描述符数.Log/pid path
[*]events{                      事件模块,控制nginx处理连接的方式
[*]      ……………….
[*]}
[*]http {                 nginx处理http的核心模块
[*]      ……………….            
[*]   upstrearm 负载组名{        负载均衡模块,可以有多个均衡组.
[*]     …………………….                   nginx作反向代理方式有:轮询,权重,ip_hash,url_hash,fair
[*]   }
[*]   Server{                  定义虚拟主机模块,可以有多个
[*]       ………………
[*]   }
[*]   Server{
[*]    ………………….
[*]     Location ~ /purge(/.*) {     location匹配访问目录/文件的控制模块
[*]          ………..
[*]     }
[*]     Location ~  .*\.(ico\mp3\avi\jpg\jpeg\swf\.......) {
[*]         ………..
[*]     }
[*]     Location ~  .*\.(thtml|thtm)$  {
[*]       ………..
[*]     }
[*]     Location  ./  {
[*]       ………..
[*]     }
[*]     Location ~ .*\.(php|jsp|cgi)$  {
[*]         ………..
[*]     }
[*]     Location  /unlimit/  {
[*]        ………..
[*]     }
[*]    ………………….
[*]   }
[*]   Server{
[*]        ……………….
[*]     Location ~  .*\.(ico\mp3\avi\jpg\jpeg\swf\.......) {
[*]       ………..
[*]     }
[*]     Location  ./  {
[*]        ………..
[*]      }
[*]        …………………….
[*]   }
[*]}
二、nginx作反向代理,利用upstream负载均衡模块说明参考:

[*] 
[*]user nginx nginx;
[*] 
[*]worker_processes 10;         工作进程数一般是cpu核数*2
[*]error_log    /var/log/nginx/error.log  crit;
[*]pid  /var/run/nginx.pid;
[*]worker_rlimit_nofile 51200;    文件描述符,每个进程所能打开的最大文件数量/socket.
[*] 
[*]events  
[*]{
[*]use epoll;    使用的I/O网络模型
[*]worker_connections  51200;
[*]}
[*] 
[*]http
[*]{
[*]    includ  mime.types;
[*]    default_type  application/octet-stream;
[*]    #charset uft-8;         如果有多个字符类型,最好在程序中定义
[*]        log_format main  '$remote_addr - $remote_user [$time_local] $request '
                      '"$status" $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"' ' up_ip: $upstream_addr '
                      'up_type $upstream_http_content_type' ' gzip "$gzip_ratio"';
   注:添加header头信息x_forwarded_for获取客户端真实IP。 $remote_addr.....nginx内部变量
    access_log /var/log/nginx/access.log  main;
[*] 
[*]    server_names_hash_bucket_size   128;
[*]    client_header_buffer_size   32k;
[*]    large_client_header_buffer 4 32k;
[*] 
[*]    sendfile on;
[*]    tcp_nopush  on;
[*]    tcp_nodelay on;
[*]    keepalive_timeout 65;
[*] 
[*]    gzip on;          开启gzip压缩
[*]    gzip_min_length 1k;
[*]    gzip_buffers  4 16k;
[*]    gzip_http_version  1.1;
[*]    gzip_comp_level 2;
[*] 
[*]    limit_zone myzone  $binary_remote_addr  10m;  nginx限制并发各速率。 将myzone区域分配10M,1M可含约16000个会话状态。
[*] 
[*]  client_max_body_size 50m;     允许客户端请求的最大单个字节数
[*]    client_body_buffer_size 256k; 缓冲区代理缓冲客户端请求的最 大字节数
[*]    proxy_connect_timeout 190;     后端server超时时间
[*]    proxy_send_timeout 290;      后端server回传时间
[*]    proxy_read_timeout 290;      后端server响应时间
[*]    proxy_buffer_size 4k;  缓存区保护的用户头信息大小,供nginx进行规则处理.
[*]    proxy_buffers 4 32k;      几个buffer最大用多大空间
[*]    proxy_busy_buffers_size 64k;   忙时可申请更大的空间
[*]    proxy_temp_file_write_size 64k;  proxy缓存临时文件的大小
[*]    proxy_next_upstream  error timeout invalid_header http_500 http_503 http_404;  如遇500,503,404状态码转发到后端另一服务器。
[*]  proxy_max_temp_file_size 128m;
[*] 
[*]   upstream  mysvr {    定义负载均衡池,可以有多个,这里后端是squid-server组
[*]     server   192.168.1.10;
[*]     server   192.168.1.11;
[*]     hash  $http_host$request_uri;
[*]     }    根据url来hash,后端为缓存server的如squid,可提高命中率
[*] 
[*]   upstream  websvr{  定义后端websrv的均衡池,这里后端是web-server组
[*]     server  192.168.1.20;
[*]     server  192.168.1.21;
[*]    }       采用轮询
[*]  注:nginx负载均衡方式:轮询,权重,ip_hash,url_hash,fair.具体解释下面有说明。
[*] 
[*]     upstream  message_server{  定义后端message_server的均衡池
[*]     server  192.168.1.30;
[*]     server  192.168.1.31;
[*]    }
[*]  
[*]  server {          定义虚拟主机,第一个虚拟主机,反向代理mysrv负载组
[*]      listen 80;
[*]      server_name www.domain.com
[*]   location ~.*\.(ico|mp3|avi|wma|wmv|asf|mpg|mov|mid|js|css|jpg|ping|gif|swf|flv)$
[*]   {
[*]    proxy_set_header Host $host;
[*]    proxy_set_header  X-Real-IP  $remote_addr;
[*]    proxy_set_header  X-Forwarded-For  $proxy_add_x_forwaded_for;自定义变量获取原客户端真实IP。
[*]    
[*]     proxy_pass http://mysrv; 反向代理到mysrv负载池。
[*]    root html;     网页文件根目录,后端server 默认路径。
[*]   }
[*]   location ~.*\.(php|jsp|cgi)?${
[*]     动态可直接proxy_pass到后端web池.http://websrv;
[*]   }
[*] 
[*]   location /                      匹配以/开头的url
[*]   {
[*]    proxy_next_upstream http_502 http_504 error timeout invalid_header;
[*]   如果后端服务器返回502,504,执行超时错误,自动请求转发到后端另一台server,故障切换。
[*]    proxy_pass http://mysrv;
[*]    proxy_set_header Host $host;
[*]    proxy_set_header X-Forwarded-For $remote_addr;
[*]     }
[*]     limit_conn  myzone 100;    限制单个IP的100个并发访问数.
[*]   access_log /var/log/nginx/access.log  main;
[*]   }
[*] 
[*]    server{                第二个虚拟主机,反向代理websrv负载组
[*]listen 80;
[*]server_name www1.domain.com;
[*]      访问http://www1.domain.com/message/...地址,反向代理到message_server池
[*]   
[*]
location /message/
[*]      {
[*]       proxy_pass http://message_server;
[*]       proxy_set_header Host $host;
[*]      }
[*] 
[*]      访问除了/message/之外的http://www1.domain.com/.....地址,反向代理到websrv
[*]
location /
[*]      {
[*]         proxy_pass http://websrv;
[*]         proxy_set_header  Host $host;
[*]         proxy_set_header  X-Forwarded-For $remote_addr;
[*]      }
[*]      access_log /var/log/nginx/message.access;
[*]    }
[*] 
[*] 
[*]}  
Nginx作为反向代理,利用upstream模块支持多组负载均衡,方式:
a)   轮询:每个请求按时间顺序依次分配到不同后端server.如何后端server down掉,能自动排除。
b)   权重: 根据weight值越大的后端server优先。指定轮询机率。
c)   Ip_hash:如客户端IP第一次访问后端A-server,输入用户名密码后第二次可能分发到后端B-server,ip_hash利用hash_key值按访问ip的hash结果分配即进行哈希算法使其同一IP第二次会话保持访问至同一后端server. 此种方式能解决session问题,每个访客固定访问一个后端server.
d)   利用hash算法此种方式无法进行负载均衡。
e)   url_hash:按访问url的hash结果分配,使每个url定向到同一后端server.如果后端是缓存server比较长有效,,如squid,可以增加squid命中率。
f)   Fair:按后端服务器响应时间来分配请,响应时间短的优先分配。

Location 对url进行匹配,可以进行重定向或新的代理,负载均衡。


三、nginx缓存模块proxy_cache说明参考(这里省去全局配置部分,只列http标签部分):

[*]http{
[*]    ....
[*]   proxy_temp_path  /data/proxy_temp_path;
[*]   proxy_cache_path /data/proxy_cache_path  levels=1:2 keys_zone=cache_one:200m inactive=1d
max_size=30g;
[*]  proxy_temp_path,proxy_cache_path路径须在同一分区下。
[*] 设置web缓存区名cache_one,内存缓存空间大小200M,自动清除超过1天没有访问的缓存数据,硬盘缓存空间大小30G。
[*] .....
[*]  upstream my_srv{
[*]  server  ....
[*]  server  ....
[*]  }
[*]  server{
[*]  ........
[*]  location /
[*]  {
[*]    proxy_set_header Host $host;
[*]    proxy_set_header X-Forwarded-For $remote_addr;
[*]    proxy_pass http:mysrv;
[*] 
[*]   location ~.*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$
[*]   {
[*]    proxy_cache cache_one;    使用缓存区
[*] 
[*]     proxy_cache_valid 200 304 12h;
[*]    proxy_cache_valid 301 302 1m;
[*]    proxy_cache_valid any 1m;
[*]    对不同状态码缓存时间不一样。
[*] 
[*]    proxy_cache_key $host$uri$is_args$args;
[*]   nginx根据key值md5哈希存储缓存,一般根据域名,URL,参数组成key.
[*] 
[*]    proxy_set_header Host $host;
[*]    proxy_set_header X-Forwarded-For $remote_addr;
[*]    proxy_pass http:mysrv;
[*]    反向代理,访问后端.
[*] 
[*]   location ~/purge(/.*)   清除缓存http://.../purge/..
[*]   {
[*]   allow  127.0.0.1;     允许执行清除的IP段
[*]   allow  192.168.1.0/16;
[*]   deny  all;
[*]   proxy_cache_purge  cache-one  $host$1$is_args$args;
[*]   }
[*]  access_log /var/log/nginx/purge.access main;
[*] 
[*]  }
[*]}
四、nginx作web服务器,相关网上nginx+php(利用fastcgi技术)实现高性能WEB服务器的博文已经很多,不作总结了....



配置只是现学现卖,知其然,知其所以然,了其原理,有个清晰的思路才是最重要的...
如上只是个人博客总结文, 若有误,欢迎指正...

nginx相关模块可参考nginx官方或nginx中文手册,张宴的那本nginx书写的很不错,很详细可以参考....
页: [1]
查看完整版本: nginx 负载均衡,缓存