2010-03-15 4 views
6

Что мне нужно сделать, это запустить приложение Java, которое является ссылкой на сервер службы RESTful от Restlet. И эта услуга будет вызвана другим приложением, работающим в Google App Engine.Открытие порта 80 с Java-приложением на Ubuntu

Из-за ограничения GAE каждый HTTP-вызов ограничивается портами 80 и 443 (http и https) с классом HttpUrlConnection. В результате мне нужно развернуть приложение на стороне сервера на порту 80 или 443.

Однако, поскольку приложение работает на Ubuntu, а для тех портов под 1024 не может быть доступен пользователь без полномочий root, тогда Access Denied исключение будет выбрано при запуске моего приложения.

Решения, которые приходят в мой разум включает в себя:

  1. Изменение политики безопасности JRE, что файлы находятся в /lib/security/java.policy, чтобы grantjava.net.SocketPermission " * .80 "" слушать, подключаться, принимать, разрешать "разрешение. Однако, не используя командную строку для включения этого файла или переопределяя содержимое в файле java.policy JRE, такое же исключение продолжает выходить.

  2. попытайтесь войти в систему как пользователь root, однако из-за моей незнакомости с Unix я не знаю, как это сделать.

  3. еще одно решение, которое я не пытался, - сопоставить все вызовы с 80 до более высокого порта, такого как 1234, после чего я смогу развернуть мое приложение на 1234 без проблем, а запрос отправки запроса GAE на порт 80. Но как подключиться недостающий пробел по-прежнему остается проблемой.

В настоящее время я использую «взлом» метод, который должен упаковать приложение в файл банка, и Судо запустив файл банки с корневой привилегией. Он работает сейчас, но определенно не подходит в реальной среде развертывания.

Так что если кто-нибудь хоть подумает о решении, спасибо большое!

+0

На ubuntu вы можете войти в систему как пользователь root, запустив 'sudo -i', который даст вам временное, если не идеальное решение. – 2010-03-15 01:46:15

+1

На самом деле, услуги, которые необходимо прослушивать в портах <1024, обычно начинаются с имени root, чтобы получить необходимые разрешения. Однако после открытия портов они меняют свой идентификатор пользователя на менее привилегированный, выполняя некоторые системные вызовы, специфичные для Unix. Java не поддерживает это, поскольку он должен быть независимым от платформы. Тем не менее, есть некоторые сторонние библиотеки, которые предоставят вам доступ к системному API Unix/Linux за счет переносимости. Ищите «POSIX» и «Java», если вас интересует эта тема. Экспедирование с использованием iptables, конечно же, является предпочтительным и самым простым решением. –

+0

@ the-banana-king Спасибо за ваш совет, и да, это действительно полезно, поскольку я никогда не думал о том, чтобы делать что-то из Java lib, чтобы манипулировать на Unix-системах. –

ответ

2

Решение 1: не изменится что-то, это не ограничение Java, это ОС, которая мешает вам использовать привилегированные номера портов (порты ниже 1024).

Решение 2: Неплохая идея ИМО, есть веские причины не запускать процесс как корень.

Решение 3: Использовать setcap или iptables. См. this previous question.

1

Гораздо проще решить установить обратный прокси-сервер в Apache httpd, который Ubuntu будет запускать для вас на порту 80 из /etc/init.d.

Есть также способы получить здесь с iptables, но у меня нет недавнего личного опыта. Сейчас у меня такой прокси-сервер.

6

Вы можете использовать IPTables для перенаправления, используя что-то вроде этого:

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

сделать изменения постоянными (упорствовать после перезагрузки) с:

iptables-save