Hiparco

Recetas y trucos de GNU/Linux e informática en general

Alojado en http://guimi.net

Descargar vídeos de la red (clive)

Existe una pequeña herramienta muy cómoda para descargar vídeos de la red. Sirve en youtube, google video, last.fm, dailymotion, vimeo…

Su uso es muy sencillo:
$ clive -f best http://www.youtube.com/watch?v=oHg5SJYRHA0

fetch http://www.youtube.com/watch?v=oHg5SJYRHA0 ...done.
verify video link ...done.
RickRollD.flv  100%   7.7M /  7.7M                              57.1K/s  02m18s

La opción “-f best” permite descargar la versión con el formato de vídeo de mejor calidad. Si queremos descargar solo el audio podemos hacer,
OGG:

$ clive --exec="ffmpeg -i %i -acodec libvorbis %i.ogg;" -e http://www.youtube.com/watch?v=oHg5SJYRHA0

MP3:

$ clive --exec="ffmpeg -i %i %i.mp3;" -e http://www.youtube.com/watch?v=oHg5SJYRHA0

Nota: has sido rickrolleado ;-)

Video, download, clive, youtube

Redirección web

Para redirigir de un URL a otro lo mejor es (de mejor a peor):

  1. Si gestionas el servidor, que sea éste el que lo haga
    En Apache: Redirect /servicio http://dominio.com/servicio
    rewrite también funcionaría (Ver ejemplos a continuación)

  2. Si no gestionas el servidor, pero dispones de un lenguaje de scripting, envía cabeceras
    En PHP <? Header("Location:http://dominio.com";); ?>

  3. Si vas a hacer una página web en un servidor que no controlas y que no tiene scripting
    • Cambia de servidor ;-)
      o bien

    • En HTML<META HTTP-EQUIV="REFRESH" CONTENT="0;URL=https://dominio.com";>
      Atención: Este sistema aunque cumple los estándares y funciona esta
      altamente desaconsejado

    Ejemplos de rewrite:
    – Redirigir https a http (.htaccess en la raiz)

    RewriteEngine On
    RewriteCond %{HTTPS} =on
    
    RewriteRule ^(.*) http://%{SERVER_NAME}/$1 [R]
    

    – Redirigir https a http (.htaccess dentro de /segura)

    RewriteEngine On
    RewriteCond %{HTTPS} !=on
    
    RewriteRule ^(.*) https://%{SERVER_NAME}/segura/$1 [R,L]
    

Instalación de Apache y Tomcat en RHEL AS 2.1

OBJETIVO

Se pretende poder montar webs dinámicas y estáticas independientes en una sola máquina.



Descargas

  • De http://jakarta.apache.org/tomcat/
    • Tomcat 5.5.7
      • jakarta-tomcat-5.5.7.tar.gz
    • Administración de Tomcat
      • jakarta-tomcat-5.5.7-admin.tar.gz
    • Compatibilidad con sdk y jre 1.3
      • jakarta-tomcat-5.5.7-compat.tar.gz
    • Fuentes (para obtener el módulo conector con apache)
      • jakarta-tomcat-5.5.7-src.tar.gz
    • Del repositorio de RH
      • Apache 1.3.27
        • apache-1.3.27-9.ent.i386.hdr
        • apache-1.3.27-9.ent.i386.rpm
      • Java JRE 1.3.1 de IBM
        • IBMJava2-JRE-1.3.1-3.i386.hdr
        • IBMJava2-JRE-1.3.1-3.i386.rpm
      • Java SDK 1.3.1 de IBM
        • IBMJava2-SDK-1.3.1-3.i386.hdr
        • IBMJava2-SDK-1.3.1-3.i386.rpm



Instalación básica

  • Instalamos los paquetes de RH
    • rpm -ihv apache-1.3.27-9.ent.i386.rpm
    • rpm -ihv IBMJava2-JRE-1.3.1-3.i386.rpm
    • rpm -ihv IBMJava2-SDK-1.3.1-3.i386.rpm
  • Descomprimimos los paquetes de Tomcat (por este orden)
    • tar xvzf jakarta-tomcat-5.5.7.tar.gz
    • tar xvzf jakarta-tomcat-5.5.7-admin.tar.gz
    • tar xvzf jakarta-tomcat-5.5.7-compat.tar.gz
    • tar xvzf jakarta-tomcat-5.5.7-src.tar.gz



Configuración Básica

Creamos un script de arranque para tomcat en /etc/init.d

----------- Fichero /etc/init.d/tomcat ------------
#!/bin/bash
#
# Fichero de inicio de Tomcat
#
# Guimi - 2005/02
#

# Path de tomcat
tomcat_dir=/opt/jakarta-tomcat
tomcat_bin=$tomcat_dir/bin
prog=Tomcat
RETVAL=0
export JAVA_HOME=/opt/java

# Inicio
start() {
        echo -n $"Iniciando $prog: "
        $tomcat_bin/startup.sh
        RETVAL=$?
        echo
        return $RETVAL
}
stop() {
        echo -n $"Parando $prog: "
        $tomcat_bin/shutdown.sh
        RETVAL=$?
        echo
        return $RETVAL
}

# Procedemos segun el argumento
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
  *)
        echo $"Uso: $prog {start|stop|restart}"
        exit 1
esac

exit $RETVAL
---------------------------------------------------
- Configuramos el autoarranque
    cd /etc/rc3.d/
    ln -s ../init.d/tomcat S65tomcat
    ln -s ../init.d/httpd S66httpd
- Configuramos los usuarios de Tomcat
--- Fichero $CATALINA_HOME/conf/tomat-users.xml ---
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="manager"/>
  <role rolename="admin"/>
  <user username="webdinamica" password="a-ti-te-lo-voy-a-decir" roles="manager"/>
  <user username="admin" password="a-ti-te-lo-voy-a-decir" roles="admin,manager"/>
</tomcat-users>
---------------------------------------------------


Primeras pruebas

Tomcat no funciona bien con IBMJava2-JRE-1.3.1-3 así que tenemos que bajar y compilar j2sdk1.4.1_06 y hacer que /opt/java apunte a /opt/j2sdk1.4.1_06.

En este momento ya deben funcionar tanto Apache como Tomcat

- Para las pruebas, en la máquina cliente en /etc/hosts o en C:\WINNT\system32\drivers\etc\lmhosts o en donde sea configuramos que tanto 'maquina' como 'prueba' como 'dinamica' apunten a la ip de nuestro servidor

- Arrancamos los servicios

    /etc/init.d/tomcat start
    /etc/init.d/httpd start

- Probamos con un navegador

    http://maquina (Apache)
    http://maquina:8080 (Tomcat)


Seguridad local de la máquina

- Creamos usuarios y grupos adecuados
    groupadd -g 600 www
    useradd webdinamica -G www

- Quitamos las aplicaciones de ejemplo de Tomcat (todas menos la de administración 'ROOT')

    mv $CATALINA_HOME/webapps $CATALINA_HOME/old-webapps
    mv $CATALINA_HOME/old-webapps/ROOT $CATALINA_HOME/webapps/

- Configuramos los permisos de Tomcat

    mkdir -p $CATALINA_HOME/webapps/webdinamica
    cd $CATALINA_HOME/webapps/webdinamica
    chown -R webdinamica:www .
    find . -type f -exec chmod 644 \{\} \;
    find . -type d -exec chmod 755 \{\} \;


Configuramos en Apache los Virtual Host

----------- Fichero httpd.conf (parte) ------------
NameVirtualHost *

<VirtualHost *>
    ServerName maquina
    DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *>
    ServerName prueba
    DocumentRoot /var/www/prueba
</VirtualHost>
---------------------------------------------------
- Creamos /var/www/html/index.html si no existe
- Creamos /var/www/prueba/index.html si no existe
http://maquina debe devolvernos /var/www/html/index.html
http://prueba debe devolvernos /var/www/prueba/index.html


Configuramos en Tomcat las máquinas virtuales (JVM) con el comando Host

----------- Fichero server.xml (parte) ------------
      <Host
          appBase="webapps"
          name="localhost">
      </Host>
      <Host
          appBase="webappsdinamica"
          name="prueba">
      </Host>
---------------------------------------------------
- Creamos $CATALINA_HOME/webapps/ROOT/index.html e index.jsp si no existen
- Creamos $CATALINA_HOME/webappsdinamica/ROOT/index.html e index.jsp si no existen
http://maquina:8080 debe devolvernos $CATALINA_HOME/webapps/ROOT/index.jsp (Administración Tomcat)
http://prueba:8080 debe devolvernos $CATALINA_HOME/webappsdinamica/ROOT/index.jsp (web dinámica 1)


Conectar Apache con Tomcat

Este es el gran problema.
En este caso RH EL 2.1 no soporta Tomcat, sí lo hace la versión 3. Pero no podemos pasar a la versión 3 porque el SecurePath de HP no soporta RH EL 3.
En definitiva, hay que compilar el módulo mod_jk. Puestos a no tener soporte igualmente y dada la dificultad de compilar y utilizar un mod_jk para Apache 1.3 (RH EL 2.1) y Tomcat 5.5 (no soportado), finalmente hemos compilado e instalado Apache httpd2.0.52. (para esto hay extensa bibliografía).

- Eliminamos Apache 1.3

    - rpm -e apache

Recapitulemos:

  • Tenemos Apache2 en /usr/local/apache2
  • Tenemos j2sdk en /opt/java/
  • Tenemos Tomcat5.5 en /opt/jakarta-tomcat/
  • Tenemos mod_jk2.so en /usr/local/apache2/modules/mod_jk2.so

- Cargamos el módulo mod_jk2 en Apache2
- Al final de la Sección 1 de httpd.conf ponemos

      LoadModule jk2_module modules/mod_jk2.so

(Apache2 debe estar compilado con DSO. Ejecutando httpd -l debe aparecer mod_so.c)

Una vez se tiene el conector, se puede hacer que Tomcat sirva los ficheros .jsp fácilmente con el sieguiente fichero workers2.properties, en $APACHE_BASE/conf

----------- Fichero workers2.properties -----------
[shm]
info=Scoreboard. Required for reconfiguration and status with multiprocess servers.
file=anon

# Defines a load balancer named lb. Use even if you only have one machine.
[lb:lb]

# Canal de comunicaciones localhost
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1

# worker para 'localhost'
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
group=lb

[uri:/*.jsp]
group=lb
---------------------------------------------------

Pero las aplicaciones en JSP a veces se desarrollan con rutas relativas a ficheros y además queremos tener varios hosts, unos jsp y otros no, en la misma máquina y sin mezclarse, por ello hay que configurar VirtualHost en Apache y relacionar los de aplicaciones JSP con maquinas virtuales (JVM) de Tomcat.



Conectar VirtualHost de Apache con JVM de Tomcat

Situación de ficheros:

  • Apache2 en /usr/local/apache2
  • j2sdk en /opt/java -> j2sdk1.4.1_06
  • Tomcat5.5 en /opt/jakarta-tomcat -> jakarta-tomcat-5.5.7
  • mod_jk2.so en /usr/local/apache2/modules/mod_jk2.so
  • web estática 1 en /var/www/html
  • web estática 2 en /var/www/prueba
  • administración Tomcat en /opt/jakarta-tomcat/webapps/ROOT
  • web dinámica 1 en /var/www/webapps/webdinamica1
  • web dinámica 1 en /var/www/webapps/webdinamica2
----------- Fichero httpd.conf (parte) ------------
NameVirtualHost *

<VirtualHost *>
ServerName localhost
DocumentRoot /var/www/html
</VirtualHost>

<VirtualHost *>
ServerName prueba
DocumentRoot /var/www/prueba
</VirtualHost>

<VirtualHost *>
ServerName dinamica
DocumentRoot /var/www/webapps/webdinamica1

# Al enviar TODO al Tomcat realmente no utiliza el DocumentRoot
<Location "/*">
JkUriSet worker ajp13:dinamica:8010
</Location>
</VirtualHost>

---------------------------------------------------

----------- Fichero workers2.properties -----------
[shm]
info=Scoreboard. Required for reconfiguration and status with multiprocess servers.
file=anon

# Defines a load balancer named lb. Use even if you only have one machine.
[lb:lb]

# Canal de comunicaciones localhost
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1

# Canal de comunicaciones 'dinamica'
[channel.socket:dinamica:8010]
port=8010
host=127.0.0.1

# worker para 'localhost'
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
group=lb

# worker para 'dinamica'
[ajp13:dinamica:8010]
channel=channel.socket:dinamica:8010
group=lb
---------------------------------------------------

----------- Fichero server.xml (parte) ------------
<Service
name="Catalina">
<!-- Connector web de Tomcat -->
<Connector
port="8080"
redirectPort="8443">
</Connector>

<!-- Connector de Apache -->
<Connector
port="8009"
protocol="AJP/1.3"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"
redirectPort="8443">
</Connector>
<Engine
defaultHost="localhost"
name="Catalina">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
<Host
appBase="webapps"
name="localhost">
</Host>
<Host
appBase="webappsdinamica"
name="prueba">
</Host>
</Engine>
</Service>

<Service
name="Dinamica">
<!-- Connector con servidor web -->
<Connector
port="8010"
protocol="AJP/1.3"
protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler"
redirectPort="8443">
</Connector>
<Engine
defaultHost="dinamica"
name="Dinamica">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"/>
<Host
appBase="webappsdinamica"
name="dinamica">
<Context docBase="/var/www/webapps/webdinamica1" path="">
</Context>
</Host>
</Engine>
</Service>
---------------------------------------------------

http://maquina debe devolvernos /var/www/html/index.html
http://prueba debe devolvernos /var/www/prueba/index.html
http://maquina:8080 debe devolvernos $CATALINA_HOME/webapps/ROOT/index.jsp (Administración Tomcat)
http://prueba:8080 debe devolvernos $CATALINA_HOME/webappsdinamica/ROOT/index.jsp (web dinámica 1)
http://dinamica debe devolvernos /var/www/webapps/webdinamica1/index.jsp (web dinámica 1)



Últimos ajustes

Podemos configurar un manager para la web dinámica 1 creando el fichero $CATALINA_HOME/conf/Dinamica/dinamica/manager.xml como sigue:

-------------- Fichero manager.xml ----------------
<?xml version="1.0" encoding="UTF-8"?>
<Context
debug="0"
docBase="/opt/jakarta-tomcat-5.5.7/server/webapps/manager"
privileged="true">
<ResourceLink
global="UserDatabase"
name="users"
type="org.apache.catalina.UserDatabase"/>
<WatchedResource>/opt/jakarta-tomcat/conf/context.xml</WatchedResource>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>META-INF/context.xml</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/Catalina/localhost/context.xml.default</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/context.xml</WatchedResource>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>META-INF/context.xml</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/Catalina/localhost/context.xml.default</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/context.xml</WatchedResource>
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>META-INF/context.xml</WatchedResource>
<WatchedResource>/opt/jakarta-tomcat/conf/Catalina/localhost/context.xml.default</WatchedResource>

<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1"/>

</Context>
---------------------------------------------------


Esto nos permite gestionar nuestra web dinámica 1 en http://dinamica/manager/html o a traves de la interfaz http://dinamica/manager (más info en http://dinamica/manager/manager-howto.html).
El último valor hace que solo se pueda acceder al manager localmente.

Podemos afinar un poco más la configuración haciendo que Apache solo redirija a Tomcat las páginas dinámicas y el manager, mejorando claramente la eficiencia. Ade más podemos configurar un alias y un log propio.

----------- Fichero httpd.conf (parte) ------------
<VirtualHost *>
ServerName www.dinamica.com
ServerAlias dinamica.com
CustomLog logs/dinamica_access_log combined
DocumentRoot /var/www/webapps/webdinamica
<Location "/*.jsp">
JkUriSet worker ajp13:dinamica:8010
</Location>
<Location "/manager">
JkUriSet worker ajp13:dinamica:8010
</Location>
</VirtualHost>
---------------------------------------------------

Para acabar es recomendable crear scripts de inicio y parada de Apache y Tomcat en el sistema de arranque de la máquina.