Servidor

De WikiTraba

Dreceres ràpides: navegació, cerca
Stub Aquest article està inacabat i és clarament insuficient. Si-us-plau, ajuda'ns a completar-lo o aporta idees per millorar-lo.


En este artículo se explica de la forma más detallada posible cómo poner en marcha un servidor de internet desde nuestro ordenador personal. Un servidor no es más que un ordenador que está conectado a internet cuantas más horas al día mejor, y que mediante distintos programas permite la visualización remota (desde otros ordenadores conectados a internet) de páginas web almacenadas en su interior, además de otros servicios adicionales. Tenemos también una sesión para aprender las bases de la construcción de páginas web.

El servidor que permite ver y editar la WikiTraba está montado de la forma que se explica en esta guía bajo GNU/Linux Ubuntu. Como este manual está un poco estancado, puedes consultar este otro.

Contingut

Con don pinguino

Introducción

Probado con


  • Simple Machines 1.0.9 con Spoiler Tag
  • MediaWiki 1.15.1 con texvc, GoogleMaps, wikicalendar, SpecialCite, inputbox, Biblio, EasyTimeline, gnuplot, GraphViz, svgextension, WikiPDF, R extension, slides extension, PageProtection, youtube, googlevideo, ParserFunctions, PDFexport y AddArticleToCategory
  • WordPress 2.8.4
  • eGroupWare 1.2.005
  • Moodle 1.8.2+
  • Coppermine 1.4.12
  • Mambo 4.5.2.3
  • WebAlizer 2.01

Un par de cosas en que siempre hay que pensar

Cuando surge algún problema con la instalación, la configuración o el funcionamiento de un servidor, antes de rompernos la cabeza hay que comprobar siempre un par de cosas:

  • que el router o el firewall' no nos estén interfiriendo en el tema puertos
  • que los directorios tengan los permisos necesarios (chmod)

Instalación y configuración

Sistema básico

apache, php, mysql (+admin+querybrowser), phpmyadmin

Añadiendo algunas funcionalidades

proftpd, postfix, freenx, R

La família Traba

La família Traba está compuesta por tres miembros, cada uno de ellos basado en un software distinto pero que tienen en común que todos usan Apache + PHP + MySQL para funcionar:

Los tres paquetes para instalarlos son una colección de archivos .php (entre otros), que van a generar las tablas de MySQL necesarias para almacenar la información. Su instalación es sumamente sencilla, pues consiste en descomprimir...........................Luego hay algunas peculiaridades:

  • blog: calendario
  • wiki
  • smf

Y otros miembros de la familia son el egroupware, la galeria, el portal o el sitio de formación.

Mantenerse al dia

Los paquetes de software se van a actualizar solos, como se explica más abajo. Para los tres paquetes de la família Traba vale la pena mirar de vez en cuando si hay grandes fallos de seguridad o updates en sus webs, y bajarnos en tal caso el nuevo instalador, que ya contendrá instrucciones detalladas sobre como realizar la actulización sin perder archivos ni la información almacenada en las bases de datos de MySQL.

Para que nos encuentren

Un problema fundamental cuando uno no tiene ni dinero ni intención de pagarse un dominio, es como conseguir que los cibernautas nos encuentren si tenemos una IP dinámica. Efectivamente la dirección de nuestro servidor es http://nuestraIPenaquelmomento/loquesea, lo cual podría volvernos locos pues habría que mandar constantemente mails a nuestros usuarios para informarles de cuál es nuestra dirección en cada momento.

Servidores DNS

Por suerte hay algunas empresas que ofrecen un servicio de DNS, que no es más que traducir nuestra IP a un nombre que sea siempre el mismo y que podamos ofrecer a los cibernautas como una dirección constante. Así pues, lo que hace un servidor de DNS es traducir la dirección http://nuestraIPenaquelmomento/loquesea a http://unnombrefijo/loquesea.

Algunas de las empresas que ofrecen este servicio lo hacen de forma gratuita, como por ejemplo 2myDNS. El precio que hay que pagar es que nos aparecerá el nombre de la empresa en nuestra dirección web. Si nos damos de alta en 2myDNS, por ejemplo, nos van a pedir un nombre de dominio y un usuario y password para poder actualizar nuestra IP. Nuestra dirección entonces será http://nombrededominioescogido.2mydns.com/loquesea (por ejemplo acrida.2mydns.com/xxx).

Todo esto no suena del todo mal pero claro, ¿cómo le decimos a los señores de 2myDNS que nuestra IP ha cambiado y que deben actualizar su base de datos para que la dirección http://nombrededominioescogido.2mydns.com/loquesea apunte a nuestra nueva IP cada vez que esta cambie? En M$ Ventanas hay diferentes software que realizan esta función, pero en GNU/Linux no disponemos de demasiadas alternativas. La mejor, sin duda, es realizar un script que se ejecute cada vez que cambie nuestra IP e informe a 2myDNS de cuál es la nueva. Lo que sigue es una adaptación (por no decir copia), y vale para sistemas Ubuntu con cable-módem, donde el script deberá ejecutarse cada vez que se entre en el sistema, que es cuando se obtiene la IP. Para conexiones mediante módem se deberá proceder de distinta manera, pues la nueva IP se obtiene en el momento de la conexión.

Bien suponiendo que tenemos un cable-módem, que trabajamos en Ubuntu y que nos hemos dados de alta en 2myDNS (lo cual es mucho suponer), lo que debemos hacer es:

  • Crear un fichero llamado 2mydns.sh en el directorio /etc/init.d:
sudo gedit /etc/init.d/2mydns.sh
  • Escribimos el siguiente código en el fichero recién creado, sustituyendo eth1 por la dirección de la ethernet que se conecta a internet. Este código captura la IP actual de nuestro ordenador:
#!/bin/bash
IP=`/sbin/ifconfig eth1 | grep "inet addr:" | sed -e 's/^.*inet addr://' -e 's/ .*$//'`;

Nota: Esta forma de capturar la IP no será válida si estamos detrás de un router, pues obtendrá nuestra IP privada. En este caso, para obtener la IP pública hay que usar distintas combinaciones de los comandos grep, tail, awk y otros para conseguir obtener la IP pública desde una página web que nos la diga, o desde la página de configuración del router. A continuación se muestran dos posibles ejemplos que habrá que adaptar a cada caso particular:

IP=`lynx -dump http://whatismyip.com | awk '/Your/ {print $4}'`;

IP=`wget -O - --http-user xxxxxx --http-passwd xxxxxx http://192.168.x.x/xxx.asp 2>/dev/null |grep -A 1 'IP Address'|tail -1| awk 'BEGIN { FS = ";" } ; { print $2 }'`; 
  • En las dos siguientes líneas tecleamos lo siguiente, sustituyendo usuario, contraseña y nombredominio por sus valores reales (los que hemos elegido al darnos de alta en 2myDNS). Para otros servicios DNS habría que modificar esta línea según los requisitos del servidor. De esta forma mandamos nuestra IP (capturada con cualquiera de las formas anteriores) a 2myDNS:
wget "http://dyn.2mydns.com/dyn.asp?username=usuario&password=contraseña&hostname=nombredominio.2mydns.com&myip=83.14.83.14" -O /dev/null;

wget "http://dyn.2mydns.com/dyn.asp?username=usuario&password=contraseña&hostname=nombredominio.2mydns.com&myip=$IP" -O /dev/null;

El primer comando pone una IP cualquiera, y el segundo comando transmite nuestra verdadera IP. Hay que realizar este doble paso porque si nuestra IP actual es la misma que hay almacenada en el servidor de DNS, en realidad no se produce ninguna actualización. Si esto sucede durante 30 días seguidos, nuestra cuenta en 2mydns será eliminada a menos que seamos usuarios Privileged (requiere un único pago simbólico cuya cantidad la decide el usuario).

Para mantener también vivos nuestros redireccionamientos tk podemos añadir las siguientes lineas:

wget "http://www.kini.tk" -O /dev/null;

wget "http://www.trabachat.tk" -O /dev/null;

wget "http://www.wikitraba.tk" -O /dev/null;
  • Salvamos el fichero, salimos de gedit y hacemos ejecutable el script mediante:
sudo chmod 777 /etc/init.d/2mydns.sh
  • Y ya sólo nos queda declarar que el script es un servicio que debe iniciarse al arrancar el sistema y terminarse cuando lo apaguemos. Para ello:
sudo update-rc.d -f 2mydns.sh defaults 99
  • O si preferimos que sólo se ejecute al iniciar pero no al cerrar:
sudo update-rc.d -f 2mydns.sh start 99 2 3 4 5 .
  • Si quisiéramos que el script dejara de ejecutarse al arrancar el sistema:
 sudo update-rc.d -f 2mydns.sh remove 


Con todo esto ya tenemos asegurada una dirección web fija del estilo http://nombredominio.2mydns.com, que también nos servirá como dirección para nuestro servidor FTP, control remoto o servidor de correo.

Redireccionamiento web

Aunque no está mal haber llegado hasta aquí, quizá queremos dar aún un paso más: que nuestra dirección sea más amigable, es decir que los usuarios la puedan recordar más fácilmente. Para ello existen varios sistemas de redireccionamiento gratuitos como cjb.net, es.tt o tk. Si nos quedamos por ejemplo con este último, debemos darnos de alta como usuarios en su página web y tendremos derecho automáticamente a diferentes dominios gratuitos (a condición que no sean nombre populares) que van a redireccionar a las direcciones que le indiquemos. Así, por ejemplo, la dirección http://nomrelegido.tk (por ejemplo trabachat.tk), cuando sea introducida en el navegador, va a mostrar directamente la página web correspondiente a http://nombredominio.2mydns.com. Esta nueva dirección sólo sirve para la navegación de páginas web, pero no para otros servicios.

Una ventaja del redireccionamiento tk sobre otros servicios gratuitos es que permite eliminar los pop-up de publicidad. Para ello, una vez hemos creado nuestro dominio tk y estamos logeados en myDotTk, elegimos la opción Dot TK Linker Promo en el menú de la izquierda, y luego la opción NO BANNER y le damos a CONTINUE en la parte inferior de la página.

En resumen

Resumiendo, lo que hay que hacer para que nos encuentren:

  • Darnos de alta en un servidor de DNS como 2myDNS
  • Instalar un script que informe a 2myDNS de nuestra IP
  • Darnos de alta en un redireccionador de dominios como tk para hacer más recordable nuestra dirección

Qué problema tiene todo esto? Pues que como más pasos, más posibilidades de error. Por si no tuvieramos suficiente en asegurar que nuestro servidor está siempre encendido, funcionando y conectado, ahora debemos también esperar (o rezar), que lo señores 2myDNS y los señores tk no estén caídos. La verdad es que por lo menos hasta hace poco, 2myDNS ofrecía un servicio de notable calidad. Los tk ya son otro tema, y por eso es recomendable que nuestros usuarios habituales se guarden en su carpeta de Favoritos nuestra dirección con formato 2mydns para poder puentear a los tk cuando estén caídos.

La alternativa

Una alternativa a lo explicado anteriormente es la compra de un nombre de dominio (por ejemplo traba.org), por ejemplo en Register.com o en NetworkSolutions. Un nombre de dominio puede costar entre 10 y 15 € por año.

Una vez comprado el dominio, debemos darnos de alta en el Servicio Premier de 2mydns, lo que requiere ser usuario Privileged mediante el pago único de una cantidad voluntaria.

En 2mydns nos proporcionarán las DNS necesarias (NS1.2MYDNS.COM, NS2.2MYDNS.COM y NS3.2MYDNS.COM), que deberemos introducir en la información de nuestro dominio en la página web donde lo hayamos comprado (Register.com o NetworkSolutions o cualquier otro).

Como se ha explicado anteriormente, debemos informar igualmente a 2mydns de nuestra IP mediante el uso de un script que se ejecute al iniciar el sistema.

Este sistema tiene varias ventajas sobre el descrito antes:

  • Nos ahorramos los frecuentes fallos de los sistemas de redireccionamiento como .tk u otros
  • Conseguimos un dominio con una extensión más estándar (.com, .org, .net....)
  • Podemos tener, por ejemplo, un servidor de FTP o de correo con el mismo dominio (los redireccionamientos .tk permiten sólo el redireccionamiento web)

Para tener buena salud

Teniendo en cuenta que el servidor es básicamente un PC al que no le hacemos excesivo caso y que va a pasarse 24 horas encendido, 365 días al año, conviene dejar previstas algunas tareas para que se ejecuten de forma periódica sin que tengamos que preocuparnos de ellas. Para ello deberemos crear un script para cada tarea que deseemos programar, guardarlos todos ordenados en una misma carpeta (por ejemplo /home/nombreusuario/tareasprogramadas, y poner en marcha el sistema cron para programar su ejecución.

El paquete cron

En Ubuntu, la programación de tareas se realiza mediante el paquete cron, instalable desde Synaptic (en principio se instala automáticamente cuando instalamos el sistema). El archivo de configuración se llama crontab, y ahí es donde escribiremos las tareas a realizar. Aunque existen algunos GUI para cron (como kcron o gcrontab), la sintaxis es tan sencilla que nos sale más a cuenta escribirlo nosotros a mano. Para ello:

sudo crontab -e

Nota: Es necesario entrar como sudo sólo si alguna de las tareas que queremos realizar necesita dichos privilegios, como es nuestro caso.

Esto abre un editor de texto donde añadiremos todas las tareas (mediante scripts ejecutables) que queramos, como se mostrará en los siguientes apartados. Luego guardamos con Ctrl-O y {Return}, y salimos con Ctrl-X.

El proceso de creación de un script es siempre el mismo. Primero lo creamos:

sudo gedit /home/nombreusuario/tareasprogramadas/nombrescript.sh

Lo rellenamos con el código que queramos (siempre la primera linea sera #!/bin/bash para que se procese desde una ventana de terminal), salvamos y salimos. Luego ya sólo hay que hacerlo ejecutable con:

 sudo chmod +x /home/nombreusuario/tareasprogramadas/nombrescript.sh

A continuación se muestran 4 ejemplos con sus respectivos scripts y la línea que hay que añadir a nuestro crontab para que se ejecuten.

Update automático

Lo primero es asegurarnos que nuestro Ubuntu se mantendrá actualizado aunque nosotros no estemos. Para ello creamos el script update.sh y lo rellenamos con:

#!/bin/bash 
apt-get update
apt-get upgrade -y
apt-get autoclean

Después de hacerlo ejecutable, ya lo podemos añadir a nuestro crontab, donde escribiremos la siguiente línea:

30 3 * * mon,thu /home/nombreusuario/tareasprogramadas/update.sh

Backups de ficheros

No es mala idea hacer un backup diario de todos los archivos de nuestras páginas web. Para ello crearemos el script backup.sh que contendrá al siguiente código:

#!/bin/bash
data1=`date -u +%d-%m-%Y`;
mkdir "/rutabackup/$data1"
cd /rutaweb/
tar -cvf /rutabackup/$data1/$data1.tar * ; gzip /rutabackup/$data1/$data1.tar 
data0=`date -d "4 days ago" +%d-%m-%Y`;
rm -r /rutabackup/$data0

Este script generará cada día una carpeta (dentro de rutabackup) cuyo nombre será la fecha actual y generará dentro suyo un fichero .tar.gz (cuyo nombre será también la fecha actual) que contendrá todos los ficheros almacenados en la carpeta rutaweb. Posteriormente eliminará la carpeta correspondiente a 4 días antes, con lo que conservaremos siempre la información durante 4 días.

Luego hacemos ejecutable el script y lo añadimos a crontab para que se ejecute diariamente a las 4:30 de la madrugada:

30 4 * * * /home/nombreusuario/tareasprogramadas/backup.sh

Dumps de MySQL

Igual que hemos programado un backup de ficheros, es conveniente realizar copias de seguridad de las bases de datos de MySQL, los llamados dumps. Aunque esta tarea la puede realizar periódicamente MySQLAdmin, es mejor (o por lo menos más divertido) programarla uno mismo mediante un script que llamaremos dump.sh:

#!/bin/bash
data1=`date -u +%d-%m-%Y`;
mysqldump -u nombreusuario -pcontraseña nombreBD1  > /rutabackup/$data1/nombreBD1.sql
mysqldump -u nombreusuario -pcontraseña nombreBD2  > /rutabackup/$data1/nombreBD2.sql
cd /rutabackup/$data1/
tar -cvf sql.$data1.tar *.sql ; gzip /rutabackup/$data1/sql.$data1.tar
rm /rutabackup/$data1/*.sql

Nota: Es importante no dejar espacio entre -p y la contraseña. Hay que realizar un dump para cada una del as bases de datos que tengamos.

Este script generará una fichero .tar.gz cuyo nombre será la fecha actual precedida del término sql., y lo ubicará en la carpeta /rutabackup/fechaactual generada por el script backup.sh (que por lo tanto tendrá que haber sido ejecutado anteriormente). Este fichero contendrá los archivos .sql correspondientes a cada una de las bases de datos que hemos volcado.

Luego hacemos ejecutable el script y lo añadimos a crontab para que se ejecute diariamente a las 4:45 de la madrugada:

45 4 * * * /home/nombreusuario/tareasprogramadas/dump.sh

Para restaurar un dump:

mysql -u nombreusuario -pcontraseña nombreBD < /rutabackup/nombreBD.sql

El script backup.sh eliminará completamente la carpeta /rutabackup/fechaactual, y por lo tanto los dumps generados, cuatro días después de su creación, con lo que conservaremos siempre la información durante 4 días.

Así pues, nuestra carpeta /rutacompleta/fechaactual contendrá siempre 4 subdirectorios, uno por cada uno de los 4 días anteriores. Dentro de cada subdirectorio habrá dos archivos .tar.gz, uno con los archivos de la web y otra con los dumps de las bases de datos de MySQL.

Reinicio

Para mantener en buena salud nuestro servidor, no está mal provocar que se reinicie cada día a una hora en que en principio no haya usuarios conectados. Al script que realiza esta función le llamaremos reinicio.sh y contendrá:

#!/bin/bash
sudo shutdown -r now

Lo hacemos ejecutable y provocamos que se lance cada día a las 5 de la madrugada introduciendo la siguiente línea en nuestro crontab:

0 5 * * * /home/nombreusuario/tareasprogramadas/reinicio.sh

Una vez reiniciado el sistema, Ubuntu no entrará en ninguna sesión, pero sí que va a iniciar todos los servicios necesarios para que el servidor funcione correctamente (Apache, MySQL, etc.).

Mandando mails desde PHP y MySQL

Aunque no es para mantenerse en buena salud, se explica aquí porque se incorporará a nuestro crontab. Se trata de mandar, cada miércoles por la noche, un correo electrónico para recordar a los usuarios de la kini que deben mandarla, pero lógicamente sólo deben recibir el correo aquellos que aun no la han mandado. Para ello creamos primero el script de php que nos permitirá mandar los mails, que puede ser algo parecido a:

<?php

if($varseguridad==1){
include "parametrosdeconexion.php";
$result9=mysql_query("SELECT ... FROM ... WHERE ...", ...);

include "parametrosdeconexion.php";

while($row9=mysql_fetch_row($result9)){

$dest[]=$row9[0];

}
for ($i=0; $i<count($dest); $i++){
$desti=$desti.$dest[$i].",";
}
$desti=substr($desti,0,strlen($desti)-1);

$assum = 'Recordatorio kini';

$text = 'Hola qué tal. Parece que aún no has mandado la kini, si puedes hazlo, ok? Ya sabes lo de no dejar para dentro de media hora   lo que puedas hacer ahora, así que te recuerdo la web:'."\n\n".'http://www.kini.tk'."\n\n".'Y si no funciona prueba por:'."\n\n".'http://www.traba.org/kini'."\n\n\n".'Gracias!';

$text = wordwrap($text, 70);

$headers = 'From: ... <...@...>'."\r\n".'Content-type: text/plain; charset=utf8';

mail($desti, $assum, $text, $headers);

}
?>

Tenemos que poner el script php en nuestro directorio web, y luego crear el script que ejecutará el código php, que podría ser algo como:

#!/bin/bash
wget "http://www.traba.org/...php?varseguridad=1" -O /dev/null;

Luego ya sólo tenemos que hacer ejecutable el script e introducirlo en nuestro crontab:

30 20 * * wed /home/nombreusuario/tareasprogramadas/kini.sh

Resumen

  • Creamos todos los scripts necesarios y los guardamos en la carptea que queramos
  • Editamos el fichero de configuración de cron mediante:
sudo crontab -e
  • Y le añadimos, por ejemplo, la siguiente información:
30 3 * * mon,thu /home/nombreusuario/tareasprogramadas/update.sh
30 4 * * * /home/nombreusuario/tareasprogramadas/backup.sh
45 4 * * * /home/nombreusuario/tareasprogramadas/dump.sh
0  5 * * * /home/nombreusuario/tareasprogramadas/reinicio.sh
30 20 * * wed /home/nombreusuario/tareasprogramadas/kini.sh
  • Pulsamos Ctrl-O, {Return} y Ctrl-X y ya lo tenemos todo listo

Perfeccionando los backups

Se trata de conseguir que un solo script nos genere un fichero .tar.gz que contenga dentro suyo distintas carpetas, que puedan corresponder tanto a distintos directorios de ficheros como a dumps de MySQL. El script podría ser algo parecido a:

#!/bin/bash
data1=`date -u +%d-%m-%Y`;
cd /var
tar -cvf /mnt/winfat/Backups/$data1.tar www/* ; 
cd /home/acrida
tar -rvf /mnt/winfat/Backups/$data1.tar Documents/*;
cd /usr/lib
tar -rvf /mnt/winfat/Backups/$data1.tar cgi-bin/*;
cd /usr/share
tar -rvf /mnt/winfat/Backups/$data1.tar phpmyadmin/*;
mkdir "/mnt/winfat/Backups/etc/";
cp /etc/apache2/ /mnt/winfat/Backups/etc/ -R -L
cp /etc/php4/ /mnt/winfat/Backups/etc/ -R
cp /etc/mysql/ /mnt/winfat/Backups/etc/ -R
cp /etc/proftpd.conf /mnt/winfat/Backups/etc/ -R
cd /mnt/winfat/Backups
tar -rvf /mnt/winfat/Backups/$data1.tar etc/*
rm -r /mnt/winfat/Backups/etc/

mysqldump -u usuario -pcontraseña bd1  > /mnt/winfat/Backups/bd1.sql
mysqldump -u usuario -pcontraseña bd2  > /mnt/winfat/Backups/bd2.sql
mysqldump -u usuario -pcontraseña bd3  > /mnt/winfat/Backups/bd3.sql
mysqldump -u usuario -pcontraseña bd4  > /mnt/winfat/Backups/bd4.sql
mysqldump -u usuario -pcontraseña bd5  > /mnt/winfat/Backups/bd5.sql
mysqldump -u usuario -pcontraseña bd6  > /mnt/winfat/Backups/bd6.sql
mysqldump -u usuario -pcontraseña bd7  > /mnt/winfat/Backups/bd7.sql
mysqldump -u usuario -pcontraseña bd8  > /mnt/winfat/Backups/bd8.sql
mysqldump -u usuario -pcontraseña bd9  > /mnt/winfat/Backups/bd9.sql

mkdir "/mnt/winfat/Backups/sql";
cd /mnt/winfat/Backups/
mv *.sql /mnt/winfat/Backups/sql
tar -rvf $data1.tar sql/* ; 
rm -r /mnt/winfat/Backups/sql/

gzip /mnt/winfat/Backups/$data1.tar 

data0=`date -d "4 days ago" +%d-%m-%Y`;
rm /mnt/winfat/Backups/$data0.tar.gz

Con este script logramos tener un único fichero .tar.gz por día, que contendrá todos los backups que queramos y también los dumps.

Con don ventanas

Probado en:

  • M$ Window$ XP con SP1 (es necesario tener el SP1 instalado)

Peculiaridades

El proceso es muy similar pero:


Debe usarse VNC (RealVNC) en lugar de FreeNX

Hay algún software propietario como Serv-U, MDaemon o DirectUpdate.

Se pueden servir bases de datos bibliograficas con refman

CGIwithR no funciona

Migración de ventanas a pinguinos

dumps de mysql (accents...)

smf?

wiki?


Links

Por qué no te habré descubierto antes, link que parece muy completo aunque poco explotado de momento

Demos de distintas aplicaciones, per triar, remenar i escollir