功能要求
通过openresty, 把接入请求分别转向多个不同的接口服务.
从而实现一份数据提交到多台服务器.
主要代码实现如下:
http {
include mime.types;
default_type text/json;
upstream tomcat {
server localhost:9090;
}
upstream remote {
server 10.1.1.10:80;
}
server {
listen 8080;
server_name localhost;
location /api_tomcat {
rewrite ^/[^/]*/(.*) /$1 break;
proxy_pass http://tomcat;
proxy_set_header X-Forwarded-For $remote_addr;
}
location /api_remote {
rewrite ^/[^/]*/(.*) /$1 break;
proxy_pass http://remote;
proxy_set_header X-Forwarded-For $remote_addr;
}
location = /v1/myAPI {
content_by_lua '
ngx.req.read_body()
local arg = ngx.req.get_post_args()
upstream_servers = {
{"/api_tomcat/v1/api", {args = arg, method = ngx.HTTP_POST}}
}
local smart_eu = "192.168.1.100"
local smart_ca = "192.168.1.101"
local headers=ngx.req.get_headers()
local remote_ip=headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr or "0.0.0.0"
-- 来自特定IP的请求才会提交到新的服务器
if remote_ip == smart_ca or remote_ip == smart_ca then
upstream_servers[2] = {"/api_remote/v1/api", {args = arg, method = ngx.HTTP_POST}}
end
ngx.location.capture_multi(upstream_servers)
ngx.say([[{"errorCode":"0","msg":"Succeed."}]])
ngx.exit(200)
';
}
}
}
小坑笔记
由于openresty的请求是从nginx转发过来的, 所以在取请求ip的时候,不能直接用 ngx.var.remote_addr,而是从header里取
网友评论