wangluo010 发表于 2019-1-2 06:16:30

HAProxy匹配泛解析域名排错经历

  一 故障描述
  HAProxy已经搭建完毕,现在需要把以后缀为game.xxx.com的域名转发到后端的Nginx虚拟机主机上,所以关键在于怎么使用HAProxy匹配game.xxx.com。在HAProxy的配置文件中设置将HTTP请求转发到后端Nginx主机的80端口,通过88端口检测Nginx和PHP-FPM的监控状态。

  通过设置HAProxy ACL规则
acl game_url      hdr_end(host) -i   game.xxx.com  然后reload HAProxy后,通过浏览器访问始终报404错误

  如在浏览器访问router-taiwan.game.xxx.com/index.php,通过在后端Nginx的log日志上查看对应域名的日志输出没有任何显示,只有Nginx默认的访问日志有日志。说明这个域名HAProxy根本没有转发过来。于是怀疑是HAProxy的ACL规则写错了。

  

  二 排错过程
  1.查HAProxy ACL匹配规则的资料,怀疑是ACL规则设置有问题
  将acl一栏注释掉,不设置特定acl规则,设置默认转发

default_backend game_pool  这样所有的域名请求都会默认转发到game_pool指定的Nginx主机,再查看Nginx访问日志,仍然没有特定域名的范围日志,而只有Nginx的默认访问日志。所以排除是ACL转发规则的问题。
  

  2.检查HAProxy对后端Nginx主机的监控检查机制。
  在HAProxy中设置的是通过检测后端Nginx主机的php-fpm_status的状态来判断后端Nginx主机上的Nginx和PHP-FPM的健康状态的。因为只判断Nginx或只判断PHP-FPM是不能判断后端Nginx主机可用的。
  nginx_php-fpm_status.conf
server {
         listen       88;
         location /nginx_status {         
            stub_status on;
            access_log off;
#            allow 127.0.0.1;
#            allow 10.4.1.125;
#            deny all;
                                  }      
         location /php-fpm_status {
             fastcgi_pass 127.0.0.1:9000;
             fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
             include fastcgi_params;
                                     }
         }# curl 192.168.100.63:88/php-fpm_status
pool:               www
process manager:      dynamic
start time:         11/Feb/2015:16:00:27 +0800
start since:          2703
accepted conn:      1367
listen queue:         0
max listen queue:   0
listen queue len:   128
idle processes:       19
active processes:   1
total processes:      20
max active processes: 1
max children reached: 0
slow requests:      0  

  在HAProxy中设置有

option httpchkGET /php-fpm_status

serverxxx-taiwan-game1   192.168.100.63:80    check   maxconn 2000  

  这里发现了问题,由于设置HAProxy是通过请求/php-fpm_status去判断健康状态的,但是这个URL需要使用88端口访问,这里使用check参数默认会根据192.168.100.63:80设置的80端口去检测。
  

  重新设置检测端口为88
serverxxx-taiwan-game1   192.168.100.63:80    check port 88maxconn 2000  

  然后reload一下HAProxy,通过浏览器访问router-taiwan.xxx.com/index.php就可以正常访问了。
  

  

  

  

  参考资料:
  http://cbonte.github.io/haproxy-dconv/configuration-1.4.html
  




页: [1]
查看完整版本: HAProxy匹配泛解析域名排错经历