花了一上午时间这次认认真真把张宴的那本nginx看了一遍,确实写的不错,很详细....

本来想总结一份文档,看到netseek的nginx指南已经整理的很详细,没必要再整了。理论就不废话了,nginx主要配置都在nginx.conf配置文件中.
1. nginx配置文档主要框架结构:
 
 
  
  1. ....... 定义运行nginx worker进程的用户/组,worker进程数,可以打开的最大文件描述符数.Log/pid path  
  2. events{            事件模块,控制nginx处理连接的方式     
  3.       ……………….  
  4. }  
  5. http {               nginx处理http的核心模块
  6.       ……………….            
  7.    upstrearm 负载组名{        负载均衡模块,可以有多个均衡组.  
  8.      ……………………. nginx作反向代理方式有:轮询,权重,ip_hash,url_hash,fair 
  9.    }  
  10.    Server{         定义虚拟主机模块,可以有多个  
  11.        ………………  
  12.    }  
  13.    Server{  
  14.     ………………….  
  15.      Location ~ /purge(/.*) {     location匹配目录/文件访问控制模块  
  16.           ………..  
  17.      }  
  18.      Location ~  .*\.(ico\mp3\avi\jpg\jpeg\swf\.......) {  
  19.          ………..  
  20.      }  
  21.      Location ~  .*\.(thtml|thtm)$  {  
  22.        ………..  
  23.      }  
  24.      Location  ./  {  
  25.        ………..  
  26.      }  
  27.      Location ~ .*\.(php|jsp|cgi)$  {  
  28.          ………..  
  29.      }  
  30.      Location  /unlimit/  {  
  31.         ………..  
  32.      }  
  33.     ………………….  
  34.    }  
  35.    Server{  
  36.         ……………….  
  37.      Location ~  .*\.(ico\mp3\avi\jpg\jpeg\swf\.......) {  
  38.        ………..  
  39.      }  
  40.      Location  ./  {  
  41.         ………..  
  42.       }  
  43.         …………………….  
  44.    }  
  45. }  

2. nginx反向代理proxy_pass与负载均衡模块upstream实现:

 

 
 
  
  1. user nginx nginx;  
  2. worker_processes 10;         工作进程数一般是cpu核数*2  
  3. error_log    /var/log/nginx/error.log  crit;  
  4. pid  /var/run/nginx.pid;  
  5. worker_rlimit_nofile 51200;    文件描述符,每个进程所能打开的最大文件数量/socket.  
  6.  
  7. events  
  8. {  
  9. use epoll;    使用的I/O网络模型  
  10. worker_connections  51200;  
  11. }  
  12.  
  13. http  
  14. {  
  15.     includ  mime.types;  
  16.     default_type  application/octet-stream;  
  17.     #charset uft-8;         如果有多个字符类型,最好在程序中定义  
  18.   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;
      
  19.  
  20.     server_names_hash_bucket_size   128;  
  21.     client_header_buffer_size   32k;  
  22.     large_client_header_buffer 4 32k;  
  23.  
  24.     sendfile on;  
  25.     tcp_nopush  on;  
  26.     tcp_nodelay on;      
  27.     keepalive_timeout 65;  
  28.  
  29.     gzip on;          开启gzip压缩  
  30.     gzip_min_length 1k;  
  31.     gzip_buffers  4 16k;  
  32.     gzip_http_version  1.1;  
  33.     gzip_comp_level 2;  
  34.       
  35.     limit_zone myzone  $binary_remote_addr  10m;  nginx限制并发各速率。 将myzone区域分配10M,1M可含约16000个会话状态。  
  36.  
  37.   client_max_body_size 50m;     允许客户端请求的最大单个字节数  
  38.     client_body_buffer_size 256k; 缓冲区代理缓冲客户端请求的最 大字节数  
  39.     proxy_connect_timeout 190;     后端server超时时间  
  40.     proxy_send_timeout 290;      后端server回传时间  
  41.     proxy_read_timeout 290;      后端server响应时间  
  42.     proxy_buffer_size 4k;  缓存区保护的用户头信息大小,供nginx进行规则处理.  
  43.     proxy_buffers 4 32k;      几个buffer最大用多大空间  
  44.     proxy_busy_buffers_size 64k;   忙时可申请更大的空间  
  45.     proxy_temp_file_write_size 64k;  proxy缓存临时文件的大小  
  46.     proxy_next_upstream  error timeout invalid_header http_500 http_503 http_404;  如遇500,503,404状态码转发到后端另一服务器。  
  47.   proxy_max_temp_file_size 128m;  
  48.  
  49.    upstream  mysvr {    定义负载均衡池,可以有多个,这里后端是squid-server组 
  50.      server   192.168.1.10;  
  51.      server   192.168.1.11;  
  52.      hash  $http_host$request_uri;  
  53.         根据url来hash,后端为缓存server的如squid,可提高命中率  
  54.  
  55.    upstream  websvr{  定义后端websrv的均衡池,这里后端是web-server组  
  56.      server  192.168.1.20;  
  57.      server  192.168.1.21;  
  58.      }       采用轮询  
  59.   注:nginx负载均衡方式:轮询,权重,ip_hash,url_hash,fair.具体解释下面有说明。
  60.  
  61. upstream  message_server{  定义后端message_server的均衡池  
  62.      server  192.168.1.30;  
  63.      server  192.168.1.31;  
  64.      }    
  65.     
  66.   server {          定义虚拟主机,第一个虚拟主机,反向代理mysrv负载组  
  67.       listen 80;
  68. server_name www.domain.com
  69.    location ~.*\.(ico|mp3|avi|wma|wmv|asf|mpg|mov|mid|js|css|jpg|ping|gif|swf|flv)$
  70.    {
  71.     proxy_set_header Host $host;
  72.     proxy_set_header X-Real-IP $remote_addr;
  73.     proxy_set_header X-Forwarded-For $proxy_add_x_forwaded_for;自定义变量获取原客户端真实IP。
  74.     
  75.      proxy_pass http://mysrv; 反向代理到mysrv负载池。
  76.     root html; 网页文件根目录,后端server 默认路径。
  77.    }
  78.    location ~.*\.(php|jsp|cgi)?${
  79.      动态可直接proxy_pass到后端web池.http://websrv;
  80.    }
  81.  
  82.    location / 匹配以/开头的url
  83.    {
  84.     proxy_next_upstream http_502 http_504 error timeout invalid_header;
  85.    如果后端服务器返回502,504,执行超时错误,自动请求转发到后端另一台server,故障切换。
  86.     proxy_pass http://mysrv;
  87.     proxy_set_header Host $host;
  88.     proxy_set_header X-Forwarded-For $remote_addr;
  89.   }
  90.   limit_conn myzone 100;  限制单个IP的100个并发访问数.
  91.    access_log /var/log/nginx/access.log main;
  92.    }
  93.  
  94. server{ 第二个虚拟主机,反向代理websrv负载组
  95. listen 80;
  96. server_name www1.domain.com;
  97. 访问http://www1.domain.com/message/...地址,反向代理到message_server池
  98.    
  99. location /message/
  100. {
  101. proxy_pass http://message_server;
  102. proxy_set_header Host $host;
  103. }
  104.  
  105. 访问除了/message/之外的http://www1.domain.com/.....地址,反向代理到websrv
  106. location /
  107. {
  108. proxy_pass http://websrv;
  109. proxy_set_header Host $host;
  110. proxy_set_header X-Forwarded-For $remote_addr;
  111. }
  112. access_log /var/log/nginx/message.access;
  113. }  
  114.     
  115.        
  116. }    
  117.      

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进行匹配,可以进行重定向或新的代理,负载均衡。
 

3. nginx缓存模块proxy_cache实例: 

 
  
  1. http{  
  2.     ....  
  3.    proxy_temp_path  /data/proxy_temp_path;  
  4.    proxy_cache_path /data/proxy_cache_path  levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;  
  5.   proxy_temp_path,proxy_cache_path路径须在同一分区下。  
  6.  设置web缓存区名cache_one,内存缓存空间大小200M,自动清除超过1天没有访问的缓存数据,硬盘缓存空间大小30G。  
  7.  .....  
  8.   upstream my_srv{  
  9.   server  ....  
  10.   server  ....   
  11.   }  
  12.   server{  
  13.   ........  
  14.   location /  
  15.   {  
  16.     proxy_set_header Host $host;  
  17.     proxy_set_header X-Forwarded-For $remote_addr;  
  18.     proxy_pass http:mysrv;  
  19.  
  20.    location ~.*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$  
  21.    {  
  22.     proxy_cache cache_one;    使用缓存区  
  23.       
  24.      proxy_cache_valid 200 304 12h;  
  25.     proxy_cache_valid 301 302 1m;  
  26.     proxy_cache_valid any 1m;    
  27.     对不同状态码缓存时间不一样。  
  28.       
  29.     proxy_cache_key $host$uri$is_args$args;  
  30.    nginx根据key值md5哈希存储缓存,一般根据域名,URL,参数组成key.  
  31.  
  32.     proxy_set_header Host $host;  
  33.     proxy_set_header X-Forwarded-For $remote_addr;  
  34.     proxy_pass http:mysrv;  
  35.     反向代理,访问后端.  
  36.  
  37.    location ~/purge(/.*)   清除缓存http://.../purge/..  
  38.    {  
  39.    allow  127.0.0.1;     允许执行清除的IP段  
  40.    allow  192.168.1.0/16;  
  41.    deny  all;  
  42.    proxy_cache_purge  cache-one  $host$1$is_args$args;    
  43.    }  
  44.   access_log /var/log/nginx/purge.access main;    
  45.    
  46.   }  

4. nginx作为web服务器,nginx+php搭建胜过apche+php高性能的文章已经很多,也就不重复了。参考下基本都可以实现。

nginx很多模块可直接参照 nginx官网:http://nginx.org/en/docs/

分享附件:

如果想深入了解nginx并运用熟练,知其然知其所以然,可以参考下张宴的实战nginx书和netseek整理的nginx指南,都写得很好....