2010-03-15 91 views
6

我需要做的是运行一个Java应用程序,该应用程序是Restlet提供的一个RESTful服务服务器端书写器。此服务将由另一个在Google App Engine上运行的应用程序调用。在Ubuntu上使用Java应用程序打开端口80

由于GAE的限制,每个http调用都被限制到带有HttpUrlConnection类的端口80和443(http和https)。因此,我必须在端口80或443上部署我的服务器端应用程序。

但是,由于该应用程序在Ubuntu上运行,并且1024以下的端口不能被非root用户访问,因此拒绝访问当我运行我的应用程序时会抛出异常。

已进入我脑海的解决方案包括:

  1. 更改JRE,这是文件驻留在/lib/security/java.policy,以grantjava.net.SocketPermission的安全策略“ * .80“”listen,connect,accept,resolve“权限。但是,既不使用命令行来包含此文件,也不覆盖JRE的java.policy文件中的内容,同样的异常不断出现。

  2. 尝试以root用户身份登录,但由于我不熟悉Unix,我不知道该怎么做。

  3. 另一种解决办法我还没有尝试是将所有来电映射为80至1234更高的端口,然后我可以在1234部署我的应用程序没有问题,和GAE呼叫发送请求到端口80,但如何连接缺失的差距仍然是一个问题。

目前我使用的是“黑客”的方法,也就是将应用程序打包成一个jar文件,并运行须藤用root权限的jar文件。它现在可以工作,但绝对不适合真正的部署环境。

所以,如果任何人有任何关于解决方案的想法,非常感谢!

+0

在Ubuntu上,你可以通过运行sudo -i来登录,这会给你一个临时的,如果不是理想的解决方案。 – 2010-03-15 01:46:15

+1

实际上,需要在<1024端口上侦听的服务通常首先以root身份启动以获得必要的权限。但是,在打开端口后,他们通过执行一些Unix特定的系统调用将他们的用户ID更改为权限较低的用户。 Java不支持它,因为它必须独立于平台。然而,还有一些第三方库可以让你以可移植性为代价访问Unix/Linux系统API。如果您对此主题感兴趣,请查找“POSIX”和“Java”。 使用iptables转发当然是最好也是最简单的解决方案。 – 2010-03-15 03:48:06

+0

@ the-banana-king感谢您的提示,而且这真的很有帮助,因为我从来没有想过要从Java库中进行操作来处理unix系统。 – 2012-03-15 06:54:28

回答

2

解决方案1:它不会改变任何东西,这不是Java限制,它是阻止您使用特权端口号(低于1024的端口)的操作系统。

解决方案2:不是一个好主意IMO,有没有很好的理由不以root身份运行一个进程。

解决方案3:使用setcapiptables。请参阅this previous question

1

更简单的解决方案是在Apache httpd中设置一个反向代理,该代理将从/etc/init.d在端口80上为您运行。

还有一些使用iptables的方法,但我没有最近的个人经验。我现在有一个这样的代理服务器运行。

6

您可以用iptables使用这样的重定向:与

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport http -j REDIRECT --to-ports 8080 

永久更改(重启后仍然存在):

iptables-save 
相关问题