nginx 代理

来源:互联网 发布:php获取时间戳单位 编辑:程序博客网 时间:2024/05/22 15:41
--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.confuser  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.confuser  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.confuser  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.confuser  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-robin2,健康检查 3,会话保持4,数据一致               client request                LB            web1        web2            100 客户   100                接待            张三      李四例五:使用ip_hash,实现同一IP客户端一旦调到一台,就一直调那一台# cat /usr/local/nginx/conf/nginx.confuser  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   在负载均衡的基础上加上会话保持(优点是配置方便,缺点是不能完全的负载均衡)===============================================================================