nginx 代理

xiaoxiao2021-02-28  133

-- 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 在负载均衡的基础上加上会话保持(优点是配置方便,缺点是不能完全的负载均衡) ===============================================================================
转载请注明原文地址: https://www.6miu.com/read-58807.html

最新回复(0)