利用Nginx实现动态地址解析


要实现 Nginx 动态地址解析,查阅了官方文档,才发现官方解释说的非常清楚:说是在反向代理的使用场景中,当 upstream 后端用域名时,配置 resolver 以便于 Nginx 能够解析该域名。

利用Nginx实现动态地址解析


  • 最近工作中有一个反向代理的需求,就是给客户提供一个 data.wsescape.com 的域名用来访问内部提供的 API 接口。但是提供接口的服务器在另外一台主机上面,所以需要对请求进行二次转发,转发到 data.misssun.com 这个域名下面。

  • 首先想到的是,使用 upstream 进行反向代理就可以很好地解决这个问题,但是因为 data.misssun.com 这个域名对应的服务器 IP 地址会动态的变化,导致 upstream 反向代理会出现 502 的情况。

  • 通过查阅资料,发现可以通过制定 resolver 字段对域名进行间隔时间的解析,可以完美的实现动态地址解析的效果。通过 resolver 可以配置多个 DNS 服务器地址,Nginx 会采用轮询的方式去访问 DNS 服务,Nginx 会缓存 DNS 对域名解析的结果,缓存的时间由 valid 指定。

user nginx;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    # Logging Settings
    log_format wsescape '$remote_addr - $remote_user [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '$request_length $request_time $upstream_response_time '
                      '"$http_referer" "$http_user_agent"';

    # Domain name resolution
    resolver 114.114.114.114 valid=5s;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepable_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    # Gzip Settings
    gzip  on;
    gzip_buffers     4 8k;
    gzip_types
        text/css
        text/javascript
        text/xml
        text/plain
        text/x-component
        application/javascript
        application/json
        application/xml
        application/rss+xml
        font/truetype
        font/opentype
        application/font-woff
        application/vnd.ms-fontobject
        image/svg+xml;

    server {
        listen       80;
        server_name  data.wsescape.com;

        access_log /var/log/nginx/wsescape.nginx.access.log  wsescape;
        error_log  /var/log/nginx/wsescape.nginx.error.log   error;

        set $realip "data.misssun.com";

        location / {
            return 404;
        }

        location /api/ {
            proxy_pass_header Server;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Scheme $scheme;
            proxy_http_version 1.1;
            if ($request_uri ~* "/api/app/data\?id=(.*)") {
                set $id $1;
                rewrite .* /api/data/$id break;
                proxy_pass http://$realip:1556;
            }
        }
    }
}

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !