2010-03-15 129 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 
相關問題