CGI脚本错误java RMI

CGI脚本错误java RMI,java,webserver,cgi,rmi,Java,Webserver,Cgi,Rmi,我正试图为我的RMI Web服务器设置一个cgi脚本,但它总是给我一个HTTP 500 我的CGI脚本如下所示 # This class will support a QUERY_STRING of the form "forward=<port>" # with a REQUEST_METHOD "POST". The body of the request will be # forwarded (as another POST request) to the server l

我正试图为我的RMI Web服务器设置一个cgi脚本,但它总是给我一个HTTP 500

我的CGI脚本如下所示

# This class will support a QUERY_STRING of the form "forward=<port>"
# with a REQUEST_METHOD "POST".  The body of the request will be
# forwarded (as another POST request) to the server listening on the
# specified port (must be >= 1024).  The response from this forwarded
# request will be the response to the original request.
#
# CONFIGURATION:
#
# Fill in correct absolute path to Java interpreter below.  For example,
# the "PATH=" line might be changed to the follow if the JDK is installed
# at the path "/home/peter/java":
#
# PATH=/home/peter/java/bin:$PATH
#
PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:$PATH
exec java \
        -DAUTH_TYPE="$AUTH_TYPE" \
        -DCONTENT_LENGTH="$CONTENT_LENGTH" \
        -DCONTENT_TYPE="$CONTENT_TYPE" \
        -DGATEWAY_INTERFACE="$GATEWAY_INTERFACE" \
        -DHTTP_ACCEPT="$HTTP_ACCEPT" \
        -DPATH_INFO="$PATH_INFO" \
        -DPATH_TRANSLATED="$PATH_TRANSLATED" \
        -DQUERY_STRING="$QUERY_STRING" \
        -DREMOTE_ADDR="$REMOTE_ADDR" \
        -DREMOTE_HOST="$REMOTE_HOST" \
        -DREMOTE_IDENT="$REMOTE_IDENT" \
        -DREMOTE_USER="$REMOTE_USER" \
        -DREQUEST_METHOD="$REQUEST_METHOD" \
        -DSCRIPT_NAME="$SCRIPT_NAME" \
        -DSERVER_NAME="$SERVER_NAME" \
        -DSERVER_PORT="$SERVER_PORT" \
        -DSERVER_PROTOCOL="$SERVER_PROTOCOL" \
        -DSERVER_SOFTWARE="$SERVER_SOFTWARE" \
        sun.rmi.transport.proxy.CGIHandler
在my error.log中,它显示:

"POST /cgi-bin/java-rmi.cgi?forward=1099 HTTP/1.1" 500 415 "-" "Java/1.7.0"
(104)Connection reset by peer: ap_content_length_filter: apr_bucket_read() failed
我使用的是
RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.rmichttpttogisocketfactory())强制Http到cgi

我不知道我做错了什么

我已将java-rmi.cgi文件放入/usr/lib/cgi-bin中/

我应该在脚本中添加其他内容吗

我得到的java错误是:

java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is: 
    java.io.IOException: HTTP request failed
编辑:访问我的cgi脚本作为它提供给我的网站(也许你不能这样做):

我将其跟踪到CGICommandHandler.java中,当处理程序为null时,它返回无效命令

这是我运行bash-x时的调试输出:

+ PATH=/usr/lib/jvm/java-7-openjdk-amd64/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+ exec java -DAUTH_TYPE= -DCONTENT_LENGTH= -DCONTENT_TYPE= -DGATEWAY_INTERFACE= -DHTTP_ACCEPT= -DPATH_INFO= -DPATH_TRANSLATED= -DQUERY_STRING= -DREM                     OTE_ADDR= -DREMOTE_HOST= -DREMOTE_IDENT= -DREMOTE_USER= -DREQUEST_METHOD= -DSCRIPT_NAME= -DSERVER_NAME= -DSERVER_PORT= -DSERVER_PROTOCOL= -DSERVER_S                     OFTWARE= sun.rmi.transport.proxy.CGIHandler
Status: 400 Bad Request: invalid command.
Content-type: text/html

<HTML><HEAD><TITLE>Java RMI Client Error</TITLE></HEAD><BODY>
<H1>Java RMI Client Error</H1>

invalid command.
</BODY></HTML>
正如你所看到的,我的很多字符串都是空的

编辑2:现在我的访问日志为我带来了以下内容:

"POST http://xx.xxx.xxx.xxx/cgi-bin/java-rmi.cgi?forward=1099 HTTP/1.1" 500 415 "-" "Java/1.7.0"
My tomcatlog gives me this: 
xx.xxx.x.xx - - [15/Nov/2013:13:32:14 +0000] "POST /rmi/ServletHandler?forward=1099 HTTP/1.1" 404 987
仍然是HTTP 500,我的错误日志给出了与以前相同的

编辑3:

我现在尝试实现java-rmi.cgi的servlet,但它给了我错误

我的http.conf如下所示:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

<Location /cgi-bin/java-rmi.cgi>
ProxyPass ajp://localhost:8009/rmi/ServletHandler
</Location>
<servlet>
<servlet-name>ServletHandler</servlet-name>
<servlet-class>ServletHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletHandler</servlet-name>
<url-pattern>/ServletHandler</url-pattern>
</servlet-mapping>
我的web.xml(在web\u INF中)如下所示:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

<Location /cgi-bin/java-rmi.cgi>
ProxyPass ajp://localhost:8009/rmi/ServletHandler
</Location>
<servlet>
<servlet-name>ServletHandler</servlet-name>
<servlet-class>ServletHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletHandler</servlet-name>
<url-pattern>/ServletHandler</url-pattern>
</servlet-mapping>
在http.conf中设置我的全局ip和端口80时出现错误日志:

[Fri Nov 15 08:13:26 2013] [error] [client xx.xxx.xxx.xxx] Invalid method in request \x124\x01\xb2\x02\x02
[Fri Nov 15 08:13:26 2013] [error] ajp_check_msg_header() got bad signature 3c21
[Fri Nov 15 08:13:26 2013] [error] ajp_ilink_receive() received bad header
[Fri Nov 15 08:13:26 2013] [error] ajp_read_header: ajp_ilink_receive failed
[Fri Nov 15 08:13:26 2013] [error] (120007)APR does not understand this error code: proxy: read response failed from (null) (xx.xxx.xxx.xxx)
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

<Location /cgi-bin/java-rmi.cgi>
ProxyPass ajp://localhost:8009/rmi/ServletHandler
</Location>
编辑4:

现在看起来是这样的:

LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

<Location /cgi-bin/java-rmi.cgi>
ProxyPass ajp://localhost:8009/rmi/ServletHandler
</Location>
<servlet>
<servlet-name>ServletHandler</servlet-name>
<servlet-class>ServletHandler</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletHandler</servlet-name>
<url-pattern>/ServletHandler</url-pattern>
</servlet-mapping>
web.xml:

  <servlet>
    <servlet-name>ServletHandler</servlet-name>
    <servlet-class>rmiservlethandler.ServletHandler</servlet-class>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    <servlet-name>ServletHandler</servlet-name>
    <url-pattern>/ServletHandler</url-pattern>
    </servlet-mapping>
全局ip的错误日志:

[Fri Nov 15 12:37:23 2013] [error] (110)Connection timed out: proxy: AJP: attempt to connect to xx.xxx.xxx.xxx:8009 (xx.xxx.xxx.xxx) failed
[Fri Nov 15 12:37:23 2013] [error] ap_proxy_connect_backend disabling worker for (xx.xxx.xxx.xxx)
[Fri Nov 15 12:37:23 2013] [error] proxy: AJP: failed to make connection to backend: xx.xxx.xxx.xxx
Tomcatlog告诉我:

"POST http://xx.xxx.xxx.xxx/cgi-bin/java-rmi.cgi?forward=1099 HTTP/1.1" 500 415 "-" "Java/1.7.0"
My tomcatlog gives me this: 
xx.xxx.x.xx - - [15/Nov/2013:13:32:14 +0000] "POST /rmi/ServletHandler?forward=1099 HTTP/1.1" 404 987
编辑5

没有工作,我为/rmi/ServletHandler得到了404

这是我的httpd.conf(taking away.cgi):

ProxyPassajp://localhost:8009/rmi/ServletHandler 

这是web.xml:

<?xml version="1.0" encoding="UTF-8"?> <web-app> <servlet> 
<servlet-name>ServletHandler</servlet-name> 
<servlet-class>rmiservlethandler.ServletHandler</servlet-class> 
<load-on-startup>1</load-on-startup> </servlet> 
<servlet-mapping> <servlet-name>ServletHandler</servlet-name> 
<url-pattern>/ServletHandler</url-pattern> 
</servlet-mapping> 
</web-app>

ServletHandler
rmiservlethandler.ServletHandler
1.
ServletHandler
/ServletHandler
文件夹设置现在是:

/var/lib/tomcat7/webapps/rmi/WEB\u-INF

WEB\u INF包含WEB.xml和class/rmiservlethandler/其中rmiservlethandler是所有类文件所在的位置(包结构)

为什么这不起作用

我的/usr/lib/cgi-bin/是空的,应该是对的吗

我的servlet没有运行。。。
谢谢

解决了它

我的文件夹设置是正确的(除了WEB-INF而不是WEB\U INF),问题是ServletHandler中的localhost地址没有正确解析(我的localhost名称不是localhost..)。 像WEB\U INF这样的东西应该是WEB-INF

下面给出了tomcat catalina.out和本地主机日志文件中的异常。 因此,如果您认为您的servlet运行正常,请查看是否存在异常。我用日志修改了我的ServletHandler,这样我就可以查看正在发生的一切

这是我在客户端发布的文章现在在tomcat日志中看到的内容:

xx.xxx.x.xx - - [18/Nov/2013:13:17:23 +0000] "POST /rmi/ServletHandler?forward=1099 HTTP/1.1" 200 1
我的http.conf:

[Fri Nov 15 08:13:26 2013] [error] [client xx.xxx.xxx.xxx] Invalid method in request \x124\x01\xb2\x02\x02
[Fri Nov 15 08:13:26 2013] [error] ajp_check_msg_header() got bad signature 3c21
[Fri Nov 15 08:13:26 2013] [error] ajp_ilink_receive() received bad header
[Fri Nov 15 08:13:26 2013] [error] ajp_read_header: ajp_ilink_receive failed
[Fri Nov 15 08:13:26 2013] [error] (120007)APR does not understand this error code: proxy: read response failed from (null) (xx.xxx.xxx.xxx)
LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so
LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so

<Location /cgi-bin/java-rmi.cgi>
ProxyPass ajp://localhost:8009/rmi/ServletHandler
</Location>
在类内部,您将与JavaIDE中相同的文件夹结构放在一起。 Web.xml应该放在Web-INF中

任何需要的库文件都应该放在WEB-INF/lib中

希望它能帮助别人


关于Gustav

java-rmi.cgi已经提供了,不是吗?您不必自己编写。但是您应该使用servlet版本。好吧,servlet不使用相同的文件吗?我的意思是,如果问题是http到cgi,servlet将无法解决它?但我将尝试实现servlet。否则这就是我的Apache配置。不,Servlet不使用同一个文件,它都是在Servlet内部完成的。它与JDK示例一起分发。然后我今天将尝试,谢谢!现在我已经实现了servlet。这就是我所做的(Se编辑3)