我正在尝试使用Apache 2.2和mod_jk建立一个带有2个实例的glassfish 4.0集群,以实现负载平衡。除了用于提供图像的servlet之外,一切都按预期工作。
当我在一个实例上访问这个servlet时,我得到了没有问题的图像内容(见下图)。
(遗憾的是,由于声誉不佳,我无法发布图片)
但是当我通过负载平衡访问这个servlet时,我会在内容上获得垃圾数据(见下图)。
(同样,我无法发布图像,但基本上图像的顶部是好的,但从中间到底部图像部分混合并且颜色异常)
我注意到这个问题不会发生在小图像上 - 高达10KB - 只是图像大于那个。
我还注意到另一个提供文本内容的servlet有一个类似的问题,但在这种情况下,servlet只发送文件的一部分,并且请求需要1.5分钟才能获得32.6 KB的响应(!?!? !?)
以下是负责提供图像内容的servlet代码的一部分:
try{
// Open streams.
input = new BufferedInputStream(new FileInputStream(fimage),
DEFAULT_BUFFER_SIZE);
output = new BufferedOutputStream(response.getOutputStream(),
DEFAULT_BUFFER_SIZE);
// Write file contents to response.
byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
int length;
while ((length = input.read(buffer)) > 0) {
output.write(buffer, 0, length);
}
output.flush();
}
} catch (Exception e) {
// Tratamento de erros
logger.log(Level.SEVERE, "Falha ao servir imagem", e);
try {
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
} catch (IOException ex) {
logger.log(Level.SEVERE, "Falha ao responder erro", ex);
}
} finally {
// Close stream
if (input != null)
try {
input.close();
} catch (IOException e) {
logger.log(Level.SEVERE, "Falha ao fechar input", e);
}
}
以下是httpd.conf上的条目
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkLogLevel debug
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
#HTTPS Configuration
JkExtractSSL On
JkHTTPSIndicator HTTPS
JkSESSIONIndicator SSL_SESSION_ID
JkCIPHERIndicator SSL_CIPHER
JkCERTSIndicator SSL_CLIENT_CERT
JkMount /olhameubebe/* loadbalancer
Listen 443
<VirtualHost _default_:443>
ServerAdmin some@email.com
DocumentRoot "Your Root folder location"
ServerName www.domain.com:443
ServerAlias domain.com:443
ErrorLog "logs/anyFile-error.log"
CustomLog "logs/anyFile-access.log" common
SSLEngine on
SSLCertificateFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/bin/server.crt"
SSLCertificateKeyFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/bin/server.key"
JkMount /olhameubebe/* loadbalancer
</VirtualHost>
worker.properties文件看起来像
# Define 1 real worker using ajp13
worker.list=worder1,worker2,loadbalancer
# Set properties for worker1 (ajp13)
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=28080
worker.worker1.socket_keepalive=0
# Set properties for worker2 (ajp13)
worker.worker2.type=ajp13
worker.worker2.host=localhost
worker.worker2.port=28081
worker.worker2.socket_keepalive=0
# Set properties for loadbalancer
worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=worker1,worker2
worker.loadbalancer.sticky_session=1
我在Windows上进行此测试,但在日志文件中没有看到任何错误/警告。
有没有人知道我做错了什么?
提前致谢!
有没有人知道出了什么问题?
*编辑:
经过大量的尝试和实验后,看起来问题在我从响应标题中删除“Content-Length”后解决了。
所以我只需要从servlet的代码中注释这一行:
//response.setHeader("Content-Length", String.valueOf(fimage.length()));
答案 0 :(得分:0)
经过大量的尝试和实验后,看起来问题在我从响应标题中删除“Content-Length”后解决了。
所以我只需要从servlet的代码中注释这一行:
//response.setHeader("Content-Length", String.valueOf(fimage.length()));