首页 > 代码库 > nginx负载均衡篇一、nginx配置

nginx负载均衡篇一、nginx配置

        如果不知道在Linux下如何安装nginx请参考前一篇文章。

        nginx负载均衡的配置较apache要简单许多,这里用nginx做负载均衡将不再描述tomcat集群的配置,如果对tomcat集群配置有不懂的地方,请参考Apache反向代理结合Tomcat集群来实现负载均衡(三)、tomcat集群文章进行配置。下边进入正题,开始配置nginx负载均衡。

        先来看下nginx的完全配置:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
    
    upstream tom_server {
           server 172.18.117.113:8090 weight=2;
           server 172.18.117.116:8080 weight=3;
    }

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://tom_server;
            #root   html;
            #index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

扶好了,不要被这个配置文件给吓到了,其实我们用配的文件很少,下边说下我们主要加入的负载均衡配置。

首先需要加入需要代理的服务器地址

upstream tom_server {
           server 172.18.117.113:8090 weight=2;
           server 172.18.117.116:8080 weight=3;
    }

名字可以随意起,只要前后保持一致即可,这里需要注意的是upstream节点一定要加在http节点中,否则启动会报错。

其次加入代理配置

server {
        listen       80;#要监听的端口
        server_name  localhost;#要监听的主机

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass http://tom_server;#代理的upstream名
        }
}
到这里重启下nginx就已经生效了,其实nginx的反向代理就这么简单。



下边我们说下一些高级配置,首先是被代理的服务器的

upstream设备上的状态设置
    down 表示单前的server暂时不参与负载
    weight  默认为1.weight越大,负载的权重就越大。
    max_fails :允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
    fail_timeout:max_fails 次失败后,暂停的时间。
    backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。

另外大家到这里会考虑一个问题,session如何共享,nginx有以下两种方法(先不考虑tomcat集群中的session复制):

     (1)ip_hash

     (2 ) nginx-upstream-jvm-route (Nginx +tomcat )

     nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的sessionip_hash是在upstream配置中定义的:

upstream backend { 
    ip_hash; 
    server 127.0.0.1:8001; 
    server 127.0.0.1:8002;
 }

ip_hash

  ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,

因此ip_hash是有缺陷的,不能在一些情况下使用:

1/ nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据iphash。譬如使用的是squid为最前端,那么nginxip时只能得到squid的服务器ip地址

   2/ nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求不能定位到同一台session应用服务器上

nginx-upstream-jvm-route  基于nginx+tomcat的解决方案

  patch -p0 <../nginx-upstream-jvm-route-read-only/jvm_route.patch

   使用./configurenginx进行makefile描述时需要加上

   --add-module=<path:nginx-upstream-jvm-route path>

   tomcat的配置文件修改Server.xml

   Tomcat01:

<Enginename="Catalina" defaultHost="localhost"jvmRoute="a">

   Tomcat02:

<Enginename="Catalina" defaultHost="localhost"jvmRoute="b">

nginx的配置文件修改

upstreambackend {

    server 192.168.2.88:8080 srun_id=a;

    server 192.168.2.89:8080 srun_id=b;

    jvm_route $cookie_JSESSIONID|sessionidreverse;

}

location/ aa/

{

       proxy_pass http://backend;

       proxy_redirect    off;

       proxy_set_header X-Forwarded-For;                                               $proxy_add_x_forwarded_for;

       proxy_set_header X-Real-IP $remote_addr;

       proxy_set_header Host $http_host;

 }


最后再补充下nginx的一些额外设置:

server  
  {  
    listen  80;  
    server_name  192.168.1.104;  
  
    location / {  
   <strong>     proxy_pass http://mysvr;</strong>  
  
    }  
  
       #以下是一些反向代理的配置可删除.  
   
          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 4 32k;               #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置  
          proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)  
          proxy_temp_file_write_size 64k;  #设定缓存文件夹大小,大于这个值,将从upstream服务器传  
   
  
  }