<commit_before>## VII. Asignación de puertos
### Publicar servicios mediante asignación de puertos

Las aplicaciones web a menudo se ejecutan mediante contenedores web. Por ejemplo, las aplicaciones PHP se pueden ejecutar como módulos del [HTTPD de Apache](http://httpd.apache.org/), y las aplicaciones Java en [Tomcat](http://tomcat.apache.org/).

**Las aplicaciones "twelve factor" son completamente auto-contenidas** y no dependen de un servidor web en ejecución para crear un servicio web público. Una aplicación web **usa HTTP como un servicio al que se le asigna un puerto**, y escucha las peticiones que recibe por dicho puerto.

En un entorno local de desarrollo, el desarrollador usa una URL del servicio como `http://localhost:5000/` para acceder al servicio que ofrece una aplicación. En la fase de despliegue, existe una capa de enrutamiento que se encarga de que las peticiones que llegan a una ruta pública se redirija hacia el proceso web que tiene asignado en su puerto correspondiente.

Normalmente se implementa usando una [declaracion de dependencias](./dependencies) para incluir librerías en las aplicaciones web, como en [Tornado](http://www.tornadoweb.org/) para Python, [Thin](http://code.macournoyer.com/thin/) para Ruby, o [Jetty](http://jetty.codehaus.org/jetty/) para Java y otros lenguajes basados en la Maquina Virtual de Java (JVM). Esto ocurre completamente en el *espacio del usuario*, es decir, dentro del código de la aplicación. El contrato con el entorno de ejecución obliga a un puerto a servir peticiones.

HTTP no es el único servicio que usa la asignación de puertos. Lo cierto es que cualquier servicio puede ejecutarse mediante un proceso al que se le asigne un puerto y que espere peticiones. Entre otros ejemplos podemos encontrar [ejabberd](http://www.ejabberd.im/) (que usa [XMPP](http://xmpp.org/)), y [Redis](http://redis.io/) (que usa [el protocolo Redis](http://redis.io/topics/protocol)).

También es cierto que la aproximación de asignación de puertos ofrece la posibilidad de que una aplicación puede llegar a ser un [servicio de respaldo](./backing-services) para otra aplicación, usando la URL de la aplicación de respaldo como un recurso declarado en la [configuración](./config) de la aplicación consumidora.<commit_msg>First review for port-binding<commit_after>## VII. Asignación de puertos
### Publicar servicios mediante asignación de puertos

A menudo, las aplicaciones web, se ejecutan mediante contenedores web. Por ejemplo, las aplicaciones de PHP se suelen ejecutar como módulos del [HTTPD de Apache](http://httpd.apache.org/), y las aplicaciones Java en [Tomcat](http://tomcat.apache.org/).

**Las aplicaciones "twelve factor" son completamente auto-contenidas** y no dependen de un servidor web en ejecución para crear un servicio web público. Una aplicación web **usa HTTP como un servicio al que se le asigna un puerto**, y escucha las peticiones que recibe por dicho puerto.

En los entornos de desarrollo, los desarrolladores usan una URL del servicio (por ejemplo `http://localhost:5000/`), para acceder al servicio que ofrece la aplicación. En la fase de despliegue, existe una capa de enrutamiento que se encarga de que las peticiones que llegan a una dirección pública se redirijan hacia el proceso web que tiene asignado su puerto correspondiente.

Ésto se implementa, normalmente, usando una [declaracion de dependencias](./dependencies) donde se incluyen librerías de las aplicaciones web, como [Tornado](http://www.tornadoweb.org/) para Python, [Thin](http://code.macournoyer.com/thin/) para Ruby, o [Jetty](http://jetty.codehaus.org/jetty/) para Java y otros lenguajes basados en la Maquina Virtual de Java (JVM). Ésto ocurre totalmente en el *entorno del usuario*, es decir, dentro del código de la aplicación. El contrato con el entorno de ejecución obliga al puerto a servir las peticiones.

HTTP no es el único servicio que usa asignación de puertos. La verdad, es que cualquier servicio puede ejecutarse mediante un proceso al que se le asigna un puerto y queda a la espera de peticiones. Entre otros ejemplos podemos encontrar [ejabberd](http://www.ejabberd.im/) (que usa [XMPP](http://xmpp.org/)), y [Redis](http://redis.io/) (que usa [el protocolo Redis](http://redis.io/topics/protocol)).

También es cierto que la aproximación de asignación de puertos ofrece la posibilidad de que una aplicación pueda llegar a ser un ["backing service"](./backing-services) para otra aplicación, usando la URL de la aplicación correspondiente como un recurso declarado en la [configuración](./config) de la aplicación que consume este "backing service".
{'fraction_non_alphanumeric': 0.07582631237848347, 'fraction_numerical': 0.0017282350399654353, 'mean_word_length': 4.905612244897959, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 4, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7360202', 'n_tokens_mistral': 1444, 'n_tokens_neox': 1425, 'n_words': 629}