在安装apache ftpserver后作为系统服务启动时遇到不能启动成功的问题,在网上各种搜索,发现很多人也遇到了同样的问题,折腾了1天,尝试了添加dll动态链接库、tomcat.exe替换ftpd.exe等还是没搞定。
最后查看服务安装脚本service.bat,发现问题所在,现记录下过程中遇到的坑,分享出来参考,避免其他朋友踩坑。
先总结如下几点关键:
(1):在使用jdk的java虚拟机情况下,apache ftpserver安装为系统服务时,需要注意修改service.bat脚本文件中java虚拟机的路径位置,
不修改的话会去找jre下的java虚拟机。当然,如果本来就使用的是jre,就不用修改了。
(2):启动服务时报不是有效的32位程序的错误,就需要用tomcat的执行文件修改位为同名文件进行替换。
(3):注意,安装脚本service.bat需要在管理权限的cmd下执行,同样ftpdw.exe服务管理程序也需要管理权才能执行。
(4):service.bat脚本在设置jvm时还可以再优化,在找不到jre情况下,可以查找jdk的路径,如果还是找不到,再设置为auto,并给出警告。
下面详细说明安装过程和分析过程:
本人操作系统为win10 64位。java安装的jdk19,不是jre。
apache ftpserver的下载安装就不多说了,直接到官网https://mina.apache.org/ftpserver-project下载apache ftpserver 1.2.0,解压。
基本操作步骤:
1、修改res/conf/下的ftpd-typical.xml文件内容,修改port=“21”,增加encrypt-passwords="clear",保证读取users.properties中的用户密码为明文密码,
如果不增加encrypt-passwords设置的话,读取的密码就不是明文密码,实际上是用MD5对密码哈希后的密文。
1 <server xmlns="http://mina.apache.org/ftpserver/spring/v1" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation=" 4 http://mina.apache.org/ftpserver/spring/v1 https://mina.apache.org/ftpserver-project/ftpserver-1.0.xsd 5 " 6 id="myServer"> 7 <listeners> 8 <nio-listener name="default" port="21"> 9 <ssl> 10 <keystore file="./res/ftpserver.jks" password="password" /> 11 </ssl> 12 </nio-listener> 13 </listeners> 14 <file-user-manager file="./res/conf/users.properties" encrypt-passwords="clear"/>
15 </server>
2、修改users.properties文件中用户名、密码及homedirectory路径:
结合1中增加的encrypt-passwords="clear",这里用户a的密码就是a,如果没有增加encrypt-passwords="clear",
则这里的userpassword就必须是真实密码进行md5计算得到的16字节串。
ftpserver.user.a.userpassword=a
ftpserver.user.a.homedirectory=G:/ftpdir
ftpserver.user.a.enableflag=true
ftpserver.user.a.writepermission=true
ftpserver.user.a.maxloginnumber=0
ftpserver.user.a.maxloginperip=0
ftpserver.user.a.idletime=0
ftpserver.user.a.uploadrate=0
ftpserver.user.a.downloadrate=0
ftpserver.user.anonymous.userpassword=
ftpserver.user.anonymous.homedirectory=./res/home
ftpserver.user.anonymous.enableflag=true
ftpserver.user.anonymous.writepermission=false
ftpserver.user.anonymous.maxloginnumber=20
ftpserver.user.anonymous.maxloginperip=2
ftpserver.user.anonymous.idletime=300
ftpserver.user.anonymous.uploadrate=4800
ftpserver.user.anonymous.downloadrate=4800
3、先用ftpd.bat直接简单验证独立服务能启动成功,登录也正常,然后ctrl+c终止服务。
F:\mytool\server\apache-ftpserver-1.2.0\bin>ftpd.bat res\conf\ftpd-typical.xml Using XML configuration file res\conf\ftpd-typical.xml... FtpServer started Stopping server... 终止批处理操作吗(Y/N)? Y F:\mytool\server\apache-ftpserver-1.2.0\bin>
4、安装为windows系统服务:
a)执行service.bat install ftpd res/conf/ftpd-typical.xml安装ftpserver为系统服务:
F:\mytool\server\apache-ftpserver-1.2.0\bin>service.bat install ftpd res/conf/ftpd-typical.xml Installing the service 'ftpd' ... Using FTPD_HOME: F:\mytool\server\apache-ftpserver-1.2.0 Using JAVA_HOME: C:\Program Files\Java\jdk-19 Using JVM: auto start start;res/conf/ftpd-typical.xml start;res/conf/ftpd-typical.xml The service 'ftpd' has been installed. F:\mytool\server\apache-ftpserver-1.2.0\bin>
如上,提示ftpd服务安装成功后,在bin路径下找到ftpdw.exe以管理权限执行,结果服务启动失败;到系统服务下找到Apache FtpServer ftpd,启动也失败:
查看日志信息如下,返回creating java失败:
[2023-11-22 23:00:22] [info] Running Service... [2023-11-22 23:00:22] [info] Starting service... [2023-11-22 23:00:22] [947 prunsrv.c] [error] Failed creating java [2023-11-22 23:00:22] [1202 prunsrv.c] [error] ServiceStart returned 1 [2023-11-22 23:00:22] [info] Run service finished.
b)遇到问题后,本来以为前面安装服务时输出信息中“Using JVM: auto”是正确的,可以自动查找java虚拟机,结果阅读service.bat脚本时发现,
只有在这个%JAVA_HOME%\bin\jre\server\jvm.dll找不到的情况下才会设置为auto,而这个路径下包含了jre子路径,实际我的环境中并没有安装jre,
用的是jdk,因此安装服务时会设置虚拟机为auto,实际上auto表示没有找到虚拟机。因此导致“Failed creating java”报错,如下:
set PR_DESCRIPTION=Apache FtpServer (http://mina.apache.org/ftpserver/) set PR_INSTALL=%EXECUTABLE% set PR_LOGPATH=%FTPD_LOGPATH% set PR_CLASSPATH=%FTPD_CLASSPATH% rem Set the server jvm from JAVA_HOME set PR_JVM=%JAVA_HOME%\bin\jre\server\jvm.dll if exist "%PR_JVM%" goto foundJvm rem Set the client jvm from JAVA_HOME set PR_JVM=%JAVA_HOME%\jre\bin\client\jvm.dll if exist "%PR_JVM%" goto foundJvm set PR_JVM=auto :foundJvm echo Using JVM: %PR_JVM%
c)根据我系统中java虚拟机的实际位置,将脚本中的jre去掉,如下
set PR_DESCRIPTION=Apache FtpServer (http://mina.apache.org/ftpserver/) set PR_INSTALL=%EXECUTABLE% set PR_LOGPATH=%FTPD_LOGPATH% set PR_CLASSPATH=%FTPD_CLASSPATH% rem Set the server jvm from JAVA_HOME set PR_JVM=%JAVA_HOME%\bin\server\jvm.dll if exist "%PR_JVM%" goto foundJvm rem Set the client jvm from JAVA_HOME set PR_JVM=%JAVA_HOME%\jre\bin\client\jvm.dll if exist "%PR_JVM%" goto foundJvm set PR_JVM=auto :foundJvm echo Using JVM: %PR_JVM%
卸载服务后,重新安装一次,java虚拟机的位置就正确了
F:\mytools\server\apache-ftpserver-1.2.0\bin>service.bat remove ftpd
The service 'ftpd' has been removed
F:\mytool\server\apache-ftpserver-1.2.0\bin>service.bat install ftpd res/conf/ftpd-typical.xml Installing the service 'ftpd' ... Using FTPD_HOME: F:\mytool\server\apache-ftpserver-1.2.0 Using JAVA_HOME: C:\Program Files\Java\jdk-19 Using JVM: C:\Program Files\Java\jdk-19\bin\server\jvm.dll start start;res/conf/ftpd-typical.xml start;res/conf/ftpd-typical.xml The service 'ftpd' has been installed. F:\mytool\server\apache-ftpserver-1.2.0\bin>
d)再次用ftdw.exe启动服务,或在命令行用net start ftpd,还是启动失败,查看日志提示“ %1 不是有效的 Win32 应用程序”,如下:
[2023-11-23 09:15:51] [info] Running Service...
[2023-11-23 09:15:52] [info] Starting service...
[2023-11-23 09:15:52] [174 javajni.c] [error] %1 不是有效的 Win32 应用程序。
[2023-11-23 09:15:52] [947 prunsrv.c] [error] Failed creating java C:\Program Files\Java\jdk-19\bin\server\jvm.dll
[2023-11-23 09:15:52] [1202 prunsrv.c] [error] ServiceStart returned 1
[2023-11-23 09:15:52] [info] Run service finished.
[2023-11-23 09:15:52] [info] Procrun finished.
5、结合网上搜索的帖子,说ftpd.exe只是一个服务外壳,在64位系统下存在问题,需要用tomcat6.exe修改位ftpd.exe,然后替换掉
ftpd.exe,于是下载tomcat7.exe进行替换后重新启动服务,终于启动成功!!!,后续尝试用tomcat10的,也可以启动成功,自此,
apache ftpserve的服务问题解决。
标签:PR,service,ftpd,ftpserver,user,apache,服务器 From: https://www.cnblogs.com/dingbj/p/apache_ftpserver.html