27 noviembre 2007

Cómo instalar Nginx para sustituir a Apache, segunda parte

Primera parte, Segunda parte, Tercera parte, Cuarta parte

El fichero de configuración de nginx es bastante autoexplicativo aunque su sintaxis es más parecida a la de C que a la de apache, comenzando con la finalización de las lineas con punto y coma.

Si hemos realizado la instalación por defecto tendremos el fichero ubicado en el directorio /usr/local/nginx/conf , el fichero con el que vamos a trabajar es nginx.conf.

Tenemos que tener en cuenta cómo está estructurado el fichero de configuración de nginx: hay cuatro contextos (llamados main, server, upstream, y location) los cuales contienen directivas con uno o más argumentos. Las directivas en el contexto main se aplican a todo el fichero; las directivas en el contexto server se aplican a un host/puerto en particular; las directivas en el contexto upstream se aplican a un conjunto de hosts; las directivas en el contexto location se aplican al directorio web específico al que se refieran.

Aquí muestro el fichero de configuración que he preparado y a continuación paso a comentarlo:

user  apache;
worker_processes 4;

pid /var/run/nginx.pid;

events {
worker_connections 1024;
}


http {
include conf/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';


sendfile on;
keepalive_timeout 60;

gzip on;

server {
listen 81;
server_name www.dominio.com ;
access_log /var/log/nginx/dominio-access.log main;
error_log /var/log/nginx/dominio-error.log info;

location / {
root /var/www/html/dominioapp;
index index.php index.htm index.html;
error_page 404 /index.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

location ~ \.php$|\.htm$ {
fastcgi_pass unix:/tmp/fcgi.sock;
fastcgi_index index.htm;
fastcgi_param SCRIPT_FILENAME /var/www/html/dminio/app$fastcgi_script_name;
fastcgi_intercept_errors on;
include /usr/local/nginx/conf/fastcgi.conf;
}
}
}


En la primera parte del fichero nos podemos encontar algunas configuraciones genéricas del servidor independientemente de las configuraciones de los host:

user  apache;
worker_processes 4;

pid /var/run/nginx.pid;

events {
worker_connections 1024;
}



  • user es el usuario con el que queremos que corra nginx, en nuestro caso apache
  • worker_processes el número de hilos que queremos que abra nginx.
  • pid el pid que va a tener nuestro servidor
  • worker_connections el número de conexiones máximo que vamos a permitir que tengan los hilos.

A partir de aquí comienzan las configuraciones como servidor http, por eso mismo comienzan con la directiva http. Como podemos observar, en función de que parte se está configurando, vamos anidando las directivas entre llaves.

http {
include conf/mime.types;
default_type application/octet-stream;

log_format main '$remote_addr - $remote_user [$time_local] $request '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';


sendfile on;
keepalive_timeout 60;

gzip on;



  • include; esta directiva se puede poner en cualquier parte del fichero para incluir un fichero externo de configuración, en este caso incluimos los tipos mime.
  • default_type; es el tipo por defecto de dato.
  • log_format; es la directiva en la que configuramos el formato de log.
  • sendfile; qué utilizamos para proporcionar los ficheros que se solicitan.
  • keep_alive_timeout; el tiempo de vida de una conexión keepalive.
  • gzip; está activada la compresión de páginas

Con la directiva server ya se puede decir que comienza la definición de un host:

server {
listen 81;
server_name www.dominio.com ;
access_log /var/log/nginx/app.access.log main;
error_log /var/log/nginx/app-error.log info;

location / {
root /var/www/html/dominio/app;
index index.php index.htm index.html;
error_page 404 /index.html;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}

location ~ \.php$|\.htm$ {
fastcgi_pass unix:/tmp/fcgi.sock;
fastcgi_index index.htm;
fastcgi_param SCRIPT_FILENAME /var/www/html/dominio/app$fastcgi_script_name;
fastcgi_intercept_errors on;
include /usr/local/nginx/conf/fastcgi.conf;
}
}

  • server; como decíamos, es el comienzo de la configuración del host virtual.
  • listen; el puerto donde va a escuchar el servidor, en este caso como estamos haciendo pruebas, tenemos escrito el 81.
  • server_name; nombre del servidor.
  • acess_log; dónde vamos a escribir el log de acceso.
  • error_log; dónde vamos a escribir el log de error.
  • root; directorio raíz del host.
  • index; qué ficheros van a parsearse como index.
  • error_page; a qué página redireccionamos cuando se produce el error indicado.
error_page soporta la redirección en función de si el error es un 404 o un 500, como está indicado en el fichero de configuración.

La configuración de FastCGI que tenemos ahí funciona correctamente. A continuación mostraremos el significado de todas las directivas:

  • location ~ \.php$|\.htm ; estamos indicando que las directivas de este contexto se aplicarán para los ficheros que termien en php o en htm.
  • fastcgi_pass; es la directiva que indica cómo nos conectaremos a FastCGI, en este caso utilizaremos un socket de unix.
  • fastcgi_index; si la petición se hace a una url finalizada con "/", se añadirá el nombre de fichero que indicamos aquí
  • fastcgi_param; asignamos parámetros que serán transferidos al servidor de FastCGI
  • fastcgi_intercept_errors; indicamos si transmitimos los errorers 4xx ó 5xx a nginx para que los gestione él.
Para no hacer más grande el fichero de configuración el resto de las directivas de FastCGI las incluimos en un fichero separado. En realidad son todos parámetros que son recomendables tener en la configuración.

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
fastcgi_param REDIRECT_STATUS 200;

Los tres primeros son importantes si hacemos peticiones POST.
El último es necesario si hemos compilado php con la directiva "force redirect", aunque por la configuración que tenemos no nos es muy necesaria.

En las siguientes entregas veremos un poco el manejo de nginx, así como opciones de configuración con reescrituras.

Una referencia de nginx con FastCGI
(en inglés).

Primera parte, Segunda parte, Tercera parte, Cuarta parte

No hay comentarios: