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
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.
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.
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
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
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.
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:
/etc/php5/fpm/pool.d/habitat.conf
. Sigue funcionando con PHP 5.6/etc/php5/fpm/pool.d/hi.conf
. Sigue funcionando con PHP 5.6/etc/php/7.0/fpm/pool.d/wiki.conf
. Funciona con PHP 7.0/etc/php/7.0/fpm/pool.d/piwik.conf
. Funciona con PHP 7.0
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.
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}
root@cox:/etc/nginx# cat conf.d/upstream.conf upstream habitat-socket { server unix:/run/habitat.sock; }
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; }
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; }
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:
Como ejemplo se muestra los pasos de configuración de un virtual host para ejemplo.habitat.aq.upm.es, con los archivos comentados.
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
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; } }
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
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
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