我有一台 Openfire 内联网 XMPP 服务器(嗯,直到今天早上),它已经顺利运行了 370 天,没有被触碰过,总共运行了大约 3 年。用户在相邻的服务器上向 AD 进行身份验证,并按 OU 分成组。所有这些功能都运行良好。
我的问题是,服务今天早上崩溃了,当我尝试使用管理控制台确定问题所在时,我的助手收到“无 Java 堆空间”错误(没有屏幕截图,抱歉)。我们转到物理控制台并重新启动服务,它重新启动正常,或者至少没有明显的错误。
但是现在,尝试进入管理控制台时会弹出初始设置页面。我抱怨了一番,但还是找出了我的笔记并重新输入了所有 LDAP 信息和 DB 连接信息。我满意地点击了“登录管理控制台”按钮,然后等待……结果却返回到我刚刚离开的设置屏幕,询问我首选的系统语言是什么。所以:
MySQL 服务器正在运行,并且 /opt/openfire/conf/openfire.xml 文件中的连接信息正确。我使用该文件中的凭据查看 ofProperty 表来测试连接。检查 ofProperty 表的内容发现设置已保存在那里,包括所有 LDAP 信息、名称和其他字段、组定义等所有内容。但是Openfire 拒绝从数据库加载这些内容。
我已经检查过的内容:
- 检查 /var/log/messages 没有发现任何异常。
- MySQL 运行良好,能够从本地主机以及我的机器上的 MySQL 工作台建立连接。
- 我的磁盘使用了 3%。
- 内存不是问题,使用了0k交换。
- 这台机器只运行 openfire,没有其他任何功能。
- Netstat 仅显示 openfire 进程正在监听管理端口 9090 和 9091。
- 运行 ps 仅显示管理进程。
- 未安装任何更新。
- 未改变任何配置。
- 这台机器无法通过互联网访问,因此不太可能遭到黑客攻击。此外,也没有其他迹象表明存在黑客攻击。
编辑:日志剪辑显示连接被拒绝,但显然只发生在较早的时间:
2012.05.16 09:27:47 org.jivesoftware.database.DbConnectionManager - Unable to get a connection from the database pool (attempt 10 out of 10).
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.ConnectException
MESSAGE: Connection refused
STACKTRACE:
java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.logicalcobwebs.proxool.DefaultConnectionBuilder.buildConnection(DefaultConnectionBuilder.java:39)
at org.logicalcobwebs.proxool.Prototyper.buildConnection(Prototyper.java:159)
at org.logicalcobwebs.proxool.ConnectionPool.getConnection(ConnectionPool.java:211)
at org.logicalcobwebs.proxool.ProxoolDriver.connect(ProxoolDriver.java:89)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.jivesoftware.database.DefaultConnectionProvider.getConnection(DefaultConnectionProvider.java:86)
at org.jivesoftware.database.DbConnectionManager.getConnection(DbConnectionManager.java:124)
at org.jivesoftware.openfire.XMPPServer.verifyDataSource(XMPPServer.java:754)
at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:480)
at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:212)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:113)
at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:58)
** END NESTED EXCEPTION **
Last packet sent to the server was 1 ms ago.
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2847)
at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.logicalcobwebs.proxool.DefaultConnectionBuilder.buildConnection(DefaultConnectionBuilder.java:39)
at org.logicalcobwebs.proxool.Prototyper.buildConnection(Prototyper.java:159)
at org.logicalcobwebs.proxool.ConnectionPool.getConnection(ConnectionPool.java:211)
at org.logicalcobwebs.proxool.ProxoolDriver.connect(ProxoolDriver.java:89)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at org.jivesoftware.database.DefaultConnectionProvider.getConnection(DefaultConnectionProvider.java:86)
at org.jivesoftware.database.DbConnectionManager.getConnection(DbConnectionManager.java:124)
at org.jivesoftware.openfire.XMPPServer.verifyDataSource(XMPPServer.java:754)
at org.jivesoftware.openfire.XMPPServer.start(XMPPServer.java:480)
at org.jivesoftware.openfire.XMPPServer.<init>(XMPPServer.java:212)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.lang.Class.newInstance0(Unknown Source)
at java.lang.Class.newInstance(Unknown Source)
at org.jivesoftware.openfire.starter.ServerStarter.start(ServerStarter.java:113)
at org.jivesoftware.openfire.starter.ServerStarter.main(ServerStarter.java:58)
2012.05.16 09:27:48 org.jivesoftware.openfire.XMPPServer - Server halted
2012.05.16 09:36:34 org.jivesoftware.openfire.pubsub.PubSubModule - Publish-Subscribe domain: pubsub.cc.server.local
2012.05.16 09:36:36 org.jivesoftware.openfire.muc.spi.MultiUserChatServiceImpl - Multi User Chat domain: conference.cc.server.local
2012.05.16 09:37:48 org.jivesoftware.openfire.XMPPServer - Openfire 3.7.1 [May 16, 2012 9:37:48 AM]
2012.05.16 09:38:01 org.jivesoftware.openfire.container.AdminConsolePlugin - Admin console listening at:
http://127.0.0.1:9090
https://127.0.0.1:9091
2012.05.16 09:54:21 org.jivesoftware.openfire.XMPPServer - Server halted
2012.05.16 09:54:33 org.jivesoftware.openfire.XMPPServer - Openfire 3.7.1 [May 16, 2012 9:54:33 AM]
2012.05.16 09:54:46 org.jivesoftware.openfire.container.AdminConsolePlugin - Admin console listening at:
http://127.0.0.1:9090
https://127.0.0.1:9091
2012.05.16 10:07:24 org.jivesoftware.openfire.XMPPServer - Server halted
2012.05.16 10:07:37 org.jivesoftware.openfire.XMPPServer - Openfire 3.7.1 [May 16, 2012 10:07:37 AM]
2012.05.16 10:07:49 org.jivesoftware.openfire.container.AdminConsolePlugin - Admin console listening at:
http://127.0.0.1:9090
https://127.0.0.1:9091
2012.05.16 10:26:39 org.jivesoftware.openfire.XMPPServer - Server halted
2012.05.16 10:28:54 org.jivesoftware.openfire.XMPPServer - Openfire 3.7.1 [May 16, 2012 10:28:54 AM]
2012.05.16 10:29:10 org.jivesoftware.openfire.container.AdminConsolePlugin - Admin console listening at:
http://127.0.0.1:9090
https://127.0.0.1:9091
2012.05.16 10:33:25 org.jivesoftware.openfire.XMPPServer - Server halted
2012.05.16 10:33:38 org.jivesoftware.openfire.XMPPServer - Openfire 3.7.1 [May 16, 2012 10:33:38 AM]
2012.05.16 10:33:51 org.jivesoftware.openfire.container.AdminConsolePlugin - Admin console listening at:
http://127.0.0.1:9090
https://127.0.0.1:9091
2012.05.16 10:51:38 org.jivesoftware.openfire.XMPPServer - Server halted
2012.05.16 10:51:51 org.jivesoftware.openfire.XMPPServer - Openfire 3.7.1 [May 16, 2012 10:51:51 AM]
2012.05.16 10:52:04 org.jivesoftware.openfire.container.AdminConsolePlugin - Admin console listening at:
http://127.0.0.1:9090
https://127.0.0.1:9091
2012.05.16 10:53:01 org.jivesoftware.openfire.XMPPServer - Server halted
2012.05.16 10:53:35 org.jivesoftware.openfire.XMPPServer - Openfire 3.7.1 [May 16, 2012 10:53:35 AM]
2012.05.16 10:53:49 org.jivesoftware.openfire.container.AdminConsolePlugin - Admin console listening at:
http://127.0.0.1:9090
https://127.0.0.1:9091
那次失败之后,我尝试了各种方法重新配置并重新启动该服务,正如您所看到的,管理控制台出现了。
答案1
长话短说:查看了其他地方的另一个(正在运行的)安装。结果发现,在正在运行的安装<setup>
文件中有一个名为的值openfire.xml
,如下所示:
...(XML snipped)
<minConnections>5</minConnections>
<maxConnections>25</maxConnections>
<connectionTimeout>1.0</connectionTimeout>
</defaultProvider>
</database>
<setup>true</setup>
</jive>
openfire.xml
由于某种原因,我的设置行丢失了。
有趣的是,该文件归 root 所有,并且只能由 root 写入,因此在安装过程运行时,某个特权进程删除了该行(不知何故?),而显然保留了连接参数。但是,由于该文件只能由 root 写入,因此 JRE 运行的安装脚本无法写入该文件。另外,我是个白痴,在 Java 异常中错过了这一行:
java.io.IOException: XML properties file must be writable: openfire.xml
显然,它对安装过程的某些部分是可写的,但对其他部分则不是?我不知道。但如果其他人也遇到这个问题,希望他们能在这里找到答案。我能够通过将值添加<setup>
到 openfire.xml 来更正问题并让 Openfire 立即加载。