旧项目之殇
Apache+resin
机房迁移接近尾声,遇到一个老的项目,一个Java服务运行在resin(服务监听在srun端口)中,前面有一层Apache,提供一个ldap认证,类似于下图的这种部署(十多年也是行业通用的部署方式了):

srun是resin自己的一个协议起的端口,可以用resin的hmux协议通过apache/nginx代理到resin,这个协议是二进制的,可以保留用户的原始ip,也不用解析http,性能较直接用http好一些。
迁移后换成http协议,打开页面提示500错误,提示Cant find AUTHENTICATE_UID field in header,如下图:

排查项目代码,可以看到这个异常是从请求的header中无法拿到AUTHENTICATE_UID导致的

解决异常
1、使用srun的部署方式
使用Apache+resin方式,由于项目太老了,yum安装的Apache没有支持mod_caucho.so模块(Apache’s Location and SetHandler directives send requests to Resin. The mod_caucho handler is caucho-request.)。
从之前的项目机器的Apache目录中复制mod_caucho.so到/etc/httpd/modules/mod_caucho.so 下,在模块加载的配置文件中做一下引入LoadModule caucho_module modules/mod_caucho.so,如下图:

使用旧的Apache ldap和web配置方式,启动后,项目可以正常进入,如下图:

2、使用http的部署方式
既然知道异常的原因是header头中无法拿到AUTHENTICATE_UID,排查一下Apache 如何从ldap中拿uid(https://galaxyproject.org/admin/config/apache-external-user-auth/),使用的是mod_authnz_ldap模块

参照官方文档,我们改一下RequestHeader set AUTHENTICATE_UID %{AUTHENTICATE_uid}e,去掉caucho配置,如下图:

换成http方式连接,重启Apache后,打开服务url,一切正常

写在最后
旧的没有人维护但是还不能停的项目在迁移过程中优先保证原封不动“撸”过去,然后慢慢更换新的部署方式,深入了解出现异常背后的原因,总结解决的方法经验,日积月累!~