Lo que tengo que hacer es ejecutar una aplicación Java que sea un servidor de servicio RESTful escrito por Restlet. Y este servicio será llamado por otra aplicación que se ejecute en Google App Engine.Apertura del puerto 80 con la aplicación Java en Ubuntu
Debido a la restricción de GAE, cada llamada http está limitada al puerto 80 y 443 (http y https) con la clase HttpUrlConnection. Como resultado, tengo que implementar mi aplicación del lado del servidor en el puerto 80 o 443.
Sin embargo, como la aplicación se está ejecutando en Ubuntu, y los puertos menores de 1024 no pueden ser accedidos por usuarios no root, se niega el acceso. se lanzará una excepción cuando ejecute mi aplicación.
Las soluciones que han entrado en mi mente incluye:
Cambio de la política de seguridad del JRE, que es los archivos reside en /lib/security/java.policy, a grantjava.net.SocketPermission " * .80 "permiso de" escuchar, conectar, aceptar, resolver ". Sin embargo, ni usar la línea de comando para incluir este archivo ni anular el contenido en el archivo java.policy de JRE, la misma excepción sigue apareciendo.
intento iniciar sesión como usuario root, sin embargo, debido a mi falta de familiaridad con Unix, no sé cómo hacerlo.
otra solución que no he intentado es asignar todas las llamadas a 80 a un puerto superior como 1234, luego puedo implementar mi aplicación en 1234 sin problemas y GAE llamar solicitud de envío al puerto 80. Pero cómo conectar la brecha que falta sigue siendo un problema.
Actualmente estoy usando un método de la "piratería", que consiste en empaquetar la aplicación en un archivo JAR, y sudo ejecuta el archivo jar con privilegios de root. Funciona ahora, pero definitivamente no es apropiado en el entorno de implementación real.
Si alguien tiene alguna idea sobre la solución, ¡muchas gracias!
En ubuntu puede iniciar sesión como root ejecutando 'sudo -i' que le dará una solución provisional, si no la ideal. –
En realidad, los servicios que necesitan escuchar en puertos <1024 generalmente se inician como root al principio para obtener los permisos necesarios. Sin embargo, después de haber abierto los puertos, cambian su ID de usuario a una menos privilegiada haciendo algunas llamadas al sistema específicas de Unix. Java no es compatible ya que tiene que ser independiente de la plataforma. Sin embargo, hay algunas librerías de terceros que le darán acceso a la API del sistema Unix/Linux a costa de la portabilidad. Busque "POSIX" y "Java" si le interesa este tema. Reenviar con iptables, por supuesto, es la solución preferible y más simple. –
@ the-banana-king Gracias por su consejo, y sí, es realmente útil, ya que nunca había pensado en hacer cosas de Java lib para manipular en sistemas Unix. –