nginx 代理

--


1,四台机器,单网卡同网段(先不讨论跨网段)
2,web1我这里用的是上次课搭建好的lnmp,为了后面方便测试
3,web2这里简单的安装并启动rpm版的apache,并做一个简单主页就好
4,nginx这台需要按下面的第一步过程进行安装,这次只安装nginx就好,不用安装php,mysql等(因为是主要做代理)
5,客户端最好有图形界面,并安装firefox浏览器



nginx 反向代理


            client  10.1.1.x



            nginx(虚拟机110.1.1.8



            web1(宿主机)       web2(虚拟机210.1.1.9:8000        10.1.1.12




第一步,在nginx反向代理服务器上安装nginx,过程可以和装lnmp时几乎一模一样
# yum install pcre-devel -y

# useradd -r -d /dev/null -s /bin/false nginx       --我这里建立一个用户来跑nginx,不做也可以,它默认是用daemon用户来跑

# id nginx      --nginx的uid,gid无所谓是多少
uid=517(nginx) gid=518(nginx) groups=518(nginx)

# tar xf nginx-1.8.0.tar.gz -C /usr/src/
# cd /usr/src/nginx-1.8.0/


# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_gzip_static_module  --with-http_stub_status_module 

# make ;make install



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



--注意:下面这五个例子,是以静态页面来做测试,如果现在讨论动态页面(比如登录相关),下面的配置并不完整;并且这五个例子都是同网段做,如果换成双网段(后台web在内网)则会出现问题,需要使用后面综合例子里的proxy_set_header等指令来辅助


例一:使用前端nginx代理后面一台web

            client  10.1.1.x    



            nginx   10.1.1.8 (缓存加速,但nginx默认没有;七层数据切分,负载均衡;做CDN)     



                web1            
            10.1.1.9:8000



[root@li nginx]# cat /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  4;
error_log  logs/error.log  info;
pid        logs/nginx.pid;

events {
    use epoll;
    worker_connections  65535;
}

http {
    server {
        listen       80;
        server_name  10.1.1.8;
    root /nginxroot/;

        location /web1/ {
        proxy_pass http://10.1.1.9:8000/;   
        }
    }
}


# mkdir /nginxroot/
# echo "nginx main page" > /nginxroot/index.html


--启动
# ulimit -SHn 65535
# /usr/local/nginx/sbin/nginx



--验证
找另一台客户端机器验证
# elinks 10.1.1.8       --得到10.1.1.8上nginx的主页   
# elinks 10.1.1.8/web1/ --得到10.1.1.9上8000端口的web1主页(但你可以去尝试做一下登录操作是不可以的。或者点注册,会发现它的路径跳转到了10.1.1.9:8000;也就是说这个做法只是简单测试,并不实用。在后面的综合例子里我们再讨论)


--扩展:此写法在apache里也有类似的配置方式,一个是apache里的Alias配置,另一个是apache的proxypasss指令(有兴趣的人可以网上搜一下)



例二:使用前端nginx代理后端两台web,一个代理后台10.1.1.98000端口的web1,一个代理后台10.1.1.1280端口的web2

            client  10.1.1.x



            nginx   10.1.1.8:80



            web1            web2
       10.1.1.9:8000        10.1.1.12:80



# cat /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  4;
error_log  logs/error.log  info;
pid        logs/nginx.pid;

events {
    worker_connections  65535;
    use epoll;
}

http {
    server {
        listen       80;
        server_name  10.1.1.8;
    root  /nginxroot/;

        location /web1/    {
        proxy_pass http://10.1.1.9:8000/;
             }
        location /web2/ {
        proxy_pass http://10.1.1.12/;
             }
    }
}


重启
[root@li nginx]# /usr/local/nginx/sbin/nginx -s stop
[root@li nginx]# /usr/local/nginx/sbin/nginx 



验证
# elinks 10.1.1.8   
# elinks 10.1.1.8/web1/
# elinks 10.1.1.8/web2/


--这可以实现类似sports.sina.com/nba/和sports.sina.com/cba/这样的数据切分(七层代理)


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

什么是动静分离? 
其实就是七层调度,把动态文件的请求和静态文件的请求分别调到不同的后台服务器


什么是网站数据切分?
其实也是七层调度
比如我要把新浪新闻,新浪体育给分开


方法1:
用dns的二级域名(直接dns解析成不同的ip)
新浪新闻   news.sina.com   新浪国内新闻 news.sina.com/china/  --说明没有用二级域名          
              新浪国际新闻 news.sina.com/world/
             新浪国内新闻 china.news.sina.com   --用了二级域名   
              新浪国际新闻  world.news.sina.com

新浪体育  sports.sina.com  新浪体育nba  sports.sina.com/nba/
               新浪体育nba  nba.sports.sina.com   



方法2:
前端使用代理(squid,varnish,apache,nginx,haproxy)
通过代理软件七层调度来分离



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



例三:基于文件类型的反向代理(可用于做动静分离)

[root@li nginx]# cat conf/nginx.conf
user  nginx nginx;
worker_processes  4;
error_log  logs/error.log  info;
pid        logs/nginx.pid;

events {
    use epoll;
    worker_connections  65535;
}

http {

    server {
        listen       80;
        server_name  10.1.1.8;
    root /nginxroot/;

        location /images/ {
        proxy_pass http://10.1.1.12/;   --这里后面得加/   
        }
        location ~ \.(txt|php)$ {
        proxy_pass http://10.1.1.9:8000;    --这里后面不能加/
        }
    }
}


--这里是做的七层代理,上面的配置表示访问10.1.1.8/images/时会调给后面的10.1.1.1280端口;访问任何以.txt或.php结尾的文件时会调给10.1.1.9的8000端口;其它的由10.1.1.8的nginx自己解析


重启  (省略)
验证  (省略)



例四:代理后端时使用负载均衡


# cat /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  4;
error_log  logs/error.log  info;
pid        logs/nginx.pid;

events {
    worker_connections  65535;
    use epoll;
}

http {

upstream backendweb {
    server 10.1.1.9:8000 weight=1 max_fails=2 fail_timeout=1s;
    server 10.1.1.12:80 weight=1 max_fails=2 fail_timeout=1s;
        }


    server {
        listen       80;
        server_name  10.1.1.8;
    root  /nginxroot/;

        location ~ \.(txt|php)$ {
        proxy_pass http://backendweb;   
        }
    }
}


--上面配置的意思是:.txt.php结尾的文件都去均衡的调度给10.1.1.98000端口和10.1.1.1280端口;其它的由10.1.1.8的nginx自己解析

--upstream指令不要加到http {} 外面,也不要加到server{}里面



重启  (省略)
验证  (省略)

--验证时,会发现客户端针对同一个URL的访问也会一次web1一次web2,这说明nginx默认并没有squid或varnish那样的缓存功能


负载均衡(lb  load banlance)一般要注意四个方面:
1,算法  round-robin
2,健康检查 
3,会话保持
4,数据一致


               client request


                LB


            web1        web2


            100 客户   100


                接待

            张三      李四


例五:使用ip_hash,实现同一IP客户端一旦调到一台,就一直调那一台

# cat /usr/local/nginx/conf/nginx.conf
user  nginx nginx;
worker_processes  4;
error_log  logs/error.log  info;
pid        logs/nginx.pid;

events {
    worker_connections  65535;
    use epoll;
}

http {

upstream backendweb {
    ip_hash;        --加上这句
    server 10.1.1.9:8000 weight=1 max_fails=2 fail_timeout=1s;
    server 10.1.1.12:80 weight=1 max_fails=2 fail_timeout=1s;
        }



    server {
        listen       80;
        server_name  10.1.1.8;
    root  /nginxroot/;

        location ~ \.(txt|php)$ {
        proxy_pass http://backendweb;   
        }
    }
}

--nginx的ip_hash的意思是,如果一个客户端的访问被调度到其中一台后台服务器,那么同一个IP来的访问都只会被调到这个后台服务器;这里测试时,如果都用同一个网段的内网IP来做客户端测试,可能会都只转到一个后台(因为nginx的hash算法是按网段来算的,如果是公网不同网段的客户端IP就不一样了)


重启  (省略)
验证  (省略)



对于nginx的upstrem算法总结:
1,round-robin   轮循(平均分配)
2,weight    权重(人为地分配权重,用于后台服务器性能不均的情况)
3,fair      响应时间(按后台的响应时间来分配,需要第三模块,但如果后台服务器都在内网,就没太大必要使用这种算法了)
4,url_hash  按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为多台缓存时比较有效,提高缓存命中率(后面例子会讲)
5,ip_hash   在负载均衡的基础上加上会话保持(优点是配置方便,缺点是不能完全的负载均衡)



===============================================================================




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值