我需要做的是运行一个Java应用程序,它是Restlet的RESTful服务服务器端writetern。此服务将由另一个在Google App Engine上运行的应用程序调用。
由于GAE的限制,每个http调用仅限于使用HttpUrlConnection类的端口80和443(http和https)。因此,我必须在端口80或443上部署我的服务器端应用程序。
但是,由于应用程序在Ubuntu上运行,并且非root用户无法访问1024以下的端口,因此在运行应用程序时将抛出Access Denied异常。
我想到的解决方案包括:
将JRE的安全策略(位于/lib/security/java.policy中的文件)更改为grantjava.net.SocketPermission“* .80”“listen,connect,accept,resolve”权限。但是,既不使用命令行来包含此文件,也不会覆盖JRE的java.policy文件中的内容,同样的异常会不断出现。
尝试以root用户身份登录,但由于我不熟悉Unix,我不知道该怎么做。
我还没有尝试的另一个解决方案是将所有80的呼叫映射到更高的端口,如1234,然后我可以在1234上部署我的应用程序而没有问题,并且GAE调用发送请求到端口80.但是如何连接缺失的差距仍然是个问题。
目前我正在使用“黑客”方法,即将应用程序打包到jar文件中,并使用root权限运行jar文件。它现在可以工作,但在真实的部署环境中绝对不合适。
所以,如果有人对解决方案有任何了解,非常感谢!
答案 0 :(得分:6)
你可以使用iptables重定向这样的东西:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport http -j REDIRECT --to-ports 8080
使用以下命令使更改成为永久更改(重启后保留):
iptables-save
答案 1 :(得分:2)
解决方案1:它不会改变任何东西,这不是Java限制,它是阻止您使用特权端口号(端口低于1024)的操作系统。
解决方案2:不是一个好主意IMO,有充分的理由不以root身份运行流程。
解决方案3:使用setcap
或iptables
。请参阅this previous question。
答案 2 :(得分:1)
更简单的解决方案是在Apache httpd中设置反向代理,Ubuntu将从/etc/init.d在端口80上为您运行。
也有办法使用iptables,但我没有最近的个人经验。我现在有这样的代理服务器。