|
| 1 | +# Despliegue con Nginx |
| 2 | + |
| 3 | +Nginx es un servidor y proxy HTTP extremadamente rápido, confiable, y fácil de configurar. Aunque Vapor soporta servir peticiones HTTP con o sin TLS directamente, hacer un proxy con Nginx puede proporcionar un aumento en rendimiento, seguridad y facilidad de uso. |
| 4 | + |
| 5 | +!!! note "Nota" |
| 6 | + Recomendamos hacer un proxy de los servidores HTTP de Vapor con Nginx. |
| 7 | + |
| 8 | +## Descripción |
| 9 | + |
| 10 | +¿Qué significa poner un proxy a un servidor HTTP? En pocas palabras, un proxy actúa como un intermediario entre el Internet público y tu servidor HTTP. Las peticiones llegan al proxy y éste las envía a Vapor. |
| 11 | + |
| 12 | +Una propiedad importante de este proxy intermediario es que puede alterar e inclusive redirigir las peticiones. Por ejemplo, el proxy puede requerir que el cliente use TLS (https), limitar la tasa de peticiones e incluso servir ficheros públicos sin comunicarse con tu aplicación de Vapor. |
| 13 | + |
| 14 | + |
| 15 | + |
| 16 | +### Más Detalles |
| 17 | + |
| 18 | +El puerto por defecto para recibir peticiones HTTP es el puerto `80` (y `443` para HTTPS). Cuando enlazas un servidor de Vapor al puerto `80`, recibirá y responderá directamente a las peticiones HTTP que lleguen a tu servidor. Cuando añades un proxy como Nginx, enlazas Vapor a un puerto interno, como el puerto `8080`. |
| 19 | + |
| 20 | +!!! note "Nota" |
| 21 | + Puertos mayores que no necesitan `sudo` para enlazarse. |
| 22 | + |
| 23 | +Cuando Vapor está enlazado a otro puerto además de `80` o `443`, no será accesible para el Internet externo. Entonces enlazas Nginx al puerto `80` y lo configuras para que enrute las peticiones a tu servidor de Vapor enlazado en el puerto `8080` (o el que hayas elegido). |
| 24 | + |
| 25 | +Y eso es todo. Si Nginx está configurado correctamente, verás que tu aplicación de Vapor responde a las peticiones en el puerto `80`. Nginx actúa como proxy ante las peticiones y responde de manera invisible. |
| 26 | + |
| 27 | +## Instalar Nginx |
| 28 | + |
| 29 | +El primer paso es instalar Nginx. Una de las mejores cosas de Nginx es la enorme cantidad de recursos de la comunidad y documentación que tiene. Por ello, no entraremos en detalle sobre cómo instalar Nginx, pues seguramente hay un tutorial para tu plataforma, sistema operativo y proveedor. |
| 30 | + |
| 31 | +Tutoriales: |
| 32 | + |
| 33 | +- [How To Install Nginx on Ubuntu 20.04](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-20-04) |
| 34 | +- [How To Install Nginx on Ubuntu 18.04](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04) |
| 35 | +- [How to Install Nginx on CentOS 8](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-8) |
| 36 | +- [How To Install Nginx on Ubuntu 16.04](https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-16-04) |
| 37 | +- [How to Deploy Nginx on Heroku](https://blog.codeship.com/how-to-deploy-nginx-on-heroku/) |
| 38 | + |
| 39 | +### Package Managers |
| 40 | + |
| 41 | +Nginx puede instalarse mediante package managers en Linux. |
| 42 | + |
| 43 | +#### Ubuntu |
| 44 | + |
| 45 | +```sh |
| 46 | +sudo apt-get update |
| 47 | +sudo apt-get install nginx |
| 48 | +``` |
| 49 | + |
| 50 | +#### CentOS y Amazon Linux |
| 51 | + |
| 52 | +```sh |
| 53 | +sudo yum install nginx |
| 54 | +``` |
| 55 | + |
| 56 | +#### Fedora |
| 57 | + |
| 58 | +```sh |
| 59 | +sudo dnf install nginx |
| 60 | +``` |
| 61 | + |
| 62 | +### Validar la Instalación |
| 63 | + |
| 64 | +Comprueba que Nginx se ha instalado correctamente visitando la dirección IP de tu servidor en un navegador. |
| 65 | + |
| 66 | +``` |
| 67 | +http://server_domain_name_or_IP |
| 68 | +``` |
| 69 | + |
| 70 | +### Servicio |
| 71 | + |
| 72 | +El servicio puede iniciarse o detenerse. |
| 73 | + |
| 74 | +```sh |
| 75 | +sudo service nginx stop |
| 76 | +sudo service nginx start |
| 77 | +sudo service nginx restart |
| 78 | +``` |
| 79 | + |
| 80 | +## Arrancando Vapor |
| 81 | + |
| 82 | +Nginx puede iniciarse y detenerse con los comandos `sudo service nginx ...`. Necesitarás algo parecido para iniciar y detener tu servidor de Vapor. |
| 83 | + |
| 84 | +Existen muchas formas de hacerlo, dependiendo de la plataforma en la que vayas a desplegar. Revisa las instrucciones de [Supervisor](supervisor.md) para añadir comandos para iniciar y detener tu aplicación de Vapor. |
| 85 | + |
| 86 | +## Configurar el Proxy |
| 87 | + |
| 88 | +Los ficheros de configuración para los sitios habilitados pueden encontrarse en `/etc/nginx/sites-enabled/`. |
| 89 | + |
| 90 | +Crea un nuevo fichero o copia la plantilla de ejemplo ubicada en `/etc/nginx/sites-available/` para empezar. |
| 91 | + |
| 92 | +A continuación tienes un ejemplo de un fichero de configuración para un proyecto de Vapor llamado `Hello` en el directorio "home". |
| 93 | + |
| 94 | +```sh |
| 95 | +server { |
| 96 | + server_name hello.com; |
| 97 | + listen 80; |
| 98 | + |
| 99 | + root /home/vapor/Hello/Public/; |
| 100 | + |
| 101 | + location @proxy { |
| 102 | + proxy_pass http://127.0.0.1:8080; |
| 103 | + proxy_pass_header Server; |
| 104 | + proxy_set_header Host $host; |
| 105 | + proxy_set_header X-Real-IP $remote_addr; |
| 106 | + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| 107 | + proxy_connect_timeout 3s; |
| 108 | + proxy_read_timeout 10s; |
| 109 | + } |
| 110 | +} |
| 111 | +``` |
| 112 | + |
| 113 | +Este fichero de configuración asume que el proyecto `Hello` se enlaza con el puerto `8080` al iniciarlo en el modo de producción. |
| 114 | + |
| 115 | +### Servir Ficheros |
| 116 | + |
| 117 | +Nginx también puede servir ficheros públicos sin preguntar a tu aplicación de Vapor. Esto puede mejorar el rendimiento liberando el proceso de Vapor para otras tareas más pesadas. |
| 118 | + |
| 119 | +```sh |
| 120 | +server { |
| 121 | + ... |
| 122 | + |
| 123 | + # Sirve todos los ficheros públicos/estáticos via nginx y recurre a Vapor para el resto |
| 124 | + location / { |
| 125 | + try_files $uri @proxy; |
| 126 | + } |
| 127 | + |
| 128 | + location @proxy { |
| 129 | + ... |
| 130 | + } |
| 131 | +} |
| 132 | +``` |
| 133 | + |
| 134 | +### TLS |
| 135 | + |
| 136 | +Añadir TLS es relativamente sencillo siempre y cuando los certificados hayan sido generados correctamente. Para generar certificados TLS gratuitamente, echa un vistazo a [Let's Encrypt](https://letsencrypt.org/getting-started/). |
| 137 | + |
| 138 | +```sh |
| 139 | +server { |
| 140 | + ... |
| 141 | + |
| 142 | + listen 443 ssl; |
| 143 | + |
| 144 | + ssl_certificate /etc/letsencrypt/live/hello.com/fullchain.pem; |
| 145 | + ssl_certificate_key /etc/letsencrypt/live/hello.com/privkey.pem; |
| 146 | + |
| 147 | + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; |
| 148 | + ssl_prefer_server_ciphers on; |
| 149 | + ssl_dhparam /etc/ssl/certs/dhparam.pem; |
| 150 | + ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA'; |
| 151 | + ssl_session_timeout 1d; |
| 152 | + ssl_session_cache shared:SSL:50m; |
| 153 | + ssl_stapling on; |
| 154 | + ssl_stapling_verify on; |
| 155 | + add_header Strict-Transport-Security max-age=15768000; |
| 156 | + |
| 157 | + ... |
| 158 | + |
| 159 | + location @proxy { |
| 160 | + ... |
| 161 | + } |
| 162 | +} |
| 163 | +``` |
| 164 | + |
| 165 | +La configuración de arriba son los ajustes relativamente estrictos para TLS con Nginx. Algunos ajustes no son necesarios, pero aumentan la seguridad. |
0 commit comments