То, что я должен сделать, запускает JAVA-приложение, которое является УСПОКОИТЕЛЬНОЙ сервисной стороной сервера writtern Restlet. И этот сервис назовет другое приложение, работающее на Google App Engine.
Из-за ограничения GAE каждый вызов http ограничен для портирования 80 и 443 (http и https) с классом HttpUrlConnection. В результате я должен развернуть свое серверное приложение на порте 80 или 443.
Однако, потому что приложение работает на Ubuntu, и к тем портам под 1 024 не может получить доступ некорневой пользователь, затем исключение Доступа запрещен будет выдано, когда я запущу свое приложение.
Решения, которые вошли в мой ум, включают:
Изменение политики безопасности JRE, который является файлами, находится в/lib/security/java.policy к grantjava.net. SocketPermission "*.80" "слушает, соединяет, принимает, твердость" permission。However, никакая командная строка использования для включения этого файла, или переопределяет содержание в java.policy файле JRE, то же исключение продолжает выходить.
попытайтесь войти в систему как пользователь root, однако потому что мое отсутствие близости с Unix, я не знаю, как сделать это.
другое решение у меня нет попытки, состоит в том, чтобы отобразить все вызовы на 80 к более высокому порту как 1234, затем я могу развернуть свое приложение на 1234 без проблемы, и вызов GAE отправляет запрос для портирования 80. Но как соединиться, недостающий разрыв является все еще проблемой.
В настоящее время я использую метод "взламывания", который должен упаковать приложение в файл банки и sudo выполнение файла банки с полномочием пользователя root. Это работает теперь, но определенно не соответствующее в реальной среде развертывания.
Таким образом, если у кого-либо есть какая-либо идея о решении, спасибо очень много!
Решение 1. Это ничего не изменит, это не ограничение Java, это ОС, которая не позволяет использовать привилегированные номера портов (порты ниже 1024).
Решение 2: Не лучшая идея, IMO, есть веские причины не запускать процесс от имени пользователя root.
Решение 3. Используйте setcap
или iptables
. См. предыдущий вопрос .
Намного более простым решением является установка обратного прокси-сервера в Apache httpd, который Ubuntu будет запускать для вас через порт 80 из /etc/init.d.
Есть также способы добраться сюда с помощью iptables, но у меня нет недавнего личного опыта. У меня сейчас такой прокси работает.
Вы можете использовать iptables для перенаправления, используя что-то вроде этого:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport http -j REDIRECT --to-ports 8080
Сделайте изменения постоянными (сохранятся после перезагрузки) с помощью:
iptables-save