webserver

Configuración servidor web

Como servidor HTTP de alto rendimiento usamos Nginx, que también puede emplearse como proxy.

Puede encontrase una extensa documentación con muchos ejemplos en la wiki oficial: http://wiki.nginx.org/Configuration

Archivos de configuración de Nginx

root@cox:/etc/nginx# tree
.
├── conf.d
│   └── upstream.conf
├── fastcgi_params
├── gzip.conf
├── koi-utf
├── koi-win
├── mime.types
├── naxsi_core.rules
├── naxsi.rules
├── nginx.conf
├── prohibido.rules
├── proxy_params
├── scgi_params
├── sites-available
│   ├── 1-habitat-hilbert
│   ├── 2-hi-sodec
│   ├── 3-luna-hyakutake
│   └── default
├── sites-enabled
│   ├── 1-habitat-hilbert -> ../sites-available/1-habitat-hilbert
│   ├── 2-hi-sodec -> ../sites-available/2-hi-sodec
│   ├── 3-luna-hyakutake -> ../sites-available/3-luna-hyakutake
│   └── default -> ../sites-available/default
├── uwsgi_params
└── win-utf

El archivo principal es /etc/nginx/nginx.conf que en el caso de Debian se encarga de llamar al resto de los archivos.

El resto de archivos de la raiz /etc/nginx son porciones de código que pueden ser incluidas de manera opcional en cualquier virtualhost con la orden:

include nombre-archivo;

Todos los archivos con extensión .conf dentro de /etc/nginx/conf.d/ se cargarán siempre. Ahora mismo sólo está definido upstream.conf que informa de los sockets asociados a los entornos de ejecución de PHP.

En /etc/nginx/sites-available/ están todos los virtualhost normalmente separados por dominio.

En /etc/nginx/sites-enabled/ están todos los virtualhost activos. Se trata de enlaces simbólicos a sites-available.

El demonio de Nginx

Para parar/arrancar/reiniciar/etc el servidor se recurren al sistema usual:

root@cox:/etc/nginx# /etc/init.d/nginx 
Usage: nginx {start|stop|restart|reload|force-reload|status|configtest}

NOTA: La opción reload permite cargar otra configuración al vuelo sin parar de atender peticiones.

Configuración general de PHP

Para ver la versión actual de PHP usada por un virtual host, por ejemplo de stats.habitat.aq.upm.es:

echo "<?php phpinfo(); ?>" > /var/www/piwik/info.php

Y después visitar en el navegador stats.habitat.aq.upm.es/info.php.

Depués conviene eliminar este archivo:

rm /var/www/piwik/info.php

Actualización de PHP

Desde marzo de 2018 conviven en el servidor dos versiones de PHP: 5.6 y 7.0.

Para actualizar de versión, en este caso de la 5.6 a la 7.0:

sudo apt-get install php7.0-fpm php7.0-mysql
sudo cp /etc/php5/fpm/pool.d/* /etc/php/7.0/fpm/pool.d/.
sudo service php5-fpm stop
sudo service php7.0-fpm start

Y si todo va bien:

sudo systemctl disable php5-fpm

En el servidor de CF+S el archivo de configuración de FPM no está modificado, así que se puede funcionar con el nuevo. Si se quiere mantener el archivo:

sudo cp /etc/php5/fpm/php.ini /etc/php/7.0/fpm/.
sudo cp /etc/php5/fpm/php-fpm.conf /etc/php/7.0/fpm/.

La configuración del intérprete PHP usado por el servidor web está en el archivo

/etc/php/7.0/fpm/php.ini

La configuración del intérprete PHP para ejecuciones desde la línea de comandos está en el archivo

/etc/php/7.0/cli/php.ini

Gestor de procesos de PHP

Para gestionar las peticiones web que ha de procesar el intérprete de PHP usamos PHP-FPM. Esto nos permite tener un entorno de ejecución personalizado para cada proyecto web.

Archivos de configuración de PHP-FPM

En marzo de 2018 se ha actualizado la versión de PHP de 5.6 a 7.0

Los entornos de ejecución (llamados pools) se configuran en /etc/php5/fpm/pool.d/ Puedes encontrar un ejemplo con todas las opciones de configuración comentadas en /etc/php5/fpm/pool.d/www.conf

Los entornos de ejecución (llamados pools) se configuran en /etc/php/7.0/fpm/pool.d/

Puedes encontrar un ejemplo con todas las opciones de configuración comentadas en /etc/php/7.0/fpm/pool.d/www.conf

Hemos definido los siguientes entornos para los virtualhost del servidor:

  • habitat.aq.upm.es. /etc/php5/fpm/pool.d/habitat.conf. Sigue funcionando con PHP 5.6
  • hi.ee.upm.es. /etc/php5/fpm/pool.d/hi.conf. Sigue funcionando con PHP 5.6
  • wiki.hi.ee.upm.es. /etc/php/7.0/fpm/pool.d/wiki.conf. Funciona con PHP 7.0
  • stats.habitat.aq.upm.es. /etc/php/7.0/fpm/pool.d/piwik.conf. Funciona con PHP 7.0

To Do

En habitat y en hi hay código PHP incompatible con la versión 7. Hay que sustituir los comandos obsoletos y solucionar los problemas de sintaxis. Con un vistazo rápido a /habitat/www/log/errores.log se puede ver que hay varias llamadas a ereg, comando obsoleto, y otros errores de sintaxis.

Los demonios de FPM

Actualmente (desde marzo de 2018), conviven en el servidor dos versiones de PHP y de FPM: la 5.6 y la 7.0.

Para arrancar/parar/reiniciar/etc el gestor de procesos de PHP 5.6 se recurre al sistema usual:

sudo service php5-fpm
Usage: /etc/init.d/php5-fpm {start|stop|status|restart|reload|force-reload}

Y para PHP 7.0:

sudo service php7.0-fpm
Usage: /etc/init.d/php7.0-fpm {start|stop|status|restart|reload|force-reload}

Conectando un entorno de ejecución de PHP con un virtualhost de Nginx

  1. Generamos un nuevo archivo /etc/php/7.0/fpm/pool.d/habitat.conf
  2. Definimos un upstream en /etc/nginx/conf.d/upstream.conf indicando el mismo socket:
    /etc/nginx/conf.d/upstream.conf
         root@cox:/etc/nginx# cat conf.d/upstream.conf 
         upstream habitat-socket {
            server unix:/run/habitat.sock;
         }
     
  3. En el bloque location de virtualhost que quieras procesar en php se añade el nombre del upstream en fastcgi_pass
    	location ~ \.(html|php)$ {
    		try_files $uri =404;
    		include fastcgi_params;
    		fastcgi_intercept_errors on;
    		fastcgi_pass habitat-socket;
    		fastcgi_index lista.html;
    		fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    	}
     

CGI-BIN

Para gestionar las peticiones web que han de gestionarse a través de un cgi usamos fcgiwrap.

A diferencia de php-fpm no permite definir diferentes entornos de ejecución. Simplemente define un socket que hay que indicarle al Nginx: /run/fcgiwrap.socket

Y un demonio: /etc/init.d/fcgiwrap

Ejemplo de uso en habitat:

	location ~ ^/cgi-bin/.*$ {
		root /habitat/www;
    		gzip off;
		include fastcgi_params;
		fastcgi_intercept_errors on;
    		fastcgi_pass  unix:/run/fcgiwrap.socket;
		fastcgi_param SCRIPT_FILENAME  $fastcgi_script_name;
	}

Cómo añadir un nuevo virtual host

El servidor web de CF+S dedica un virtual host para cada servicio web. Así habitat, hi, el servicio de estadísticas o esta dokuwiki son virtual host de Nginx.

Para crear un nuevo virtual host:

  1. Crear usuario y grupo asociados al virtual host, así como el directorio que contendrá los arhchivos del servicio web.
  2. Añadir el archivo de configuración del virtual host en /etc/nginx/sites-availables/
  3. Crear el archivo de configuración del pool FPM en /etc/php/7.0/fpm/pool.d/
  4. Añadir registro en /etc/hosts, si el virtual host está asociado a un dominio o a un subdominio.
  5. Activar el virtual host y reiniciar el servidor web.

Como ejemplo se muestra los pasos de configuración de un virtual host para ejemplo.habitat.aq.upm.es, con los archivos comentados.

Creación de directorio y usuario para el virtual host

Los diferentes directorios para los virtual host están en /var/www/. Cada virtual host debe estar asociado a un usuario y a un grupo para que tenga un entorno de ejecución independiente y seguro.

# Creamos un usuario del sistema, o usamos un usuario ya existente.
adduser --system --no-create-home --group nuevousuario
# Añadimos el usuario del servidor web, www-data, al nuevo grupo
usermod -a -G nuevousuario www-data
# Creamos el nuevo directorio
mkdir /var/www/nuevodirectorio
# Le asignamos los permisos y propietarios adecuados
chown -R nuevousuario.nuevousuario /var/www/nuevodirectorio
# Aseguramos que los nuevos archivos y directorios creados en nuevodirectorio tendrán los permisos correctos
setfacl -dR -m u::rwX,g::rX,o::- /var/www/nuevodirectorio

Configuración del virtual host

El archivo de configuración lo alojaremos en /etc/nginx/sites-available/.

A continuación el archivo de configuración:

server {
	listen   80;
 
	# Directorio que contendrá los archivos del virtual host
	root /var/www/nuevodirectorio;
	# Archivos que buscará Nginx por omisión
	index lista.html lista.htm;
 
	# URL de acceso al virtual host
	# un subdominio, un directorio de un dominio...
	server_name ejemplo.habitat.aq.upm.es;
 
	# Archivos que contendrán los logs
	access_log /habitat/www/log/ejemplo.habitat.aq.upm.es.visitas.log;
	error_log /habitat/www/log/errores.log;
 
        include gzip.conf;
 
	location / {
		try_files $uri $uri/ lista.html;
	}
 
	# Procesamiento de los archivos PHP y HTML
	# usando el módulo fastcgi que conecta con el servidor FPM
	location ~ \.(html|php)$ {
		try_files $uri =404;
		include fastcgi_params;
		fastcgi_intercept_errors on;
		# Ruta al socket usado para este virtual host
		fastcgi_pass unix:/run/ejemplo.habitat.aq.upm.es.sock;
		fastcgi_index lista.html;
		fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	}
 
	include prohibido.rules;
 
	# Procesamiento de los scripts CGI
	# usando el módulo fastcgi
	location ~ ^/cgi-bin/.*$ {
                root /habitat/www;
                gzip off;
                include fastcgi_params;
                fastcgi_intercept_errors on;
                fastcgi_pass  unix:/run/fcgiwrap.socket;
			fastcgi_param   PATH_INFO         $fastcgi_path_info;
                fastcgi_param SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
        }
}

Configuración del pool FPM

El archivo de configuración lo alojaremos en /etc/php/7.0/fpm/pool.d/.

A continuación el archivo de configuración:

; Nombre del pool
[ejemplo]

; El socket que usaremos para comunicar con el servidor web
listen = /run/ejemplo.habitat.aq.upm.es.sock
listen.allowed_clients = 127.0.0.1
; El usuario y el grupo para el socket
listen.owner = nuevousuario
listen.group = nuevogrupo
listen.mode = 0660
; El usuario y el grupo con el que ejecutará el intérprete de PHP
user = nuevousuario
group = nuevogrupo

pm = dynamic

pm.max_children = 128
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 64
pm.max_requests = 1024

request_terminate_timeout = 120s
rlimit_files = 131072
rlimit_core = unlimited
catch_workers_output = yes

; Limitaciones en la subida de archivos para este entorno
php_admin_value[post_max_size]= 100M
php_admin_value[upload_max_filesize]= 100M
php_admin_value[max_file_uploads]= 10

; Tipos de archivos a procesar por FPM
; En habitat los archivos con extensión html contienen código php
; que ha de ejecutarse.
security.limit_extensions = .php .html

Registro del nuevo servicio en /etc/hosts

En el caso de que el nuevo servicio esté asociado a un dominio o subdominio, lo añadiremos al archivo /etc/hosts.

Si es un subdominio de habitat.aq.upm.es:

echo "138.100.41.201 ejemplo.habitat.aq.upm.es" >> /etc/hosts

Si es un subdominio de hi.ee.upm.es:

echo "138.100.41.91 ejemplo.hi.ee.upm.es" >> /etc/hosts

Reinicio de servicios para poner en marcha el nuevo virtual host

Por último, activamos el virtual host:

ln -s /etc/nginx/sites-available/vhost.config.file /etc/nginx/sites-enabled/vhost.config.file

Y reiniciamos servicios:

service php7.0-fpm restart
service nginx restart
webserver.txt · Última modificación: 2018/03/31 18:26 por root