Linux

nodeserver logo

Montar un servidor para node.js usando nodeserver

Llevo tiempo trabajando con node.js y la verdad es que es el entorno donde mas cómodo me siento. El problema que tiene node.js es que cuando buscas como montar un servidor, no tienes ejemplos reales, solo como escuchar el puerto 80.

Para mis webs uso un servidor de desarrollo propio llamado nodeserver que podemos encontrar tanto en github como en npm. Este servidor tiene varias ventajas fundamentales:

  • Al ser un desarrollo propio, me permite fácilmente ir añadiendo nuevas funcionalidades según las necesito.
  • Tiene soporte para proxy reverso, por ejemplo tener las webs en un servidor interno sin acceso público y traer las conexiones.
  • Soporte de gestión de procesos para node.js, por lo que los .js de node.js que vamos a arrancar como servidores, podemos arrancarlos automáticamente desde el servidor, así como pararlos o reiniciarlos.
  • Tiene soporte para páginas estáticas en html, con un listado de mime types en desarrollo. Esto nos permite por ejemplo, crear un sistema cookieless para un CDN sin un backend, solo configurando el servidor.
  • Soporte para páginas en PHP. Aunque aún no soporta elementos como mod_rewrite, en un futuro lo tendrá, por lo que en el típico VPS para gestionar pequeños proyectos, podemos prescindir de un NGINX o Apache y utilizar nodeserver para gestionar nuestras webs.

Vamos a ver como se instala y configura este servidor. Para esto, primero debemos tener instalado en nuestro sistema node.js, cualquier versión o io.js. Este servidor funciona desde la versión 0.10 de node.js, aunque lo mas recomendable es utilizar las últimas versiones, 4.0 o superiores.

Con nodejs ya instaldo, debemos instalar por npm nodeserver

[code lang=»bash»]$ sudo npm install nodeserver -g[/code]

De momento nodeserver solo cuenta con script de instalación para centos pero se irá ampliando a otros sistemas, esto no quiere decir que no se pueda utilizar, no se instalará como demonio del sistema.

[code lang=»bash»]$ sudo nodeserver install centos[/code]

Una vez instalado el script, que no es obligatorio, deberemos configurar el servidor. Para ello crearemos un json de configuración en /etc/nodeserver/nodeserver.config.

{
 "nodeserver": {
  "admin": {
   "active": [true|false],
   "port": admin-port-number,
   "user": "user-for-admin",
   "password": "hash-password"
  }
 },
 "sites": [{
  "name": "website name",
  "type": "node|cgi",
  "bindings": [
   "example.com:80",
   "www.example.com:80",
   "otherbindings:8080",
  ],
  "port": "internal port number for the project, do not repeat it. Only for node"
  "script": "absolute script for server.js for node or doc_root for php (cgi)",
  "security": {
   "certs": {
    "key": "/absolutepath/keycert.key",
    "cert": "/absolutepath/cert.cert",
    "ca": ["/absolutepath/ca.cert"]
   },
   "bindings": [
    "securehostforhttps.com:443",
    "www.securehostforhttps.com:443"
   ]
  },
 }, {
  "name": "php website",
  "type": "cgi",
  "bindings": [
   "myphpsite.com:80"
  ],
  "script": "/var/www/phpsite"
 }, {
  "name": "standar nodejs site",
  "type": "node",
  "bindings": [
   "standarnodejs.com:80"
  ],
  "port": "10001",
  "script": "/var/www/nodejs1/server.js"
 }, {
  "name": "secure nodejs site",
  "type": "node",
  "bindings": [
   "securenodejs.com:80"
  ],
  "port": "10002",
  "security": {
   "certs": {
    "key": "/absolutepath/keycert.key",
    "cert": "/absolutepath/cert.cert",
    "ca": ["/absolutepath/ca.cert"]
   },
   "bindings": [
    "securenodejs.com:443"
   ]
  },
  "script": "/var/www/nodejs2/server.js"
 }]
}

El json de configuración se divide en 2 keys: una de administración y otra de sitios web. La parte de administración indicamos si queremos activarlo o no, el puerto de escucha via web, usuario y contraseña. La contraseña viene en formato hash y podemos generar una utilizando el comando:

[code lang=»bash»]$ nodeserver password micontraseña[/code]

El resultado deberemos utilizarlo en la configuración de password.

Por otro lado tenemos los sites. Los sites tienen como configuración un nombre, un tipo cgi para estáticosphp o node para webs en node.js. Un array de bindings indicará dominio y puerto que vamos a utilizar de escucha. En los bindings podemos incluir patrones regulares, por ejemplo, para cuando tenemos subdominios que queremos gestionar desde un mismo backend. Un ejemplo sería «.+\.midominio.com:80» para capturar todos los subdominios de midominio.com en el puerto 80. El atributo port solo se utilizar en node.js y es un puerto interno de escucha para servidores node.js. El atributo script utiliza para node.js la ruta del script de arranque del proyecto o el document_root para webs en php o estáticas.

Una vez todo configurado, ya podemos arrancar y probar nuestro servidor.

[code lang=»bash»]$ sudo nodeserver start[/code]

Os animo a probarlo y a comentar vuestras experiencias, mejoras, etc. Esto es un ejemplo, de como prepararlo en un entorno real, pero se puede configurar nodeserver como servidor de desarrollo, tener una escucha con el parametro start-loop en lugar de start.

Añadir usuarios para el ftp al servidor proftpd

Proftpd es un servidor de ftp muy común en Linux que utiliza a los usuarios del sistema como listado de posibles usuarios a conectarse. Si intentamos conectarnos con un usuario del sistema a este servidor ftp, nos encontramos con que nos mostrará su carpeta home. Pongamos que tenemos un servidor web multidominio y queremos conectarnos con cada uno de estos usuarios a cada web sin que se mezclen las carpetas y para dar un poco de seguridad en este inseguro mundo de la informática ¿Como lo haríamos? La respuesta es bien sencilla y solo debemos seguir unos pequeños pasos para conseguirlo, debemos investigar para saber que grupos necesitamos, a que carpetas queremos acceder, crear los usuarios y establecer contraseñas de acceso.

  1. Lo primero que debemos averiguar es el usuario que utiliza nuestro servidor web. Esto es importante porque necesitamos saber a que grupo pertenece. Esto lo dejo un poco en el aire porque dependerá del servidor que ejecutemos, distribución que tengamos instalada, etc. Pero vamos a tomar como base www-data como usuario y grupo.
  2. Una vez tenemos el grupo, debemos tener claro cuales van a ser las carpetas donde queremos que nuestro usuario acceda, por ejemplo /usr/share/nginx/www y /usr/share/nginx/blog
  3. Creamos el usuario con el comando useradd con el siguiente formato: useradd -M -g grupo -d home_path nombre_usuario
  4. Estableceremos una contraseña a nuestro usuario con passwd usuario
Al final el resultado sería la ejecución de códigos similares a estos:
useradd -M -g www-data -d /usr/share/nginx/www usuario_www
useradd -M -g www-data -d /usr/share/nginx/blog usuario_blog
passwd usuario_www
passwd usuario_blog
Con esto estaríamos creando 2 usuarios, uno para www y otro para blog. Ambos usurarios pertenecerán al grupo www-data. Con el flag -M indicaremos expresamente que no cree la carpeta home, solo la definimos. ¿Por qué es importante el grupo www-data o el que corresponda obtenido del paso 1? Porque sino deberemos de estar cambiando permisos si queremos que nuestro código se ejecute, mientras que al ser del mismo grupo, no tendría muchos problemas.

Ahora ya podemos conectarnos a nuestro servidor ftp con los usuarios usuario_www y usuario_blog con las contraseñas que les indicamos en el passwd. Importante que ejecuteis y pongáis contraseña con passwd porque sino podreis intentar contectaros pero siempre dará error… a mi me paso 😀

Cambiar los saltos de linea rn de Windows a n de Linux, Unix, Mac OSX

Quienes tenemos que trabajar con código fuente entre varios sistemas operativos, a veces nos encontramos con un mas que desagradable problema, y es que los saltos de linea se desvirtuan. Al trabajar desde un sistema operativo nix, como pueden ser: Linux, Unix, Mac OSX (si ya se que es un Unix pero es por dejarlo claro) y mover esos ficheros a un Windows, salvo que editemos los ficheros con el avanzadísimo sistema del notepad, no tendremos mayores complicaciones. Realmente, si editamos a la inversa, es decir, llevando el archivo desde Windows a Mac OSX o a Linux, no tendremos tampoco muchos problemas, ya que los sistemas están preparados para soportar los saltos de linea. El problema real radica en los sistemas de control de versiones.

Pongo en situación para quien no lo conozca. En los sistemas operativos hay un caracter especial que determina el salto de linea, lo que ocurre cuando pulsamos la tecla intro en un editor de texto, como si de una maquina de escribir, baja un nivel, hasta la siguiente linea. El caracter de salto de linea se representa con n. Ahora vayamos a Windows y su similitud con las máquinas de escribir. En Windows no basta con hacer un salto de linea n, sino que ademas hay que hacer un retorno de carro. Probablemente muchos no sepan que significa un retorno de carro representado con r pero viene de cuando en las máquinas de escribir antiguas llegabas al final de la linea, con una palanca que había en el extremo, el carro (donde se posiciona para escribir en el papel) se desplazaba hasta el principio de la linea. Por tanto en Windows, el salto de linea se representa con rn es decir, retorno de carro (volver el cursor al principio de la linea) y un salto de linea.

Es por esto, que cuando tenemos un sistema de control de versiones como puede ser GIT o SVN y archivos de diferentes sistemas nos podemos encontrar con el problema de que nos dice que el 100% del archivo ha cambiado, solo porque ha cambiado el salto de linea y entiende que es una linea nueva. Esto por ejemplo pasa con el cliente de consola de GIT por poner un caso, pero ocurre en mas lugares. La solución es muy fácil, solo tenemos que ejecutar un script que nos corrija los molestos saltos de linea de Windows de la siguiente manera:

perl -i -pne "s/rn/n/g" archivo-a-corregir.html

Donde le decimos a perl que recorra cada linea del archivo en modo sed y que nos sustituya los rn de Windows por los n de Linux/Mac OSX. También podemos utilizar el comando sed tal que:

sed -i "s/rn/n/g" archivo-a-corregir.html

Cual utiliceis es a gusto de cada uno. Quizas el sed sea mejor, puesto que al ser un comando del sistema operativo y no perl directamente a alguno le gusta mas.

Gmail con soporte videochat para Linux

GMailLeo en el blog oficial de Gmail que ya han implementado el soporte del videochat para Linux, en concreto para Ubuntu y todas aquellas distribuciones basadas en debian y paquetes deb. Están preparando los paquetes instaladores para rpm, por lo que pronto, distribuciones tipo Red Hat, Fedora y similares, estarán pronto disponibles. Para quien no lo conozca, cuando usamos el chat de Gmail o GTalk web, tenemos la opción de utilizar videochat, para lo que se instalaban unos paquetes en nuestro ordenador a modo de plugin y así poder realizar una videoconferencia. Desde hace tiempo, Windows y Mac OS X estaban soportados y ahora por fin, Linux. Ya era hora, que una empresa como Google, que toda su tecnología se basa en Linux, incluyendo los 2 sistemas operativos Android y ChromeOS que también se basan en Linux, sacara las aplicaciones para este sistema. Para cuando Sketchup!!!

Mi maquina – Ubuntu Desktop 10.04

Estoy preparandome para mi nueva etapa de programador freelance y aparte de las ganas, se necesita un buen equipo con el que poder trabajar. Tengo varias opciones, pero me he decantado por instalar un Ubuntu en el pc. Por que un Ubuntu? sencillo, Ubuntu es una distribución libre de Linux, algunos dicen que es el el Windows de Linux. La realidad es que Ubuntu es, creo yo, es la distribución mas utilizada de Linux, esta basada en Debian y tiene una alta cantidad de paquetes de aplicaciones, de drivers, documentación, soporte, etc. aparte de todo esto, me permite trabajar con infinidad de tecnologías, que en principio son comunes, por ejemplo puedo trabajar con .net, php y java, que vienen siendo las mas utilizadas.

Para poder trabajar en el desarrollo web son necesarios 4 programas esenciales:

  • Monodevelop: ide de desarrollo para .net en general, tanto de aplicaciones de escritorio con gtksharp, como de asp.net
  • Chrome: navegador rápido, seguro y el inspector me gusta mas (que no digo que sea mejor) que el firebug de firefox
  • Firework: programa de edición gráfica vectorial, ideal para dar esos arreglillos a la web con 4 imágenes rápidas
  • Netbeans: por ser el ultimo no es el menos importante. Este ide es muy potente y permite trabajar con proyectos en c, c++, java, php, python, ruby, cosa me deja casi todo cubierto menos .net que lo cubre monodevelop

Con esto se puede trabajar perfectamente para realizar casi cualquier web en casi cualquier lenguaje y situación y realizar algún apaño rápido. Ademas de esto, le sumamos a Ubuntu configurado con Compiz, con los 4 escritorios en cubo, con buenísimos efectos 3d y cairo-dock para que funcione de manera similar a mac, tenemos un gran equipo de trabajo, liviano pero bonito, potente y gratuito y lo mejor de todo, compatible con tecnologías de Windows y Mac.

Os dejo unas capturas de pantalla de como se ve, aunque no han salido muy bien.

En breve Ubuntu 8.10

Aunque faltan todavia 16 dias para que salga a la luz ya esta disponible en fase beta la version 8.10 de Ubuntu. Para llevar un contador, he puesto un contador de la pagina de Ubuntu con una cuenta atras para que salga la versión estable.

Apache y directorios de usuarios (UserDir)

Recuerdo que en un trabajo en el que estube, cada uno tenia un usuario de Unix (era FreeBSD) y cada usuario tenia en su home una carpeta public_html para que no tuvieramos que usar todos y darnos permisos en /var/www.

Ahora al instalar Ubuntu en el portatil, quiero volver a poner todas las webs que tenia en local pero claro, no le voy a dar permisos a /var/www y aunque solo yo usare el portatil, no estaria de mas tener un sistema para que en la home de cada usuario exista una carpeta public_html en la cual cada usuario ponga las webs que quiera.

Este sistema que era desconocido para mi, se llama UserDir. Para instalarlo si estamos en Ubuntu, lo unico que tendremos que hacer es buscar en el Synaptic un paquete llamado libapache2-mod-ldap-userdir, o mas facil, buscar directamente «UserDir» y nos aparecera el paquete en cuestion. Una vez instalado, deberemos de ir a la carpeta /etc/apache2/mods-available y copiaremos o moveremos los archivos userdir.conf y userdir.load a la carepta /etc/apache2/mods-enabled. Una vez copiados los archivos, abriremos una consola y ejecutaremos el comando «/etc/init.d/apache2 restart» para reiniciar apache.

Una vez reiniciado apache, y copiados las configuraciones, ya lo tenemos todo listo. Ahora toca probarlo, asi que iremos a la home de nuestro usuario /home/nombreusuario y creamos una nueva carpeta public_html, una vez hecho esto, creamos un index.html de prueba, abrimos nuestro navegador y escribimos http://localhost/~nombreusuario y deberia de aparecernos nuestra pagina de inicio que creamos.

Asi de sopeton puede parecer algo complicado, pero luego son 2 tonterias que no nos llevara mas de 2 minutos configurarlo.

Aparte de esto, si abrimos el archivo userdir.conf, podremos modificar las reglas para cambiar el directorio public_html de la home y ponerlo en otro lugar.

Nueva etapa Linux

Hace ya un año, arregle un viejo ordenador que tenia en casa de mi madre y que abandone al independizarme. Cuando me puse a mirar cosas para arreglarlo empece a cambiar y cambiar y al final le cambie casi todo menos la caja de la torre, los 2 cd’s y un cacharrito que es un cenicero con mechero como el de los coches que va en un slot de cd que me regalo la parienta hace unos 5 años o asi.

Cuando me encontre con un ordenador la poya de pontente y como ya tenía el portatil con Windows XP y yo era feliz, decidí meterle primero PCLinuxOS y luego Ubuntu. El problema vino de mano de Microsoft (que sinverguenzas, siempre igual xD) ya que me pasaron un Windows Vista y la verdad queria verlo y juguetear con el (como me arrepiento) así que lo instale machacando lo que habia por pequeños problemas que tuve con Ubuntu. Al relativemente poco tiempo me cambie de trabajo y empece a programar con tecnologias de Microsoft por lo que entre el curro, el poco tiempo, las pocas ganas o pereza y que me venia bien tener el Windows con el Visual Studio y como no para hecharme un vicio de vez en cuando, abandone la idea de instalar Linux de nuevo.

Durante este año, mi portatil con unos 4 años va acumulando toda la mierda que puede acumular un Windows con actualizaciones, programas, bases de datos, mugres, mugres y mas mugres. Al final he decidido aplicarle la eutanasia a mi portatil para no verlo sufrir asi y lo he formateado. El formateo fue un cachondeo y ya prepare el post de como lo hice porque es digno de ver la que tuve que liar.

Al final consegui instalar un Ubuntu 7.10 y actualizar a Ubuntu 8.04 por internet. Todavia tengo que configurar muchas cosas, pero tiene todas las papeletas de que lo desinstale e instale un PCLinuxOS ya que me va mas rapdio y mejor.

La parte positiva es que vuelvo al mundo Linux de nuevo y no vuelvo solo ya que mi querida novia si quiere ver el correo y navegar por internet tendra que usar Linux y usar Firefox o WillyFox como lo llama ella. Soy perverso.

Ubuntu 7.04 Feisty Fawn con MP3 y Amarok

En los últimos años, mi único roce con Linux/Unix ha sido RedHat 9 como escritorio, y Fedora, Debian, FreeBSD y Solaris como servidor. Además de que la lista de distribuciones que he tocado de Linux/Unix es pequeña, realmente nunca me había planteado como hasta hace poco pasar a usarla en mi casa no como servidor de experimentos.

Mi primer roce de escritorio al estilo Windows (ya que RedHat 9 hace ya muchos años) fue PCLinux OS, que tuve que sustituir por mi actual Ubuntu 7.04 por razones de ejecución de algunas aplicaciones. Pero descubrí algunas aplicaciones en esta distribución que me gustaron mas que las que tiene Ubuntu, como es Amarok como reproductor de sonido.

Me instalo desde Synaptic Amarok e intento reproducir un par de canciones en mp3, resulta que me da un error. Investigando por internet encuentro que el error se debe a un problema de licencias entre Ubuntu y mp3.

La solución al problema de reproducción de mp3 en Ubuntu 7.04, es bien sencillo. Tenemos que buscar la librería libxine-extracodecs en Synaptic y la instalamos. Una vez instalada, ya podemos reproducir música en formato mp3 con Amarok y supongo, aunque no lo he probado, con el resto de reproductores.

amarok2-7screenie

Counter Strike Source en Linux con Wine

Bueno, hace poco renové desde 0 un ordenador que tenía por ahí. La verdad es que lo mismo me hubiera dado si lo hubiera comprado todo, porque una cosa llevo a la otra, y al final lo único que conservo de este viejo ordenador es la carcasa, grabadores de CD y DVD, así como el teclado y el ratón.

El caso es que decidí utilizar Linux en esta pedazo de máquina que me había montado. En el portátil y el otro ordenador lo tenía con Windows XP y Windows Vista no termina de convencerme, por lo que me he decidido por meterle un Linux.

Aunque me gusta trabajar con el ordenador, sigue viviendo dentro de mi el espíritu de ese niño jugón, así que después de configurar un poco el ordenador con los drivers propietarios de NVidia, que por cierto en Ubuntu 7.04 es un click de ratón gracias a su gestor de controladores restringidos, me puse a saco con Wine a ver si conseguía jugar al Counter Strike Source con Steam, a los que tantos vicios me he hechado en Windows.

Lo primero que hice fue buscar por internet, a ver como lo hacia la gente y lo que la gente hacia era sencillísimo, lo que me hizo pensar que realmente no lo hacían, sino que era el cancer de los Blogs, «el copy/paste». Cuando realmente intente lo que iban exponiendo blog por blog, me di cuenta que realmente era un copy/paste, ya que en todos ponía lo mismo y era super sencillo, solo le faltaba a alguno decir que Ubuntu ya venía con el Counter instalado. Los que realmente si merecían la pena eran para el Counter Strike 1.6, con el que no tenía ningún problema. Así que tocaba buscar y buscar por internet alguna solución.

Para el que le pueda servir de ayuda indicare paso a paso lo que hice para poder jugar al Counter Strike Source con Wine.

En primer lugar, me baje la última versión de Wine disponible, la 0.9.45 desde la página web del proyecto Wine, y compile los sources. Con esto conseguí mas bien poco, ya que si era capaz de arrancar Steam, pero no el Counter Strike Source. Fue un tiempo muy bonito desperdiciado, ya que el tiempo que perdí en compilar y en instalar dependencias de fuentes, pudo ser como 2 o 3 días.

Pantallazo de Counter Strike Source en Linux

Visto que la última versión de Wine no me iba a ayudar, o yo no sabia decirle que me ayudara, hice un «make uninstall» y la borre. Así que busque por el Sysnaptic para instalar la versión de Wine de los repositorios de Ubuntu que era la versión 0.9.33. Con esta versión conseguí un gran paso, ya que ahora si que podía arrancar el Counter Strike, pero tenia que elegir, entre poder jugar sin sonido, o tener sonido pero no poder jugar. Aquí fue cuando me puse a buscar por un loco por internet y encontré dos posibles soluciones, una pagina web que ofrece los paquetes .deb de la última versión de Wine y el Cedega, un fork de Wine que esta orientado a juegos.

Lo primero que hice fue tirarle a Cedega 6, que tenia hasta un panel para instalar y jugar y la verdad tenia muy buena pinta. Porque no me quede con Cedega, pues porque por un lado es de pago (que si merece la pena me da igual pagar) y por otro lado porque no fui capaz de correr el Counter Strike.

Ya solo me quedaba una ultima opción antes de rendirme, era esa página donde se encontraban los últimos paquetes .deb de Wine, así que instale la versión 0.9.45 con un solo click de ratón y arranque mi Steam y posteriormente el Counter Strike Source, y ¡¡¡por fin!!! pude jugar con sonido, conectarme a partidas a internet. Como nota decir que si instalais Steam y no os aparecen las letras, deberéis copiar la fuente Tahoma a la carpeta Windows/fonts del directorio de wine.

Para hacer una comparativa del Counter Strike Source en Windows XP y en Linux con Wine 0.9.45, puedo deciros que en Windows las texturas tienen mayor calidad, en Linux no me permite cambiar las opciones de vídeo, en Linux es infinitamente más rápido en cuanto a conexiones, cambio de servidor, etc. y por último en Linux no tiene reflejos de agua o cristales y tampoco tiene luces dinámicas como la linterna y similares. Así que la conclusión es que como en Windows no va en ningún lado, pero que en Wine 0.9.45 va bastante bien.

También os comento un único problema, con Beryl el Counter Strike Source me daba problemas, así que lo cambie por Compiz para que no me diera problemas por ejemplo al cambiar de cara del cubo.

Pantallazo de Counter Strike Source en Linux con Compiz
Scroll al inicio