nginx 反向代理实现负载均衡简单模型

A,B,C 三台主机,组成一个集群,用来实现反向代理+负载均衡。之前总结过一个通过 squid 来实现反向代理的文章,点击这里参考。

A:前端。该主机上有两个网卡,外网一个 ip 假设是 202.202.202.202 对外提供服务;内网网卡绑定 192.168.2.1 这个 ip,与其余的两台后端实现交流,同时也是网关。
B:后端-1,ip 为 192.168.2.2。
C:后端-2,ip 为 192.168.2.3。
B,C 两台的网关均为 192.168.2.1。
三台主机的环境一样均为 CentOS-5.5 x86_64 的 LNMP,具体的安装可以参考我先前的这篇博客

现在开始实现上述要求。

A 主机:

注释掉 nginx.conf 文件 http{} 中的 server{} 段。将其中的配置文件移至默认的 /etc/nginx/conf.d/ 中

# vi virtual.conf
server {
    server_name  202.202.202.202;
    root /var/www/nginx;

location ~ \.php$ {
    proxy_pass  http://cluster ;
    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;
       }   
}

# vi upstream-fair.conf
upstream cluster {
    server 192.168.2.2:80;
    server 192.168.2.3:80;
}

B 主机:

同样注释掉 nginx.conf 中的 server{} 段。

# mkdir /var/www/nginx/
# cd /var/www/nginx/
# vi a.php
<?php echo "from 192.168.2.2";?>

# vi /etc/nginx/conf.d/virtual.conf

server {
    server_name  192.168.2.3;
    root /var/www/nginx;

location ~ \.php$ {
           #root           html;
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
           include        fastcgi_params;
       }
}

C 主机:

同 B 主机。

OK,将三台机子的 nginx 全部重新加载一下:

# /etc/init.d/nginx reload

访问 202.202.202.202/a.php 应该就能看见预期的画面了。

在此基础上还可以实现权重,即以多大的概率访问 2.2 那台主机,而以多大的概率访问 2.3 那台主机。反向代理的另一个用处是可以将静态页面和动态页面分离:可以把静态页面或者文件放置到前端;动态页面和数据库都保留到后台的服务器上。

P.S. 默认的 nginx.conf 文件是没有高亮显示的,可以通过安装 vim.syntax for nginx 来实现语法高亮,安装过程请猛击这里

  • http://huxuan.org Victor.Hu

    我想用feeds.huxuan.org给Feedburner作反向代理的,但是现在只有用firefox可以读到RSS,IE和Chrome都打不开,IE显示是错误的XML文件,知道可能是什么问题么?

    相关配置文件:

    server
    {
    listen 80;
    server_name feeds.huxuan.org;
    location / {
    proxy_pass http://feeds.feedburner.com/huxuan/;
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    }

    • http://jaseywang.info jaseywang

      把 location /
      改成
      location ~ \.php$
      试试。

      • http://huxuan.org Victor.Hu

        那样改之后会报错……错误信息如下
        [emerg]: “proxy_pass” may not have URI part in location given by regular expression, or inside named location, or inside the “if” statement, or inside the “limit_except” block in balabalabala

        • http://jaseywang.info jaseywang

          server 里面定义了 root 么?

  • Mucid

    试了两天的LNMP实现php与python服务器,发现nginx还真的只适合做代理。
    准备将vps前端nginx,后端apache……

    • http://jaseywang.info jaseywang

      你的网站才多大,要前端后端一起做。。。

      • Mucid

        就我那blog啦,就一个小vps……不过是想搞出性能最好的方案。
        nginx的bug还真的多,不晓得那些人吹得那么好……