Nginx作为当今数一数二的负载均衡服务器,应用十分广泛,今天记录一下,大名鼎鼎的Nginx的配置信息

  1. 一个简单的负载均衡的示例,把www.domain.com均衡到本机不同的端口,也可以改为均衡到不同的地址上。
http {  
  upstream myproject {  
    server 127.0.0.1:8000 weight=3;  
    server 127.0.0.1:8001;  
    server 127.0.0.1:8002;  
    server 127.0.0.1:8003;  
  }

  server {  
    listen 80;  
    server_name www.domain.com;  
    location / {  
      proxy_pass http://myproject;  
    }  
  }   
}

weight就是权重,数值越大,分配到这个服务器的概率就越大,以本例来说,分配8000上的概率为二分之一,其他的三个均为为六分之一,另外需要注意的是:proxy_pass和upstream一定要一样

注:这么配置仅仅是解决了负载均衡的问题,但是没有解决session共享的问题,为了解决session共享我们有两个方案:

  1. 配置粘连,也就是说,只要某一个请求被分配到该服务器,那么今后的该客端的所有请求全都分配到该服务器上;

  2. 在代码中解决session共享问题
    目前针对这两种方案,我都不是很熟悉,我将来会写一篇文章来解决这个问题

  3. 静态资源处理

location ~ .(jpg|png|jpeg|bmp|gif|swf|css|js)$ {  
    expires 30d;  
    root /nginx-1.8.0;#root  
    break;  
}

就是说上面的这些静态资源文件都是相对于:/nginx-1.8.0的,所以如果我们代码中写的路径是img/bridgeli.png,那么我们就需要在nginx-1.8.0建一个img目录,把我们bridgeli.png放在里面。

  1. 完整示例
#!nginx  
# 使用的用户和组  
user www www;  
# 指定工作衍生进程数  
worker_processes 2;  
# 指定 pid 存放的路径  
pid /var/run/nginx.pid;

# [ debug | info | notice | warn | error | crit ]  
# 可以在下方直接使用 [ debug | info | notice | warn | error | crit ] 参数  
error_log /var/log/nginx.error_log info;

events {  
  # 允许的连接数  
  connections 2000;  
  # use [ kqueue | rtsig | epoll | /dev/poll | select | poll ] ;  
  # 具体内容查看 http://wiki.codemongers.com/事件模型  
  use kqueue;  
}

http {  
  include conf/mime.types;  
  default_type application/octet-stream;

  log_format main '$remote_addr - $remote_user [$time_local] '  
  "$request" $status $bytes_sent '  
  "$http_referer" "$http_user_agent" '  
  "$gzip_ratio"';

  log_format download '$remote_addr - $remote_user [$time_local] '  
  "$request" $status $bytes_sent '  
  "$http_referer" "$http_user_agent" '  
  "$http_range" "$sent_http_content_range"';  

  client_header_timeout 3m;  
  client_body_timeout 3m;  
  send_timeout 3m;

  client_header_buffer_size 1k;  
  large_client_header_buffers 4 4k; 

  gzip on;  
  gzip_min_length 1100;  
  gzip_buffers 4 8k;  
  gzip_types text/plain;  

  output_buffers 1 32k;  
  postpone_output 1460;

  sendfile on;  
  tcp_nopush on;  
  tcp_nodelay on;  
  send_lowat 12000;

  keepalive_timeout 75 20;

  #lingering_time 30;  
  #lingering_timeout 10;  
  #reset_timedout_connection on;

  server {  
    listen one.example.com;  
    server_name one.example.com www.one.example.com;

    access_log /var/log/nginx.access_log main;

    location / {  
      proxy_pass http://127.0.0.1/;   
      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;

      client_max_body_size 10m;  
      client_body_buffer_size 128k;

      client_body_temp_path /var/nginx/client_body_temp;

      proxy_connect_timeout 90;  
      proxy_send_timeout 90;  
      proxy_read_timeout 90;  
      proxy_send_lowat 12000;

      proxy_buffer_size 4k;  
      proxy_buffers 4 32k;  
      proxy_busy_buffers_size 64k;  
      proxy_temp_file_write_size 64k;

      proxy_temp_path /var/nginx/proxy_temp;

      charset UTF-8;  
    }

    error_page 404 /404.html;

    location /404.html {  
      root /spool/www;

      charset on;  
      source_charset UTF-8;  
    }

    location /old_stuff/ {  
      rewrite ^/old_stuff/(.*)$ /new_stuff/$1 permanent;  
    }

    location /download/ {

      valid_referers none blocked server_names *.example.com;

      if ($invalid_referer) {  
        #rewrite ^/ http://www.example.com/;  
        return 403;  
      }

      #rewrite_log on;

      rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
      rewrite ^/(download/.*)/mp3/(.*)..*$
      /$1/mp3/$2.mp3 break;

      root /spool/www;  
      autoindex on;  
      access_log /var/log/nginx-download.access_log download;  
    }

    location ~* ^.+.(jpg|jpeg|gif)$ {  
      root /spool/www;  
      access_log off;  
      expires 30d;  
    }   
}

这是Nginx官方网站的一个例子,说实话里面的很多配置我也不是很清楚,但很多并不是非常难以理解

  1. 如果我们有多个配置,全放到nginx.conf里面,那么会显得非常的乱,所以Nginx支持我们可以在其他地方创建一个我们自己的conf文件,然后在nginx.conf中引入就行,
#access_log logs/access.log main;

include /home/devtool/nginx/conf/vhosts/*.conf;

sendfile on;  
#tcp_nopush on;

#keepalive_timeout 0;  
keepalive_timeout 65;

#gzip on;

*.conf表示引入该目录下的所有配置文件,那么我们的其中一个配置文件就可以这么写

server {  
  listen 80;  
  server_name weixin.yuyime.com;

  access_log /opt/log/weixin.log main;  
  charset UTF-8;  
  location / {  
    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_pass http://120.27.37.68:80;  
    ## proxy_redirect off;  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
    proxy_set_header Host mooc.chaoxing.com;  
    proxy_set_header Connection Close;  
    client_max_body_size 2g;  
    client_body_buffer_size 128k;  
    proxy_connect_timeout 120;  
    proxy_read_timeout 90;  
    proxy_send_timeout 60;  
    proxy_buffers 8 64k;  
    fastcgi_buffers 8 128k;  
    proxy_busy_buffers_size 64k;  
    proxy_temp_file_write_size 128k;  
}
  1. Nginx常用命令
nginx.exe 启动服务,直接运行,缺点控制台窗口关闭,服务关闭。  
start nginx.exe 守护进程的方式启动  
nginx -s stop 快速关闭Nginx,可能不保存相关信息,并迅速终止web服务  
Nginx -s quit 平稳关闭Nginx,保存相关信息,有安排的结束web服务  
nginx -s reload 因改变了Nginx相关配置,需要重新加载配置而重载

以前感觉负载均衡Nginx好复杂的一个东西,现在发现其实也并不难,相信大家根据老夫这篇小文章,就可以配出自己的Nginx的

2015.05.28 补记:

  1. 负载均衡的示例中并没有解决session共享问题,其实配粘性session特别简单,只需加一个ip_hash即可,即:
http {  
  upstream myproject {  
    ip_hash;  
    server 127.0.0.1:8000 weight=3;  
    server 127.0.0.1:8001;  
    server 127.0.0.1:8002;  
    server 127.0.0.1:8003;  
}

server {  
  listen 80;  
  server_name www.domain.com;  
  location / {  
    proxy_pass http://myproject;  
  }
}

粘性session存在的问题:因为一个人的请求固定分配到某一确定的服务器上,所以当该服务器挂掉之后,那么该用户的session也就没了,后果大家都懂得,不过这种方法用来解决服务器集群session共享是最简单的,为彻底解决这个问题,可以使用:memcached-session-manager

参考资料:http://wiki.nginx.org/NginxChs