设为首页 收藏本站
查看: 733|回复: 0

[经验分享] Nginx负载均衡初步搭建

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2016-4-22 09:43:37 | 显示全部楼层 |阅读模式
本帖最后由 23fwerw 于 2016-4-22 09:44 编辑

负载均衡(Load Balance):将用户的访问分摊到多个服务器上,负载均衡的前提就是要有多台服务器才能实现,也就是两台以上即可。        负载均衡也是反向代理所能实现的一个重要功能,区分于正向代理:
反向代理:以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端。
正向代理:一个位于客户端和原始服务器(originserver)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。
        nginx的负载均衡主要通过 upstream(ngx_http_upstream_module)和http_proxy(ngx_http_proxy_module)这两个模块完成。
  1. upstream(ngx_http_upstream_module)
定义算法,设定负载均衡的服务器列表。
官方文档:http://nginx.org/en/docs/http/ngx_http_upstream_module.html
用法:
1
2
3
4
5
6
7
8
9
upstream backend                //upstream是定义在server{ }之外的,不能定义在server{ }内部。
{
    server    backend1.example.com       weight=5;
    server    backend2.example.com:8080;
    server    unix:/tmp/backend3;
  
    server    backup1.example.com:8080   backup;
    server    backup2.example.com:8080   backup;
}



Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方调度算法。  
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。Weight 指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
fair:这是比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块。
url_hash:此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
  2. http_proxy(ngx_http_proxy_module)
官方文档:http://nginx.org/en/docs/http/ngx_http_proxy_module.html
用法:
1
2
3
4
5
location / {
   proxy_pass      http://localhost:8000;
   proxy_set_header Host      $host;
   proxy_set_header X-Real-IP $remote_addr;
}



此模块主要是引用server{}外的upstream定义。

下面由实际情况来初步配置nginx的负载均衡:
LB机:  192.168.73.160

lamp机: 192.168.73.155
lnmp机: 192.168.73.156
注:为了学习才分别搭建apache和nginx的web服务器,正常生产一般只配一种。
  • LB机安装nginx
1
2
3
4
5
# yum install -y pcre-devel pcre openssl-devel   安装必须的包
# tar zxvf nginx-1.6.3.tar.gz
# useradd -M -s /sbin/nologin nginx
# ./configure --prefix=/application/nginx --user=nginx--group=nginx --with-http_ssl_module --with-http_stub_status_module
# make&&make install



编辑nginx配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
worker_processes  1;
error_log logs/error.log error;
events {
   worker_connections  1024;
        }
http {
   include       mime.types;
   default_type application/octet-stream;
   sendfile        on;
   keepalive_timeout  65;
   log_format  main  '$remote_addr - $remote_user [$time_local]"$request" '
             '$status $body_bytes_sent"$http_referer" '
             '"$http_user_agent" "$http_x_forwarded_for"';
upstream bbs_server_pools
{
        server 192.168.73.155:80;
        server 192.168.73.156:80;
}
  
  ##nginx vhosts config;
  ##include extra/lb_www.conf;
    include extra/lb_bbs.conf;
  ##include extra/lb_blog.conf;
    }



定义好之后,在extra/lb_bbs.conf中引用
1
2
3
4
5
6
7
8
# vim/application/nginx/conf/extra/lb_bbs.conf
   server {
       listen       80;
        server_name bbs.etiantian.org;
       location / {
           proxy_pass http://bbs_server_pools;
                   }
              }



验证:
LB主机配置完成,reload
1
2
3
4
# /etc/init.d/nginx reload
nginx: the configuration file /application/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx/conf/nginx.conf test is successful
重新载入 nginx:                                           [确定]





在lamp主机编辑主页文件:
1
2
3
4
# vim /var/html/www/index.php
<?php
        echo "apache web ";
?>



在lnmp主机编辑主页文件:
1
2
3
4
# vim /application/nginx/html/www/index.php
<?php
        echo "nginx web ";
?>



使用其它同网段的主机访问:
1
2
[iyunv@mysql ~]# for n in `seq 10`;do curl 192.168.73.160;sleep 1;done
nginx web apache web nginx web apache web nginx web apache web nginx web apache web nginx web apache web



简单的轮询负载均衡配置成功。


注:以上配置即可实现负载均衡功能,但请求bbs网站,返回的却是www,原因是客户请求BBS的header没有被LB负载均衡器传给web服务器,需要server标签添加参数:
vim/application/nginx/conf/extra/lb_bbs.conf
proxy_set_header Host $host;
此时查看web服务器日志,发现访问地址显示的是LB负载均衡的地址,我们需要的是用户访问源地址,需要在LB机nginx的server标签中添加:
vim/application/nginx/conf/extra/lb_bbs.conf
proxy_set_header X-Forwarded-For    $remote_addr;
同时web服务器的日志格式也需要修改:
nginx服务器:vimconf/nginx.conf
log_format main  '$remote_addr - $remote_user[$time_local] "$request" '
                      '$status $body_bytes_sent"$http_referer" '
                     '"$http_user_agent" "$http_x_forwarded_for"';
apache服务器:vim /application/apache2/conf/httpd.conf
LogFormat "%h %l %u %t\"%r\" %>s %b \"%{X-Forwarded-For}i\""common
重启nginx和apache即可



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-207221-1-1.html 上篇帖子: ngx_http_wait_request_handler函数解析 下篇帖子: nginx+tomcat 负载均衡
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表