nginx haproxy + dnsmasq 基于dns 进行服务负载处理

默认nacos 与coredns plugin 的能力有点弱(比如srv 支持的),为了体验nginx 以及haproxy 关于dns 服务负载的处理,基于了dnsmasq进行测试

参考玩法

简单说明: 基于dnsmasq 配置服务记录,nginx 以及haproxy 通过dns 支持能力处理

示例

详细参考github 代码

  • dnsmasq 配置

为了简化基于hosts 模式,使用的时候配置hosts 就可以了,具体查看github

  • haproxy 配置
global
    log stdout format raw local0 info
    stats socket /run/haproxy.sock mode 600 level admin
    stats timeout 30s
    user haproxy
    group haproxy
# 自定义dns 配置
resolvers mydns
    nameserver dns1 dnsmasq:53
    accepted_payload_size 8192 # allow larger DNS payloads

listen stats
  bind :9000
  mode http
  stats enable
  stats realm Haproxy\ Statistics  # Title text for popup window
  stats uri /haproxy_stats

frontend mydemo
  bind *:8080
  mode http
  option httplog
  log stdout format raw local0 info
  default_backend mydemo_backend

backend mydemo_backend
  mode http
  balance roundrobin
  # a 记录模式的
  server-template web 3 demo.go:80 check resolvers mydns init-addr none

frontend mydemov2
  bind *:8081
  mode http
  option httplog
  log stdout format raw local0 info
  default_backend mydemo_backendv2

backend mydemo_backendv2
  mode http
  balance roundrobin
  # srv 格式的
  server-template web 2 _sip._tcp.demoapp.go check resolvers mydns init-addr none


frontend prometheus
  bind *:8405
  mode http
  option httplog
  http-request use-service prometheus-exporter if { path /metrics }
  
frontend prometheusv2
  bind *:8500
  mode http
  option httplog
  log stdout format raw local0 info
  default_backend prometheusv2

backend prometheusv2
    mode http
    server prometheusv1 127.0.0.1:8405 check

defaults
    log     global
    mode    http
    option  httplog
    option  log-health-checks 
    option  dontlognull
    timeout connect 5s
    timeout client  50s
    timeout server  50s
  • nginx
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
events {
    worker_connections 1024;
}

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

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    tcp_nopush      on;

    keepalive_timeout  65;
    gzip on;
    gzip_types text/plain application/json application/javascript text/css application/xml;
    # dns 配置,注意valid 参数,建议小一些
    resolver dnsmasq valid=10s ipv6=off;
    resolver_timeout 10s;
    upstream backend { 
        # 配置zone 必须参数
        zone backend_zone 64k;
        # resolve 支持动态更新,a 记录
        server demo.go resolve;
    }
    upstream backendv2 {
        # 配置zone 必须参数
        zone backend_zone 64k;
         # resolve 支持动态更新, srv 模式
        server demoapp.go service=_sip._tcp resolve;
    }
    server {
        listen 80;
        location / {
            proxy_pass http://backend;
        }
    }

    server {
        listen 9090;
        location / {
            proxy_pass http://backendv2;
        }
    }
}

说明

以上是一个简单的测试示例,完整我已经提交github 了,可以通过gihub 完整示例可以体验nginx 以及haproxy 基于dns 的服务负载处理,当然dnsmasq 属于静态玩法,利用coredns 是一个不错的选择,动态能力更强(powerdns 也是一种选择),当时coredns 的云原生能力更好,对于容器以及k8s 周边的支持更好

参考资料

https://github.com/rongfengliang/nginx_haproxy_dnsmasq_ds_learning

https://www.haproxy.com/blog/dns-service-discovery-haproxy

https://blog.nginx.org/blog/dynamic-dns-resolution-open-sourced-in-nginx

https://github.com/rongfengliang/coredns-nacos

https://github.com/cloud66-oss/coredns_mysql

https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server

https://www.haproxy.com/documentation/haproxy-configuration-tutorials/proxying-essentials/dns-resolution/

posted on 2025-06-14 08:00  荣锋亮  阅读(44)  评论(0)    收藏  举报

导航