我正在研究多种可能的负载平衡选项。
到目前为止,我仅限于以下选项:
DNS 服务器负载平衡器,平衡到一组 tomcat 服务器,使用 terracotta 进行会话复制。优点 - 不必购买新套件。缺点 - DNS lb 可以继续指向损坏的服务器。
硬件负载平衡器,直接到 tomcat 服务器集群。优点 - 可以有第二个盒子用于故障转移磅。缺点 - 费用。
Apache 服务器负载平衡器。优点 - apache 的 lb 轮询损坏的服务器。缺点 - apache 服务器是单点故障,另外需要购买另一台服务器。
还有其他我应该考虑的选择吗?
谢谢。
更新:感谢到目前为止的所有答案+1。尚未接受答案,以保持更多想法。
设置:
Fedora 8
Apache 2.2.8
Tomcat 5.5.8
Apache 使用 AJP 转发请求。
问题:
经过一段时间后(根本没有常数,可能在一两个小时之间,或者一天或几天之间)Tomcat 将关闭。它要么停止响应,要么提供通用的“服务暂时不可用”。
诊断:
有两台服务器的设置相同。一个是流量较高的网站(每秒几个请求),另一个是低流量网站(每隔几分钟就有几个请求)。这两个网站是完全不同的代码库,但它们表现出相似的问题。
在第一台服务器上,当问题发生时,所有线程都开始慢慢被占用,直到达到限制(MaxThreads 200)。那时服务器不再响应(并且在很长一段时间后出现服务不可用页面)。
在第二台服务器上,出现问题时,请求需要很长时间,完成后您只能看到服务不可用页面。
除了提到 MaxThreads 问题之外,Tomcat 日志没有指出可能导致此问题的任何特定问题。
但是,在 Apache 日志中,我们看到了涉及 AJP 的随机消息。这是我们看到的随机消息示例(无特定顺序):
[error] (70007)The timeout specified has expired: ajp_ilink_receive() can't receive header
[error] (104)Connection reset by peer: ajp_ilink_receive() can't receive header
[error] proxy: AJP: disabled connection for (localhost)
[error] ajp_read_header: ajp_ilink_receive failed
[error] (120006)APR does not understand this error code: proxy: read response failed from 127.0.0.1:8009 (localhost)
[error] ap_proxy_connect_backend disabling worker for (localhost)
Run Code Online (Sandbox Code Playgroud)
我们在更高流量的服务器上注意到的另一件奇怪的事情是,就在问题开始发生之前,数据库查询所用的时间比以前长得多(2000-5000 …
我已经安装了一个库存的 mysql 5.5 安装,虽然我可以通过 mysql 命令连接到 mysql 服务,并且该服务似乎正在运行,但我无法通过 spring+tomcat 或从外部 jdbc 连接器连接到它。
我正在使用以下网址:
jdbc:mysql://myserver.com:myport/mydb
Run Code Online (Sandbox Code Playgroud)
使用正确的用户名/密码,但我收到以下消息:
server.com: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. the driver has not received any packets from the server.
Run Code Online (Sandbox Code Playgroud)
和 tomcat 抛出:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
Run Code Online (Sandbox Code Playgroud)
这似乎与我尝试从外部连接相同的问题。
在OpenBSD 5.2,Tomcat的7.0.29默认安装的似乎是记录所有的错误到两个catalina.out及catalina.YYYY-MM-DD.log。
Cns# ll /var/tomcat/logs/catalina.*
-rw-r--r-- 1 _tomcat _tomcat 3067 Jan 16 20:47 /var/tomcat/logs/catalina.2013-01-16.log
-rw-r--r-- 1 _tomcat _tomcat 1313285 Jan 17 21:47 /var/tomcat/logs/catalina.2013-01-17.log
-rw-r--r-- 1 _tomcat _tomcat 19668 Jan 18 17:33 /var/tomcat/logs/catalina.2013-01-18.log
-rw-r--r-- 1 _tomcat _tomcat 2479 Jan 23 15:25 /var/tomcat/logs/catalina.2013-01-23.log
-rw-r--r-- 1 _tomcat _tomcat 1580 Jan 26 22:58 /var/tomcat/logs/catalina.2013-01-26.log
-rw-r--r-- 1 _tomcat _tomcat 48165 Jan 27 19:30 /var/tomcat/logs/catalina.2013-01-27.log
-rw-r--r-- 1 _tomcat _tomcat 34526 Jan 28 16:41 /var/tomcat/logs/catalina.2013-01-28.log
-rw-r--r-- 1 _tomcat _tomcat 141985 Jan 29 23:56 …Run Code Online (Sandbox Code Playgroud) 我正在尝试将我的 Apache Tomcat 服务器重新配置为仅使用 TLSv1。但是,它仍然使用某些浏览器回退到 SSLv3。
我使用以下设置设置了 <connector> 标签:
<Connector ...
enableLookups="true" disableUploadTimeout="true"
acceptCount="100" maxThreads="200"
scheme="https" secure="true" SSLEnabled="true"
clientAuth="false" sslProtocol="TLS" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA" sslEnabledProtocols="TLSv1" />
Run Code Online (Sandbox Code Playgroud)
我是否缺少配置设置或存在一些我不应该存在的东西?
在 Ubuntu 10.04.3 LTS 上,安装 Tomcat 6 后,添加 manager/admin 帐户的方法是将这样的记录添加到/etc/tomcat6/tomcat-users.xml:
<role rolename="manager"/>
<role rolename="admin"/>
<user username="user" password="password" roles="manager,admin"/>
Run Code Online (Sandbox Code Playgroud)
该密码是明文形式,我对此感到不舒服。有没有办法改用散列之类的东西?如果您有非 Ubuntu 解决方案,我可能可以翻译它。
我在 CentOS 上使用 Apache 2.2.15 为 TomCat 应用程序提供 SSL。
ProxyPass / http://127.0.0.1:8090/ connectiontimeout=300 timeout=300
ProxyPassReverse / http://127.0.0.1:8090
Run Code Online (Sandbox Code Playgroud)
这很好用,一切都很好;但是,我想添加以下行:
Redirect permanent /broken/page.html https://www.servername.com/correct/page.html
Run Code Online (Sandbox Code Playgroud)
在上面处理 TomCat 应用程序本身中的错误之前。然而,它似乎并没有像我期望的那样工作(即,它似乎什么都不做,什么也不改变)。是否可以以这种方式使用重定向?不幸的是,我无法编辑该应用程序。
很难理解 tomcat 文档,查看 server.xml 您会发现一堆可能难以理解的端口,因为文档中没有真正正确或广泛地解释它。
例如,配置文件中的这一行 server.xml
<Connector port="8345" protocol="AJP/1.3" redirectPort="9875" />
在这里你可以找到另一个重定向端口:
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
Run Code Online (Sandbox Code Playgroud)
我了解连接器端口的作用。在第一种情况下,您使用它在 apache 中创建一个工作程序并将其发送到那里,在第二种情况下,您打开一个端口以直接访问 tomcat。然而,当涉及到重定向端口时,事情就变得模糊了。
下面是 tomcat 文档对 ajp 端口的解释:
如果此连接器支持非 SSL 请求,并且收到匹配需要 SSL 传输的请求,Catalina 将自动将请求重定向到此处指定的端口号。
我总是选择一个超过 1024 的随机重定向端口,它可以工作,
但这什么时候会付诸实践呢?它如何知道请求何时需要 SSL 传输?
我有一个运行 tomcat 模块的卫星服务器。该模块通过将流量从主服务器重定向到带有 apache 的 ajp 连接器而生效,反之亦然。
在主服务器中,https 是在 apache 中强制执行的。这是否意味着所有请求都以加密或纯文本形式发送到卫星服务器?我知道如果我通过端口 8080 访问卫星服务器,它没有被加密,但我想知道这是否也适用于被重定向到主服务器的流量,以及这个重定向端口在哪里生效。
我观察到没有在 OS X 上安装 tomcat 的完整指南,其中包括将其设置为在启动时启动。
这是快速指南:
suport port upgradesudo port upgrade outdated.sudo port install tomcat6,或者如果你想要其他版本检查 port list|grep tomcat/opt/local/share/java/tomcat6/conf启动脚本: /opt/local/share/java/tomcat6/bin/tomcatctl
cp /opt/local/share/java/tomcat6/conf/tomcat-users.xml.sample /opt/local/share/java/tomcat6/conf/tomcat-users.xml nano /opt/local/share/java/tomcat6 /conf/tomcat-users.xml
...检查文章
但我错过了如何让它作为真正的服务/守护进程运行的部分:在系统启动时,如果它崩溃,可以选择让它重新启动。
我的 Tomcat 实例位于一个几乎没有剩余空间的驱动器上。我正在运行的应用程序确实将文件上传从服务器移到了 NAS。然而,在上传过程中,Tomcat 将这个文件保存在本地,大概在 /temp 目录中。
我的服务器有一个有足够空间的第二个数据驱动器,我想将这个临时目录重新定位到其中。我如何配置 Tomcat 以便它使用另一个驱动器上的临时目录,即。我怎样才能重新定位这个目录?
编辑:我正在运行 Windows 服务器 2k3。我尝试设置 CATALINA_TMPDIR 环境变量,但 Tomcat 似乎忽略了它。
解决方案:我正在使用通过的“Monitor Tomcat”应用程序
-Djava.io.tmpdir=C:\some\default\directory
到JVM。这覆盖了我正在设置的环境变量。您可以在Java > Java 选项下找到它
改变这一点已经解决了我的问题。