HAProxy会话与静态页面配置问题:Jira/Confluence登录及CSS异常
嘿,你碰到的这俩问题都是HAProxy代理Atlassian产品时的常见坑,我结合你贴的配置来逐一给你解决思路和修改方案:
问题1:通过HAProxy登录管理员页面失败,直接访问后端正常
这个问题核心原因大概率是会话粘性的细节配置不到位或者请求头部传递不完整。虽然你已经加了cookie JSESSIONID prefix nocache来做会话绑定,但管理员页面的验证逻辑对会话一致性和请求上下文要求更高,另外Jira/Confluence会依赖Host头部生成正确的回调URL,要是HAProxy没传对这个头,登录验证就会失败。
给你的backend配置加两行,确保头部和客户端IP正确传递:
backend jira balance roundrobin cookie JSESSIONID prefix nocache option forwardfor # 把客户端真实IP传给后端,方便日志排查 http-request set-header Host %[req.hdr(Host)] # 保留原始请求的Host头,避免后端生成错误的回调地址 server jira1 [IP1]:8080 check cookie jira1 server jira2 [IP2]:8080 check cookie jira2 backend confluence balance roundrobin cookie JSESSIONID prefix nocache option forwardfor http-request set-header Host %[req.hdr(Host)] server confluence1 [IP3]:8090 check cookie confluence1 server confluence2 [IP4]:8090 check cookie confluence2
另外别忘了检查Jira/Confluence的基础URL设置!一定要把它们的基础URL改成HAProxy的负载均衡IP/域名,比如Jira设成http://[你的HAProxyIP]:8080,Confluence设成http://[你的HAProxyIP]:8090。不然管理员登录时的回调地址会指向后端服务器,直接导致验证失败。
问题2:通过HAProxy访问时CSS样式丢失,直接访问后端正常
看你的配置就发现问题了——静态资源相关的ACL和backend全被注释掉了!所有请求(包括CSS、图片这些静态资源)都走了默认的backend,这会导致两个问题:一是静态资源被绑定到特定会话的后端服务器,可能出现加载不一致;二是没有针对静态资源做优化,影响加载效率。
两种修复方案任你选:
方案1:启用单独的静态资源Backend(推荐)
把frontend里的静态资源ACL注释取消,再启用static backend,让静态资源单独走无会话粘性的负载均衡:
frontend jira bind :::8080 v4v6 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static # 匹配到静态资源就走static backend default_backend jira frontend confluence bind :::8090 v4v6 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js use_backend static if url_static default_backend confluence # 静态资源Backend,不需要会话绑定,直接轮询所有后端 backend static balance roundrobin server jira1 [IP1]:8080 check server jira2 [IP2]:8080 check server confluence1 [IP3]:8090 check server confluence2 [IP4]:8090 check http-response set-header Cache-Control "public, max-age=3600" # 给静态资源加缓存头,提升加载速度
方案2:跳过静态资源的会话粘性(简单快速)
如果不想单独搞static backend,也可以在frontend里给静态资源请求取消cookie绑定,让它们自由轮询后端:
frontend jira bind :::8080 v4v6 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js http-request unset-cookie JSESSIONID if url_static # 静态资源请求忽略会话cookie default_backend jira frontend confluence bind :::8090 v4v6 acl url_static path_beg -i /static /images /javascript /stylesheets acl url_static path_end -i .jpg .gif .png .css .js http-request unset-cookie JSESSIONID if url_static default_backend confluence
最后验证
改完配置后,别忘重新加载HAProxy:
systemctl reload haproxy
然后测试两个场景:
- 登录管理员页面,确认能正常进入后台
- 刷新Jira/Confluence主页,检查CSS样式和图片是否正常显示
内容的提问来源于stack exchange,提问作者rawmain

