文章目录

  • 一、设置仅有访问权限的stats用户
  • 问题描述
  • 处理过程
  • 总结
  • 二、haproxy的日志文件配置
  • haproxy的日志配置
  • 三、修改haproxy日志截断后,新日志文件为空
  • 问题描述
  • 处理过程
  • 总结


一、设置仅有访问权限的stats用户

问题描述

haproxy部署完成之后,开发想访问haproxy的stats监控页面,查看UI访问后端应用的负载情况。按照运维要求,只能给开发提供只读账号。

处理过程

查找老半天也没找到网友有相关的解决办法,突然间看到有acl,但是acl一般都是在frontend下配置,想着acl在stats下会不会一样可用?然后开始测试配置

stats配置

listen stats
mode http
option httplog
bind 0.0.0.0:80
stats enable
stats refresh 10s
stats uri     /ha-stats
stats auth    haadmin:haadmin123
stats auth    weihu:weihu123
 acl ip_admin src 10.20.7.0/24  #定义一个管理网段的acl
stats   admin if ip_admin  #调用acl,一般设置为true,既登录成功便有管理权限
stats hide-version

附加
stats admin { if | unless } < cond > 在指定的条件满足时启用的管理级别功能,默认只读
它允许通过web页面启用和禁用后端服务器,因此尽量将web设置为只读以提高安全性

总结

管理权限十分重要,要慎重设置账户权限。acl在很多地方都有,当设置权限遇到没有思路的时候,可以查看一下是否支持acl

二、haproxy的日志文件配置

haproxy的日志配置

1、/etc/haproxy/haproxy.cfg
log 127.0.0.1 local3 info #基于syslog记录日志到指定设备,级别有(err、warning、info、debug)
2、/etc/rsyslog.conf local3.nonelocal3的日志不写入messages

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

*.info;mail.none;authpriv.none;cron.none;local3.none                /var/log/messages
local3.*                                         /var/log/haproxy.log

3、/etc/logrotate.d/haproxy postrotate/endscript日志截断或者copytruncate亦可

/var/log/haproxy.log  {
	daily
	missingok
	rotate 10
	compress
	notifempty
        postrotate
          /etc/init.d/rsyslog restart
        endscript
}

三、修改haproxy日志截断后,新日志文件为空

问题描述

前期部署时配置haproxy为七层代理,然后在正式上线的时候UI访问haproxy代理的jboss应用有异常,开发建议把haproxy改为四层转发。在frontend中增加 mode tcpoption tcplog配置,开发反馈UI调用正常了,但是在检查haproxy日志文件的时候发现,没有日志,甚至haproxy的stats操作日志也没有。

处理过程

1、为了排查原因修改了全局配置中的日志配置,修改为mode tcpoption tcplog,仍不能解决问题
2、还原haproxy为七层代理,检查日志还未恢复
3、因为修改了haproxy的日志配置,并还原为七层代理日志仍未恢复,所以怀疑问题出在rsyslog,检查rsyslog的配置,没有发现异常,就重启的rsyslog服务,发现haproxy的日志恢复,但是第二天发现新日志文件又为空了,重启rsyslog才恢复
4、本来计划写一个计划任务重启rsyslog来解决这个问题,但是在网上搜索资料,发现有人遇到同样的问题。解决办法是在logroate的配置里面增加copytruncate,来截断日志。经测试配置后问题成功处理
logroate最后配置为:

cat /etc/logrotate.d/haproxy
/var/log/haproxy.log  {
	daily
	missingok
	rotate 10
	compress
	notifempty
    copytruncate
}

附加
copytruncate配置的功能:创建日志文件的副本,在适当位置截断原始日志文件并清空,使应用程序仍旧可以把新生成的日志追加到原始日志文件
Truncate the original log file in place after creating a copy, instead of moving the old log file and optionally creating a new one. It can be used when some program cannot be told to close its logfile and thus might continue writing appending) to the previous log file forever. Note that there is a very small time slice between copying the file and truncating it, so some logging data might be lost. When this option is used, the create option will have no effect, as the old log file stays in place.

总结

怀疑在修改haproxy的日志配置后,rsyslog并不能接收到新的日志输入导致,重启rsyslog释放后,haproxy日志成功恢复,但是此种方法需要重启rsyslog,且不易把握日志文件的割接时间。依照此解决思路,可以使用logroate的postrotate/endscript配置,可以在这两个配置参数中间添加重启rsyslog的命令,以实现日志的截断和后续日志写入新日志文件中。
配置示例:

cat /etc/logrotate.d/haproxy
/var/log/haproxy.log  {
	daily
	missingok
	rotate 10
	compress
	notifempty
    postrotate
      /etc/init.d/rsyslog restart
    endscript
}