Nginx负载均衡

来源:互联网 发布:双十一淘宝不能付款 编辑:程序博客网 时间:2024/06/11 17:05

前沿:

做php开发这一行,懂一点运维的知识还是有必要的。面试的时候经常会问到,光看文档总是感觉少了点什么。 如果你对这篇文章感兴趣可以动手实践,你会发现总以为高大上的负载均衡其实并没有想象中的那么高端或者说很难实现。

原理

利用nginx的proxy_pass反向代理,实现请求的分发,实现负载(默认是轮训机制)


  • 准备3台服务器(虚拟机)
    -IP地址分别为:192.168.0.202 ,192.168.0.203,192.168.0.204 分别装上了nginx和php(安装过程我就忽略了)

    -目的:我们用202这台机器当入口,把请求分发到203和204上。

202机器nginx的配置如下:

vi /usr/local/nginx/conf/nginx.conf 路径根据自己安装的配置去编辑

在跟 server 的上面加上下面的分流配置

     upstream hq.com {#    ip_hash; #这个是同一个IP固定分配到一台服务器,解决分布式session共享的一个方式#   server 192.168.202:8080;  #如果想节约资源(觉得202只分发的话有点浪费),也可以加上202这台的分发到8080端口    server 192.168.203:80;    server 192.168.204:80;    }
  • 然后配置一个虚拟主机的server,重点就是 proxy_pass 和 上面的 upstream
server {listen 80;server_name hq.com;access_log off;index index.html index.htm index.php;  location / {     proxy_pass http://hq.com;   ##这句话是反向代理的重点,一定要加http,hq.com这个必须和upstream上面配置的hq.com 的名字一致 }location ~ [^/]\.php(/|$) {    #fastcgi_pass remote_php_ip:9000;    fastcgi_pass unix:/dev/shm/php-cgi.sock;    fastcgi_index index.php;    include fastcgi.conf;    }location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {    expires 30d;    access_log off;    }location ~ .*\.(js|css)?$ {    expires 7d;    access_log off;    }}

一上的配置大概的意思很清晰,这个服务器啥都不做,就是做反向代理,把web的请求分发到203和204上面。

  • 203和204的nginx的配置相同,没有任何区别,如下
server {listen 80;server_name hq.com;access_log off;index index.html index.htm index.php;root /data/wwwroot/hq;  location / {   if (!-e $request_filename) {   rewrite  ^(.*)$  /index.php?s=$1  last;   break;    } }location ~ [^/]\.php(/|$) {    #fastcgi_pass remote_php_ip:9000;    fastcgi_pass unix:/dev/shm/php-cgi.sock;    fastcgi_index index.php;    include fastcgi.conf;    }location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|ico)$ {    expires 30d;    access_log off;    }location ~ .*\.(js|css)?$ {    expires 7d;    access_log off;    }}
  • 203机器的 /data/wwwroot/hq 这个目录下面我们放了一个index.php内容如下
<?phpecho "this address is 203!";
  • 204机器的 /data/wwwroot/hq 这个目录下面我们放了一个index.php内容如下
<?phpecho "this address is 204!";

理论上这两个web应用应该是一样的,这里为了看效果就特意这样写了。

最后我们在本机上设置hosts 192.168.0.202 hq.com

在浏览器输入: hq.com

返回结果:this address is 203!

多次刷新浏览器 this address is 203! 与 this address is 204! 交替出现,也就是nginx默认是轮训分发。

我们把203的nginx stop掉 (模拟故障)再来访问 hq.com 的结果: this address is 204! 怎么刷新都只有这一个显示

把203的nginx启起来,停掉204的结果:this address is 203!

最后把两个后启动起来,再访问又恢复到了。203与204的交替了。

换而言之,我们的目的其实达到了,一台服务器挂了业务不会中断,等这台服务器恢复的时候,还可以继续工作。

总结:
整个过程应该是这样的,当我们访问hq.com 的时候,就相当于是访问了202这台机器。
202上并没有实际代理到的web应用,而是分发(反向代理)到了203和204上面。

应该有人能想到,按照这样的架构202要是挂了,你下面挂再多的服务器都是白搭,入口服务器就一个。
所以有个叫keepalived的东西就是来解决这个事情的。这个东西怎么玩,下一篇再说吧。。。