|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!基于Nginx反向代办署理及负载平衡
参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
只需没有被启用,默许就是开启的,由于proxy属于nginx内置尺度模块,一般完成代办署理的时分,最中心模块是proxy_pass,用于将用户哀求的rui递交至下游办事器的某个URI但这个模块年夜局部用于location傍边,因而要完成将某一URI的会见代办署理某个下游办事器大抵的格局为:
location/name/{
proxy_passhttp://127.0.0.1/remote/;
}
参数注释:
location/name/指定以后办事器server的某一会见路径,原本这个location中界说的是root或其他相干参数,今后这个location不在当地供应任何办事,而是经由过程proxy_pass模块传至近程其他主机http://127.0.0.1/remote/上往
个中/name/和/remote/能够是不相婚配的,nginx能够主动处置这类映照干系。
但必要注重的是,当界说location的时分,其必需有一个转换干系,意为我们以后主机的路径uri要转换别的办事器的uri,这是其对应干系,现实上方针主机的uri能够省略失落,可是一旦省略失落就暗示不将其转换
示例:
location/some/path/{
proxy_passhttp://127.0.0.1;#这里只要ip地点,前面没有任何uri
}
例:
如图所示当我们哀求nginx某个uri的时分,nginx主动的代办署理至web办事器中,它其实不真正供应用户哀求的内容而仅仅的将用户的哀求接出去,而且代办署理用户往web办事器上往取数据
一般web办事器会纪录日记的,那末这时候会见日记中近程ip则是nginx的ip地点
关于一个web办事器来说纪录的一切的ip地点都是代办署理办事器的,那末我们在某些剖析的层面来说是没成心义的,以是一般在这类场景下一般必要在nginx办事上做一些复杂修正,而且在后端办事器上也做一些修正用于纪录实在的客户端IP地点
将哀求在nginx转发至后端主机的时分在头部到场header信息
参考:http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass_header
完成反向代办署理
IP地点
办事器脚色
10.0.10.61
Nginx完成反向代办署理
10.0.10.83
Apache下游办事器
10.0.10.82
Apache下游办事器
启动后端apache办事
[root@modelocal]#/usr/local/apache/bin/apachectlstart
[root@modetest]#echo<h1>10.0.10.83</h1>>index.html
[root@modephp_test]#curllocalhost
<h1>10.0.10.83</h1>
我们希冀用户会见某个路径的时分,来历的路径是后端办事器的:
我们只需建一个新的location就能够了,以下所示
新创建location,明白申明利用proxy_pass模块代办署理后端主机10.0.10.83
location/test{
proxy_passhttp://10.0.10.83/;#注重一旦带有斜线就暗示有url的假如没有url必定不克不及带斜线,这就暗示会见的test没错,可是将test映照至后端主机,但后端并没有test目次
}
反省语法是不是准确偏重新加载设置文件
[root@node1nginx]#/usr/local/nginx/sbin/nginx-t
nginx:theconfigurationfile/etc/nginx/nginx.confsyntaxisok
nginx:configurationfile/etc/nginx/nginx.conftestissuccessful
[root@node1nginx]#/etc/init.d/nginxreload
利用curl会见测试http://10.0.10.61/test
[root@node1nginx]#curlhttp://10.0.10.61/test/
<h1>10.0.10.83</h1>
我们再来检察后端apache的会见日记
[root@modetest_php]#tailaccess_w_20140508.log
10.0.10.61--[08/May/2014:11:04:38+0800]"GET/HTTP/1.0"304-"-""Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/34.0.1847.131Safari/537.36"
10.0.10.61--[08/May/2014:11:04:38+0800]"GET/HTTP/1.0"304-"-""Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/34.0.1847.131Safari/537.36"
能够看到来历地点都是nginx办事器的地点,关于我们以后剖析日记没有任何意义地点,以是那这个时分我们想换成客户端地点必需借助于proxy_set_header模块
完成显现实在客户端IP
proxy_set_header模块利用示例
location/test{
proxy_passhttp://10.0.10.83/;
proxy_set_headerX-Real-IP$remote_addr;
}
proxy_set_header暗示将发送至upsreamserver的报文的某首部举行重写;
X-Real-IP暗示hader的称号为X-Real-IP
传送给X-Real-IP的地点是$remote_addr
再来检察后端日记的会见ip,不管怎样革新它的纪录ip仍旧仍是nginx
由于后真个办事器只纪录了client值,并没有纪录我们界说的header的值,以是我们还必要对apache的日记参数做修正
编纂httpd.conf,界说日记格局
[root@modeconf]#vimhttpd.conf
将其正文并复制
#LogFormat"%h%l%u%t"%r"%>s%b"%{Referer}i""%{User-Agent}i""combined
将%h改成"%{X-Real-ip}i
LogFormat"%{X-Real-IP}i%l%u%t"%r"%>s%b"%{Referer}i""%{User-Agent}i""combined
%h是暗示远端客户的ip地点,这里我们将其改成某个特定首部的值也就是方才我界说的X-Real-IP,而援用特定首部的值的格局是%{***}i如许就暗示援用这个首部的值
保留加入偏重新加载apache
[root@modeconf]#/usr/local/apache/bin/apachectlgraceful
再次会见并检察日记
已看到今朝已纪录客户真个实在IP地点
[root@modetest_php]#tail-1access_w_20140508.log
10.0.10.1--[08/May/2014:12:44:40+0800]"GET/HTTP/1.0"304-"-""Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/34.0.1847.131Safari/537.36"
利用形式婚配
示例:
location~/test{
proxy_passhttp://10.0.10.83/hello;
proxy_set_headerX-real-ip$remote_addr;
}
只需客户端会见的uri中只需包括test的路径则举行跳转至于10.0.10.83的/test的物理路径;
一旦利用了形式婚配,那末前面跟上test以后内里代办署理的时分,前面必定不克不及带有路径hello,必定甚么路径都不要加,它会将test的内容添补至于前面
测试:
location~/test{
proxy_passhttp://10.0.10.83/hello;#必定不克不及带有任何字符
proxy_set_headerX-real-ip$remote_addr;
}
保留加入并反省语法
[root@node1nginx]#nginx-t
nginx:[emerg]"proxy_pass"cannothaveURIpartinlocationgivenbyregularexpression,orinsidenamedlocation,orinside"if"statement,orinside"limit_except"blockin/etc/nginx/nginx.conf:49
nginx:configurationfile/etc/nginx/nginx.conftestfailed
起首语法检测基本欠亨过,提醒路径中不克不及到场uri,以是假如呈现此类设置体例是连办事都不克不及启动的
将前面的uri往失落再测试:
location/test{
proxy_passhttp://10.0.10.83;#注重没有斜线
proxy_set_headerX-real-ip$remote_addr;
}
总结:利用婚配形式,必定不克不及加uri,只是将其前真个参数传送过去
从头加载并会见测试:
[root@modetest_php]#curlhttp://10.0.10.61/test
<!DOCTYPEHTMLPUBLIC"-//IETF//DTDHTML2.0//EN">
<html><head>
<title>404NotFound</title>
到场斜线
location/test{
proxy_passhttp://10.0.10.83/;
proxy_set_headerX-real-ip$remote_addr;
}
会见测试:
[root@modetest_php]#curlhttp://10.0.10.61/test
<h1>10.0.10.83</h1>
假如location给了uri而proxy_pass没有跟任何uri意味着将location的uri附加至proxy_pass当作哀求的路径,哪怕加一个斜线也暗示对应的uri,以是哀求的test路径相对http://10.0.10.83/目次下的文件
基于婚配划定规矩完成动态分别
新建location,内容以下
location~*.(jpg|bng|html|CSS|png|gif|ico|)${
proxy_passhttp://10.0.10.83;
proxy_set_headerX-real-ip$remote_addr;
}
假如会见的内容是不辨别巨细写的体例:
假如会见的uri后缀是以静态内容或图片格局开头的,那末间接将哀求转向10.0.10.83
反省语法偏重启
[root@node1nginx]#!ngin
[root@node1nginx]#!ser
然后在办事10.0.10.83办事器创立目次及文件
上传某张图片或创立某路径文件并会见测试
[root@modeif]#pwd
/var/html/php_test/if
[root@modeif]#echo"test10.0.10.83">1.html
[root@modeif]#curlhttp://10.0.10.61/if/1.html
1
先来测试一下会见静态内容
[root@node1nginx]#curlhttp://10.0.10.61/if/1.html#指定其uri
test10.0.10.83#能够看到,已乐成跳转至10.0.10.83
以是就算前端没有如许的路径但能映照到后端办事器相干路径都能会见的到
那末假设说有别的办事器能够会见静态内容的话,则能够将一切的静态哀求间接转发至静态内容办事器
以下所示
我们本机已存在fastcgi,以是将nginx的fastcgi功效开启,因为9000端口在当地监听,以是这里默许便可
location~.php${#已默许帮我们界说了location婚配划定规矩,假如后缀是php的uri,那末全体转发至这个主机
root/web/htdocs;#指定其php目次
fastcgi_pass127.0.0.1:9000;#fastcgi在我们本机已监听
fastcgi_indexindex.php;
fastcgi_paramSCRIPT_FILENAME/scripts$fastcgi_script_name;
includefastcgi_params;
}
界说在本机,
那末间接会见测试:
能够发明,如今我们将2个哀求分隔了
假如哀求的是静态内容则到10.0.10.83上往,假如哀求的是静态内容则到本机,而假如静态哀求在别的办事器上安排的也完整能够完成支解
基于婚配划定规矩完成上传转发功效
跟着我们营业量的愈来愈年夜,需求将上传办事器也对其举行分别,在站点上搭建一个专门的办事器用来吸收上传
偶然候web办事器能够完成上传,web也撑持上传,可是必要将DAV功效翻开
新建虚机10.0.10.62并开启apache上传功效
[root@node2apache]#./bin/apachectl-M|grep-idav
dav_module(static)
dav_fs_module(static)
这时候只必要在DocumentRoot上对应的会见权限上启动对应的DAV便可
到场参数:
Davon
OptionsIndexesFollowSymLinks
将网页目次赐与写权限
[root@node2apache]#setfacl-mu:apache:rwx/var/www/html/
编纂nginx设置文件,到场if判别语句并援用$request_method模块,判别假如用户操纵是put,那末将其转发至10.0.10.62
location/{
root/web/htdocs/;
indexindex.phpindex.htmlindex.htm;
if($request_method~*"PUT"){
proxy_passhttp://10.0.10.62;
<pstyle="padding:0px;margin:0px;clear:both;height:auto;overflow:hidden;color:rgb(44,44,44);font-family:宋体,ArialNarrow,arial,serif;font-size:14px;line-height:28px;background-color:rgb(204,204,204);"> |
|