一)简单的配置

首先是配置十分的简单,而且功能非常强大。真是相见恨晚。先来看看配置文件怎么写吧。

worker_processes 1;  
events {  
	worker_connections 1024;  
}  
http{  
	upstream myproject {  
		#这里指定多个源服务器,ip:端口,80端口的话可写可不写  
		server 192.168.43.158:80;  
		server 192.168.41.167;  
	}  
	server {  
		listen 8080; 		
		location / {  
			proxy_pass http://myproject;  
		}  
	}  
}

Nginx负载均衡有哪些功能呢?如果后面的服务器其中一台坏了,它能自动识别,更牛的是它好了之后Nginx可以马上识别服务器A和B,如果A的响应时间为3,B的响应时间为1,那么Nginx会自动调整访问B的概率是A的3倍,真正做到Nginx负载均衡好的,安装完成了。我在make的时候报了个错,说HTTP Rewrite 模块 有问题,我就./configure –without-http_rewrite_module,然后再make,make install就可以了。



安装好了之后新建一个配置文件,把上面的配置文件内容拷进去,当然要修改你的IP,保存为比如 load_balance.conf


然后启动:/usr/local/Nginx/sbin/Nginx -c load_balence.conf;由于Nginx的作者是俄国人,所以英文的文档也不是那么完善,对于我来说Nginx的最大优点还是配置简单,功能强大。我曾经配过 apache-jk,那真的不是一般人能配的。太复杂了,而且只能用来做tomcat的Nginx负载均衡。


二)应用配置

www.s135.com 和 blog.s135.com 域名均指向 Nginx 所在的服务器IP。
  用户访问http://www.s135.com,将其负载均衡到192.168.1.2:80、192.168.1.3:80、192.168.1.4:80、192.168.1.5:80四台服务器。
  用户访问http://blog.s135.com,将其负载均衡到192.168.1.7服务器的8080、8081、8082端口。
  以下为配置文件nginx.conf:


引用

user  www www; 
  

 worker_processes 10; 
  

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

 #pid        logs/nginx.pid; 
  

 #最大文件描述符 
  
 worker_rlimit_nofile 51200; 
  

 events  
  
 { 
  
       use epoll; 
  
       worker_connections 51200; 
  
 } 
  

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

       keepalive_timeout 120; 
  

       tcp_nodelay on; 
  

       upstream   
  www.s135.com  { 
  
               server   192.168.1.2:80; 
  
               server   192.168.1.3:80; 
  
               server   192.168.1.4:80; 
  
               server   192.168.1.5:80; 
  
       } 
  

       upstream  blog.s135.com  { 
  
               server   192.168.1.7:8080; 
  
               server   192.168.1.7:8081; 
  
               server   192.168.1.7:8082; 
  
       } 
  

       server 
  
       { 
  
               listen  80; 
  
               server_name   
  www.s135.com; 
  

               location / { 
  
                        proxy_pass         
  http://www.s135.com; 
  
                        proxy_set_header   Host             $host; 
  
                        proxy_set_header   X-Real-IP        $remote_addr; 
  
                        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 
  
               } 
  

               log_format  www_s135_com  '$remote_addr - $remote_user [$time_local] $request ' 
  
                                 '"$status" $body_bytes_sent "$http_referer" ' 
  
                                 '"$http_user_agent" "$http_x_forwarded_for"'; 
  
               access_log  /data1/logs/www.log  www_s135_com; 
  
       } 
  

       server 
  
       { 
  
               listen  80; 
  
               server_name  blog.s135.com; 
  

               location / { 
  
                        proxy_pass         
  http://blog.s135.com; 
  
                        proxy_set_header   Host             $host; 
  
                        proxy_set_header   X-Real-IP        $remote_addr; 
  
                        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 
  
               } 
  

               log_format  blog_s135_com  '$remote_addr - $remote_user [$time_local] $request ' 
  
                                 '"$status" $body_bytes_sent "$http_referer" ' 
  
                                 '"$http_user_agent" "$http_x_forwarded_for"'; 
  
               access_log  /data1/logs/blog.log  blog_s135_com; 
  
       } 
  
 }


  附:Nginx 的安装方法可参照《Nginx 0.5.31 + PHP 5.2.4(FastCGI)搭建可承受3万以上并发连接数,胜过Apache 10倍的Web服务器》文章的以下段落(仅做负载均衡,无需支持PHP的安装方法):


  二、安装PHP 5.2.4(FastCGI模式)

  4、创建www用户和组,以及其使用的目录:


  三、安装Nginx 0.5.31

  1、安装Nginx所需的pcre库:

  2、安装Nginx

  3、创建Nginx日志目录

  5、启动Nginx




三)FastCGI配置

location ~ \.php$ {
            root           /var/www/;
            #fastcgi_pass   127.0.0.1:9000;
            fastcgi_pass   fastcgiServers;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/$fastcgi_script_name;
            include        fastcgi_params;
        }



#my fastcgi proxy
    upstream fastcgiServers{
        server  10.1.54.167:9000;
        server  10.1.54.168:9000;
    }

四)常见问题

1、如果均衡的域名中有泛域名,或有几百个域名的话可以配置吗?
2、ngnix在做均衡的时候是否已经包含了cache功能?
3、ngnix---squid----apache取的的HTTP_X_FORWARDED_FOR是squid服务器的ip地址,如果想取真实客户端地址可以做到吗?


1、nginx.conf 
  
 server_name  .s135.com;   即可支持***.s135.com泛域名 
  

 2、nginx负载均衡只做反向代理,有简单的缓冲,但不像Squid那样将cache存在本机。 
  

 3、我已经在nginx.conf配置文件中增加: 
  
 proxy_set_header   Host             $host; 
  
 proxy_set_header   X-Real-IP        $remote_addr; 
  
 proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 
  

 编译squid时加上--enable-follow-x-forwarded-for 
  
 然后在squid.conf中输入一行: 
  
 follow_x_forwarded_for allow all 
  

 后端的Apache取日志(httpd.conf): 
  
 LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %h %T" combined 
  
 取到的就是用户真实IP


4、想问一下,为什么本机不能也接受访问呢?例如:a、b、c三台机器,我在a上面如同上面配置的,为什么访问总是在b、c来回换,为什么a上也有网站却不被访问到呢?如果我也想访问a服务器上的网站需要如何处理?


当然可以。

upstream  myproject  {
	      server   127.0.0.1;//本机也作为server
              server   192.168.1.2:80;
              server   192.168.1.3:80;
              server   192.168.1.4:80;
              server   192.168.1.5:80;
      }

5、请问这三个是什么意思啊?能具体讲一下么。


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_set_header X-Real-IP $remote_addr;配合这个把真实的ip 发送给转发的web服务器,要不的话,接收请求的收到的请求ip都是nginx这台的 


6、安装php必须要用fastcgi模式吗?我用的是fpm的,但发现做负载均衡的时候发现访问/message/目录下的php文件的时候总是失效,系统自动在/下面去访问了,不知是什么原因的?

解决了,刚开始准备将负载均衡器也做为web使用,启用了以下代码 ,将这几行删除即可.

location ~ \.php$ {           
	root           html;             
	fastcgi_pass   127.0.0.1:9000;             
	fastcgi_index  index.php;             
	fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/html$fastcgi_script_name;            
	include        fastcgi_params;         
}

7、F5 有没有类似的负载均衡功能? 另外还有一个疑问:
客户端直接访问web服务器时,可以用HTTP_CLIENT_IP、REMOTE_ADDR 这几个变量看到客户端的IP。经过squid或者ngrnx之后,还能看到客户端的IP吗? 是不是要用HTTP_X_FORWARDED_FOR?

#F5 BIG-IP 就是用来做负载均衡的。经过squid或者ngrnx之后,看到客户端的IP,请用HTTP_X_FORWARDED_FOR。

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

8、负载均衡配置

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型,类型由mime.type文件定义
include       /etc/nginx/mime.types;
default_type  application/octet-stream;
#设定日志格式
access_log    /var/log/nginx/access.log;

#省略上文有的一些配置节点

#。。。。。。。。。。

#设定负载均衡的服务器列表
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口
server 192.168.8.2x:80  weight=1;
server 192.168.8.3x:80  weight=6;
}

upstream mysvr2 {
#weigth参数表示权值,权值越高被分配到的几率越大

server 192.168.8.x:80  weight=1;
server 192.168.8.x:80  weight=6;
}

#第一个虚拟服务器
server {
#侦听192.168.8.x的80端口
listen       80;
server_name  192.168.8.x;

#对aspx后缀的进行负载均衡请求
location ~ .*\.aspx$ {

root   /root;      #定义服务器的默认网站根目录位置
index index.php index.html index.htm;   #定义首页索引文件的名称

proxy_pass  http://mysvr ;#请求转向mysvr 定义的服务器列表

#以下是一些反向代理的配置可删除.
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服务器传

}

}
}