这里我们有一个在 wildfly 9 上运行的 WebService。该 Web 服务仅可通过 ssl(https)使用,并且需要客户端证书。
如果我们改变 wildfly 配置,wildfly 将直接与客户端通信(意味着:wildfly 将处理 https 连接并检查客户端证书),在我们的测试用例中,一个客户端每秒可以发出 12 到 15 个请求(包括获取服务器答案)。
但是,如果我们在 wildfly 前面放置一个 apache httpd(CentOS6 上的 V2.2)代理(它将处理 https SSL 内容并检查客户端证书),那么客户端(在同一个测试用例中)每秒只能发出 2 到 5 个请求。
httpd 代理的配置是:
Listen 58443
NameVirtualHost *:58443
<VirtualHost *:58443>
# server SSL settings
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder On
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES:RSA+3DES:!ADH:!AECDH:!MD5:!DSS
# Server Certificate:
SSLCertificateFile /etc/letsencrypt/live/mydomain.de/cert.pem
# Server Private Key:
SSLCertificateKeyFile /etc/letsencrypt/live/mydomain.de/privkey.pem
# Server Certificate Chain:
SSLCertificateChainFile /etc/letsencrypt/live/mydomain.de/chain.pem
Header always set Strict-Transport-Security "max-age=315360000"
# Client certifacte authentication
# Certificate Authority (CA):
SSLCACertificateFile /etc/pki/webapp/cacert.pem
SSLVerifyClient require
SSLVerifyDepth 2
# proxy stuff
<Proxy *>
AddDefaultCharset Off
Order Allow,Deny
Allow from all
</Proxy>
# proxy to wildfly instance
ProxyPass /myappSrv http://localhost:58080/myappSrv min=3 smax=5 ttl=600 iobuffersize=163840
# ProxyPass /myappSrv http://localhost:58080/myappSrv disablereuse=on
# ProxyPassReverse /myappSrv http://localhost:58080/myappSrv
</VirtualHost>
我们已经尝试了几个 httpd 配置值:
HostnameLookups
被设定为off
- 切换到“worker MPM ”并尝试几种设置(
MinSpareServers
,,,...)MaxSpareServers
ThreadsPerChild
AllowOverride
被设定为none
- 我们还尝试了 ProxyPass 参数(另请参阅注释掉 ProxyPass 行)
我们所做的一切都没有带来任何显著的改进。但我不敢相信当我们使用 httpd 代理时性能会如此糟糕。也不确定瓶颈是什么:httpd 代理?还是 httpd 的客户端证书检查?
答案1
我在 CentOS 7 上运行 Apache HTTPD 2.4 时遇到了与上述完全相同的问题。我的浏览器花了大约 1 秒钟等待索引页。切换到 nginx 后,加载时间降至 100 毫秒以下,应用程序突然变得非常快。
无论如何,如果出于某种原因您仍然需要使用 Apache HTTPD,则可以使用 nginx 作为它的反向代理。有很多指南。