Tema 2.2. El servidor Web Nginx Tema 2.2 El servidor Web Nginx 1 EL SERVIDOR NGINX. CARACTERÍSTICAS GENERALES.........
Views 129 Downloads 1 File size 858KB
Tema 2.2. El servidor Web Nginx
Tema 2.2 El servidor Web Nginx 1
EL SERVIDOR NGINX. CARACTERÍSTICAS GENERALES........................................................2
2
INSTALACIÓN DE NGINX.............................................................................................................3 2.1
3
INSTALACIÓN DE NGINX EN UBUNTU..............................................................................................3
CONFIGURACIÓN DE NGINX......................................................................................................3 3.1 CONFIGURAR UN SITIO HTTPS..........................................................................................................6 3.2 CONFIGURAR NGINX PARA USAR EL PROCESADOR PHP.................................................................6 3.2.1 Configurar el Procesador PHP.............................................................................................6 3.2.2 Configurar Nginx para usar el Procesador PHP..................................................................7 3.2.3 Configurar Nginx para usar nuestro propio fichero de error................................................7
4
EJEMPLO DE CONVIVENCIA DE NGINX Y APACHE............................................................8 4.1 4.2 4.3
CONTENIDO DEL FICHERO DE CONFIGURACIÓN DE NGINX..............................................................8 INSTALACIÓN Y CONFIGURACIÓN DE APACHE..................................................................................9 Finalizando....................................................................................................................................10
1
Tema 2.2. El servidor Web Nginx
1
El servidor Nginx. Características generales.
Hasta hace bien poco, Apache era el rey indiscutible en el mundo de los servidores web, pero año tras año, la popularidad del servidor web Nginx ha ido en aumento y empresas punteras de Internet como Facebook o WordPress lo utilizan, aunque sea parcialmente, en sus portales. Nginx es un servidor web muy ligero. Además de servir http, puede actuar como proxy y como balanceador de carga. Es un software libre y de código abierto y es multiplataforma, existiendo versiones para la mayoría de los sistemas operativos: Unix, Linux, Windows, … Cuenta también con una versión comercial llamada Nginx plus.
La principal ventaja de Nginx como servidor web es que consume muchos menos recursos al servir contenido estático, y esto lo convierte en una excelente opción para funcionar como proxy inverso o como balanceador de carga para otros servidores como Apache, optimizando la entrega de contenidos. Nginx usa mucha menos memoria que Apache, y puede manejar aproximadamente cuatro veces más solicitudes por segundo. Este aumento de rendimiento viene con un costo de disminuida flexibilidad. Como hemos comentado, Nginx es mejor para servir contenido estático que dinámico. Si queremos contenido dinámico lo tenemos que hacer con un CGI, por ejemplo, en el caso de PHP debemos hacerlo con php_rpm. Un CGI es un mecanismo estandarizado de comunicación entre el servidor web y una aplicación externa. En este caso se utiliza para ampliar la funcionalidad del servidor a través de la comunicación con componentes adicionales. Podemos encontrar información y ayuda sobre el servidor Nginx en la siguiente página: https://nginx.org/en/docs/
2
Tema 2.2. El servidor Web Nginx
2
Instalación de Nginx.
2.1 Instalación de Nginx en Ubuntu. Dependiendo de la distribución Linux con la que estemos trabajando, deberemos utilizar el gestor de paquetes adecuado. En el caso de Ubuntu, podemos instalar Nginx fácilmente con: sudo aptget install nginx En este punto, ya tendríamos el servidor instalado. Para comprobar que el servidor se está ejecutando y está a la escucha en el puerto correspondiente (80 por defecto), bastará con abrir el navegador y escribir localhost. Se debería ver la página por defecto de Nginx.
3
Configuración de Nginx
El fichero de configuración determina como se va a comportar Nginx y sus módulos. El fichero de configuración principal se llama nginx.conf y se encuentra en el directorio /etc/nginx. Desde este fichero se pueden incluir todos los ficheros de configuración auxiliares que deseemos utilizando la directiva include. Dentro del fichero de configuración podemos distinguir los diferentes tipos de elementos:
Directivas. Constan de un nombre, seguido por parámetros y terminan con un punto y coma. (OJO el punto y coma es necesario)
3
Tema 2.2. El servidor Web Nginx
Listen 80; Server_name localhost Podemos encontrar ayuda sobre todas las directivas de Nginx en la página oficial: http://nginx.org/en/docs/dirindex.html
Bloques. Contienen múltiples instrucciones de configuración. Un bloque engloba las instrucciones que lo componen dentro de llaves {} location / { root /usr/share/nginx/html; index index.html index.htm; }
Contextos. Un contexto es un bloque que puede contener dentro otros bloques, como por ejemplo: events, http, server, location… server { location / { root /data/www; }
}
location /images/ { root /data; }
La organización del fichero se hace de acuerdo con la siguiente estructura:
El contexto main contiene directivas esenciales para el funcionamiento del servidor Las directivas que se colocan en el fichero de configuración fuera de cualquier contexto se considera que están en el contexto main. Algunas de las directivas que pueden especificarse aquí son: o User. Permite especificar qué usuario y opcionalmente qué grupo se utilizará para iniciar los procesos worker. Su sintaxis es: user nombreusuario nombregrupo; user nombreusuario; o Worker_processes. Define la cantidad de procesos worker. Se puede
4
Tema 2.2. El servidor Web Nginx
especificar un número entero o el valor auto. Por defecto se crearán tantos como cores tenga la CPU. o Error_log. Indica la ubicación de los archivos de registro de errores. Su sintaxis es: error_log ruta level; donde level podría tomar los valores: debug, info, notice, warn, error y crit. Si se quiere desactivar el registro de errores, debemos enviar los errores a la ruta /dev/null. Puede usarse en los contextos main, server, http y location. Es una buena práctica tener un error log separado para cada server, ya que ayuda a reducir el tamaño de los ficheros logs y hace más fácil su gestión
El contexto events reside en el contexto main. Se utiliza para establecer las opciones con las que Nginx maneja las conexiones a nivel general. Por ejemplo, la directiva worker_connections 4096; define la cantidad de conexiones que puede manejar un proceso worker de forma simultánea.
El contexto http reside en el contexto main. Se utiliza para definir las directivas y bloques relacionados con la función de Nginx como servidor web
El contexto server reside dentro de http. Define la configuración para un virtual host (Son equivalente al VirtualHost de Apache). Entre las directivas más importantes que incluye se encuentran la directiva listen, la directiva server_name y la directiva root. Se pueden especificar todos los bloques server que queramos. Nginx elegirá que server procesar en función del puerto de escucha y del server_name. o La directiva listen establece el puerto del sitio web. o La directiva server_name establece un nombre para un virtual host. o La directiva root establece el directorio raíz para una petición. Por ejemplo, con la siguiente configuración, una petición en el navegador a localhost:8080, retornaría el index.html del directorio /home/nginx/public_html.
5
Tema 2.2. El servidor Web Nginx
server { listen 8080; root /home/nginx/public_html; } Al igual que hacíamos en Apache, es una buena práctica crear para cada server, un fichero de configuración individual. Nos vamos a encontrar con la misma estructura de carpetas y filosofía que en Apache:
Sitesavailable. Para almacenar los ficheros de configuración de todos nuestros sitios.
Sitesenable. Para almacenar los enlaces de aquellos sitios web que se encuentren activos en un momento dado. Para crear un enlace al fichero que queramos, utilizaremos el comando: ln s /etc/nginx/sitesavailable/fichero /etc/nginx/sites/enable/fichero
El contexto location puede ir dentro de server o de otro location. Permite definir un grupo de ajustes que son aplicados a ciertas secciones de un sitio web.
Cada vez que realicemos un cambio en la configuración del servidor, será necesario reiniciar el servicio asociado. En caso de Ubuntu pondremos: service nginx restart
3.1 Configurar un sitio https Para habilitar SSL hay que hacer lo siguiente:
Especificar el parámetro SSL en la directiva Listen, o añadir la directiva ssl con el valor on.
Especificar la ruta de los ficheros con la clave privada y el certificado en las directivas ssl_certificate y ssl_certificate_key. server { listen 443; server_name training.secure.com; error_log logs/secure.error.log; ssl on; ssl_certificate /etc/nginx/certs/nginxtraining.crt; ssl_certificate_key /etc/nginx/certs/nginxtraining.key; } 6
Tema 2.2. El servidor Web Nginx
3.2 Configurar Nginx para Usar el Procesador PHP Puesto que Nginx no contiene procesamiento PHP nativo como otros servidores web, tendremos que instalar phpfpm, que significa "fastCGI process manager". Le diremos a Nginx que pase las solicitudes de PHP a este software para su procesamiento. Aunque no tengamos la base de datos MySQL instalada, podemos agregar un paquete adicional en el caso de que estuviéramos interesados, en que PHP pueda comunicarse con el servidor de bases de datos: sudo aptget install phpfpm phpmysql
3.2.1
Configurar el Procesador PHP
Ahora tenemos nuestros componentes de PHP instalados, pero necesitamos hacer un ligero cambio de configuración para hacer nuestra configuración más segura. Para ello, editamos el fichero de configuración de phpfpm: nano /etc/php/7.0/fpm/php.ini
A continuación, buscaremos el parámetro cgi.fix_pathinfo y lo descomentaremos, asignándole un valor de 0. cgi.fix_pathinfo=0 De no hacerlo así, estaremos permitiendo que en el caso de no encontrar el fichero PHP solicitado, se ejecute el archivo más cercano que se pudiera encontrar.
Una vez modificado el fichero de configuración, reiniciaremos el componente con el comando: systemctl restart php7.0fpm
3.2.2
Configurar Nginx para usar el Procesador PHP
Ahora, que tenemos todos los componentes necesarios instalados. Lo único que faltaría sería cambiar la configuración de aquellos sitios web que hagan uso de PHP. Para ello, debemos modificar lo siguiente:
7
Tema 2.2. El servidor Web Nginx
En primer lugar, necesitamos agregar index.php como el primer valor de nuestra directiva index. index index.php index.html index.htm;
Para el procesamiento real de PHP, solo necesitamos añadir o descomentar un segmento del archivo que maneja las solicitudes de PHP. location ~ \.php$ { include snippets/fastcgiphp.conf; fastcgi_pass unix:/run/php/php7.0fpm.sock; }
También hay que añadir o quitar los comentarios del bloque que trata con archivos .htaccess. Nginx no procesa estos archivos. Si alguno de estos archivos encuentra la forma de llegar a un documento del root, no deben ser servidos a los visitantes. location ~ /\.ht { deny all; }
3.2.3
Configurar Nginx para usar nuestro propio fichero de error.
Tenemos que dar los siguientes pasos: 1. Creamos el fichero de error dentro de nuestro sitio web y lo referenciamos en la directiva error_page para que cuando ocurra un error 404, sea la página servida: error_page 404 /404.html; 2. Aunque no sea estrictamente necesario, es una buena práctica impedir que los usuarios referencien directamente el fichero de error en su navegador. Para ello, creamos una sección para el fichero e indicamos que solamente puede ser invocado internamente. location /404.html { internal; }
4
Ejemplo de convivencia de Nginx y Apache
Tanto Nginx como Apache son dos servidores web potentes y eficaces. Las razones de la popularidad de cada servidor son claras: el poder de Apache y velocidad de Nginx. Sin embargo, ambos servidores tienen inconvenientes: Apache consume demasiada
8
Tema 2.2. El servidor Web Nginx
memoria del servidor, mientras que Nginx necesita la ayuda de phpfpm o módulos similares para servir contenido dinámico.
Sin embargo, se pueden realizar configuraciones en las que se combinan los dos servidores para conseguir un mejor rendimiento. Una de ellas, utiliza Nginx como servidor estático en el frontend y Apache para el procesamiento dinámico en backend.
4.1 Contenido del fichero de configuración de Nginx La siguiente configuración permitirá usar Nginx como servidor frontend para nuestro sitio web. Esta configuración establece un sistema por el cual todas las peticiones con un final .php se redireccionan al backend Apache que deberá estar corriendo en el puerto 8080. El resto de las peticiones serán atendidas por el servidor Nginx. server { listen 80; root /var/www/html/sitioEjemplo; index index.php index.html index.htm; server_name www.ejemplo.com; location / { try_files $uri $uri/ /index.php; } location ~ \.php$ { proxy_set_header XRealIP $remote_addr; proxy_set_header XForwardedFor $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080; } location ~ /\.ht { deny all; } } La directiva try_files $uri $uri/ /index.php se utiliza para verificar la existencia del archivo o del directorio al que referencia el usuario en la uri. Si no existiera redirigiría a índex.php. Si se quitara seguiría funcionando igual, aunque nuestro sitio no tendría el comportamiento descrito anteriormente. 9
Tema 2.2. El servidor Web Nginx
El bloque: location ~ \.php$ { proxy_set_header XRealIP $remote_addr; proxy_set_header XForwardedFor $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080; } Redirige todas las peticiones que le lleguen al servidor Nginx que terminen en .php al servidor que le indicamos en proxy_pass. Proxy_pass establece el protocolo y la dirección del servidor al que le reenviamos la petición. Proxy_set_header permite redefinir o añadir campos a la cabecera de la petición HTTP que se le hace al servidor al que redirijamos:
XForwardedFor: es un método común para identificar la dirección IP origen del cliente que se conecta a un servidor web a través de un proxy HTTP.
XRealIP: contiene la IP del cliente que inicia la petición, y se ha establecido el valor de la variable $remote_addr con la idea de que al servidor destino le llegue la IP del cliente y no la del proxy HTTP. Si no se hubiese modificado este dato en la cabecera, la IP que recibiría el servidor web objetivo siempre sería la del proxy HTTP.
Host: Al igual que la anterior cabecera, establecemos el valor con el contenido de la variable $host, es decir, el nombre de host que especificó el cliente.
4.2 Instalación y configuración de Apache. Con el servidor Nginx parado, instalamos el servidor Apache como vimos en el tema anterior. A continuación, le añadimos los paquetes necesarios para activar el módulo PHP. aptget install apache2 apt-get install php7.0 libapache2-mod-php7.0 php7.0-cli php-pear php7.0-mysql Como nos interesa que Apache sólo responda en el puerto 8080 desde las peticiones hechas desde nuestra máquina, cambiamos la configuración del fichero ports.conf y dejamos como única línea activa la siguiente: Listen 127.0.0.1:8080
10
Tema 2.2. El servidor Web Nginx
A continuación, creamos un fichero de configuración para nuestro sitio web en Apache que podría ser algo parecido al siguiente:
ServerName www.ejemplo.com DocumentRoot /var/www/html/sitioEjemplo ….
Por último, lo habilitamos con a2ensite.
4.3 Finalizando Una vez que tengamos habilitados nuestros ficheros de configuración, tanto de Nginx como de Apache, sólo nos restará reiniciar los servidores y realizar las pruebas oportunas: service apache2 restart service nginx restart
11