Nginx的proxy_pass将请求代理到其余的后端服务器。例如html
listen 9999; server_name wyc.com; location /test/aaa { content_by_lua_block { ngx.say('new:9999/test/aaa') } } location /test/aaa/bbb { content_by_lua_block { ngx.say('new:9999/test/aaa/bbb') } } location /ttt { proxy_pass http://wyc.com:9999/test; }
上面请求http://localhost:9999/ttt/aaa/bbb,会匹配到/ttt进入,规则是去掉ttt,将后面的url和参数拼接到proxy_pass的后面,因而返回的
new:9999/test/aaa/bbb
,即location为/test/aaa/bbb的内容。nginx
http://wychao.com:8888/user/wyc/wyc/aaa?aa=11&bb=22
(匹配到域名和端口和对应的location为/user/wyc,而后将后面的/wyc/aaa?aa=11&bb=22proxy_pass到须要代理到的服务,正好匹配到另外一个server的location里)server { server_name wychao.com; listen 8888; location /user/wyc { proxy_pass http://aaa.wyc.com:8888/user; } location = /user/name { echo $request_uri; } } server { server_name aaa.wyc.com; listen 8888; location /user/wyc { echo $request_uri; } }
结果:/user/wyc/aaa?aa=11&bb=22后端
url | location | proxy_pass | target_url |
---|---|---|---|
aaa.com/aa/bb?a=1 | /aa | http://bbb.com/cc | http://bbb.com/cc/bb?a=1 |
若是proxy_pass http://aaa.wyc.com:8888不带url,则是将匹配到的url附加到host以后。服务器
upstream能够作简单的负载均衡等,下面以百度为例,upstream在http段,负载均衡
upstream search { server 180.149.132.47; } server { # List port listen 8888; server_name wyc.com; location /s { #add_header 'Access-Control-Allow-Credentials' 'true'; proxy_redirect off; proxy_set_header Host "www.baidu.com"; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-for $remote_addr; proxy_pass http://search; } }
上面请求域名wyc.com,端口8888,location将代理到search的upstream中,访问:lua
http://wyc.com:8888/s?wd=nba
和
http://baidu.com/s?wd=nba
的结果是同样的url
upstream支持多种负载均衡,下面一个最简单的根据权重分配:代理
#server1: server { server_name wwyycc.com; listen 8888; location /user { content_by_lua_block { ngx.say('wwyycc.com:host') } } } #server2: server { server_name wwyycc.com; listen 9999; location /user { echo "user wwyycc user"; } } #负载:server3:server_name:wyc.com 端口:8888 upstream manageserver { server wwyycc.com:8888 weight=2; server wwyycc.com:9999; } location /user { #add_header 'Access-Control-Allow-Credentials' 'true'; proxy_redirect off; proxy_set_header Host "wwyycc.com"; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-for $remote_addr; proxy_pass http://manageserver; }
请求http://wyc.com:8888/user,结果按照顺序返回两次server1的结果,再返回一次server2的结果。(上面的例子要成功执行须要nginx的resolver解析,详细见另外一篇文章http://www.cnblogs.com/mentalidade/p/6934162.html),echo等指令也是第三方模块echo-nginx-module,这些都是openresty自带的。
rest