上一个例子中,代理仅仅指向一个服务器。

但是,网站在实际运营过程中,多半都是有多台服务器运行着同样的app,这时需要使用负载均衡来分流。


nginx也可以实现简单的负载均衡功能。


假设这样一个应用场景:将应用部署在 192.168.1.11:80、192.168.1.12:80、192.168.1.13:80 三台linux环境的服务器上。网站域名叫 www.helloworld.com,公网IP为 192.168.1.11。在公网IP所在的服务器上部署 nginx,对所有请求做负载均衡处理。


nginx.conf 配置如下:

http 
  {  
 #设定mime类型,类型由mime.type文件定义 
   
 include 
  /etc/nginx/mime.types;  
 default_type 
  application/octet-stream;  
 #设定日志格式 
   
 access_log 
  /var/log/nginx/access.log;  
 #设定负载均衡的服务器列表 
   
 upstream 
  load_balance_server {  
 #weigth参数表示权值,权值越高被分配到的几率越大 
   
 server 
  192.168.1.11:80 weight=5;  
 server 
  192.168.1.12:80 weight=1;  
 server 
  192.168.1.13:80 weight=6; }  
 #HTTP服务器 
   
 server 
  {  
 #侦听80端口 
   
 listen 
  80;  
 #定义使用www.xx.com访问 
   
 server_name 
  www.helloworld.com;  
 #对所有请求进行负载均衡请求 
   
 location 
  / {  
 root 
  /root;  
 #定义服务器的默认网站根目录位置 
   
 index 
  index.html index.htm;  
 #定义首页索引文件的名称 
   
 proxy_pass 
  http://load_balance_server ; 
 #请求转向load_balance_server 定义的服务器列表 
   
 #以下是一些反向代理的配置(可选择性配置) 
   
 #proxy_redirect off; 
   
 proxy_set_header 
  Host  
 $host 
 ;  
 proxy_set_header 
  X-Real-IP  
 $remote_addr 
 ;  
 #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP 
   
 proxy_set_header 
  X-Forwarded-For  
 $remote_addr 
 ;  
 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服务器传 
   
 client_max_body_size 
  10m;  
 #允许客户端请求的最大单文件字节数 
   
 client_body_buffer_size 
  128k;  
 #缓冲区代理缓冲用户端请求的最大字节数 
  } }}


网站有多个webapp的配置


当一个网站功能越来越丰富时,往往需要将一些功能相对独立的模块剥离出来,独立维护。这样的话,通常,会有多个 webapp。


举个例子:假如 www.helloworld.com 站点有好几个webapp,finance(金融)、product(产品)、admin(用户中心)。访问这些应用的方式通过上下文(context)来进行区分:


www.helloworld.com/finance/


www.helloworld.com/product/


www.helloworld.com/admin/


我们知道,http的默认端口号是80,如果在一台服务器上同时启动这3个 webapp 应用,都用80端口,肯定是不成的。所以,这三个应用需要分别绑定不同的端口号。


那么,问题来了,用户在实际访问 www.helloworld.com 站点时,访问不同 webapp,总不会还带着对应的端口号去访问吧。所以,你再次需要用到反向代理来做处理。


配置也不难,来看看怎么做吧:

http { #此处省略一些基本配置 upstream product_server{ server www.helloworld.com:8081; } upstream admin_server{ server www.helloworld.com:8082; } upstream finance_server{ server www.helloworld.com:8083; } server { #此处省略一些基本配置 #默认指向product的server location / { proxy_pass http://product_server; } location /product/{ proxy_pass http://product_server; } location /admin/ { proxy_pass http://admin_server; } location /finance/ { proxy_pass http://finance_server; } }}

--------------------------------------------------------------------------------------