2011-01-09 58 views
31

Estoy tratando de darme la vuelta node.js ...node.js corriendo junto con Apache PHP?

Estoy muy contento con mi configuración de LAMP ya que actualmente cumple mis requisitos. Aunque quiero agregar algunas características en tiempo real a mi aplicación PHP. Como mostrar todos los usuarios que actualmente están conectados a mi sitio y posibles funciones de chat.

No quiero reemplazar mi back-end PHP, pero sí quiero soluciones escalables en tiempo real.

1. ¿Puedo lanzar node.js a la mezcla para satisfacer mis necesidades sin reconstruir toda la secuencia de comandos del lado del servidor de la aplicación?

2. ¿Qué mejor podría node.js servir a mis funciones de "chat" y "sesión iniciada actualmente"?

Excelente para escuchar sus puntos de vista!

W.

Respuesta

22

Le sugiero que utilice Socket.io junto side node.js. Instale y descargue las librerías desde http://socket.io/. Puede ejecutarlo junto a su servidor Apache sin problemas.

En primer lugar crear un servidor de nodo:

var http = require('http') 
    , url = require('url') 
    , fs = require('fs') 
    , io = require('../')//path to your socket.io lib 
    , sys = require(process.binding('natives').util ? 'util' : 'sys') 
    , server; 

server = http.createServer(function(req, res){ 
    var path = url.parse(req.url).pathname; 
}), 

server.listen(8084);//This could be almost any port number 

En segundo lugar, ejecutar el servidor desde la línea de comandos usando:

node /path/to/your/server.js 

En tercer lugar, se conectan a la toma usando js lado del cliente:

var socket = new io.Socket(null, {port: 8084, rememberTransport: false}); 
socket.connect(); 

Deberá incluir también el lado del cliente de socket.io lib.

enviar datos desde el lado del cliente al servidor de nodo usando:

socket.send({data:data}); 

Sus server.js también deben tener funciones para el procesamiento de solicitudes:

io.on('connection', function(client){ 
//action when client connets 

client.on('message', function(message){ 
    //action when client sends msg 
    }); 

    client.on('disconnect', function(){ 
    //action when client disconnects 
    }); 
}); 

Hay dos formas principales para enviar datos desde el servidor al cliente:

client.send({ data: data});//sends it back to the client making the request 

y

client.broadcast({ data: data});//sends it too every client connected to the server 
+3

Hola @Kit gracias por esta gran respuesta. Todavía estoy un poco confundido acerca de la conexión a la parte de Apache. ¿Te importaría agregar algunos comentarios/código a tu respuesta para que la parte de Apache sea más clara? –

+1

¿Qué pasa con la misma política de origen? No podrás hacer llamadas a un puerto diferente usando socket io, ¿no? – Zaptree

+0

Gracias ayudó mucho al empezar –

2

sospecho el chat, así como el registrado en el listado funcionaría a través de Ajax.

La parte de chat sería bastante fácil de programar en Node.js, utilice uno de los mysql modules para Nodo para conectarse a su base de datos existente y consultar información de inicio de sesión y tal y luego hacer todo el chat real a través de Node.js, I Le recomendamos que consulte Socket.io, ya que hace que la comunicación entre navegador/Node.js sea realmente trivial, esto debería permitirle centrarse en la lógica del chat real.

Además, puedes echar un vistazo al chat demo "oficial" de Node.js, para inspirarte.

En lo que respecta a la parte actualmente en línea, esto nunca es fácil de implementar, ya que todo lo que puede hacer es mostrar algo como "5 usuarios activos en los últimos X minutos".

Por supuesto, podría agregar fácilmente algunos Ajax que consulta el servidor de chat y mostrar la lista de usuarios desde esa página.

O está completamente loco y establece una conexión Socket.io para cada visitante y lo supervisa de esta manera, aunque es cuestionable si vale la pena el esfuerzo.

+0

¿No se vería obligado a ejecutar el servidor node.js en otro puerto porque el puerto 80 ya está siendo utilizado por Apache o lo tiene vinculado a otra IP? Luego se encontraría con problemas entre dominios si alguna vez quisiera comunicarse con el servidor de chat y su aplicación web actual. Podría estar equivocado, pero creo que esta fue esencialmente su pregunta. –

+0

Depende, debe ser capaz de pasarlo sin tener que cambiar el URL: http://arguments.callee.info/2010/04/20/running-apache-and-node-js-together/ –

+2

Interesante encontrar. Uno de los comentarios en esa publicación sugiere hacer lo contrario. Es decir. Tener node.js hacer el proxy a Apache en lugar de hacerlo al revés. Si utiliza Apache como proxy para node.js, Apache generará un nuevo proceso en cada solicitud y lo reenviará a node.js. –

0

Estoy corriendo un servidor WSS (WebSocket seguro), junto con mi configuración LAMP.

Node.js se puede ejecutar fácilmente junto con cualquier otro servidor web (apache) que desee. En el ejemplo de @KitCarrau, deja que el nodo se ejecute en el puerto 8084, que es donde se está ejecutando y escuchando, no 80 o 443, etc. (generalmente, los usa apache). Pero aún puede usar el mismo puerto para servir también http/https (en mi caso solo indicando cierta información conf y general de que el servicio está activo).

Comenzar desde la consola no es la mejor manera (de forma remota, el nodo se detiene al cerrar la consola). Yo recomiendo echar un vistazo a Running node as service

fácil hacer un seguimiento en tiempo real de registro (log con console.log ("hola"); en su aplicación) con:

tail -f /var/.../SocketServer.log 

Script de ejemplo (node- server.conf):

author ....  
description "node.js server"  
# used to be: start on startup 
# until we found some mounts weren't ready yet while booting: 

start on started mountall 
stop on shutdown 

# Automatically Respawn: 
respawn 
respawn limit 99 5 

# Max open files are @ 1024 by default. Bit few. 
limit nofile 32768 32768 

script 
    # Not sure why $HOME is needed, but we found that it is: 
    export HOME="/root" 

    exec node /var/.../SocketServer.js >> /var/www/node/.../SocketServer.log 2>&1 
end script 

post-start script 
    # Optionally put a script here that will notifiy you node has (re)started 
    # /root/bin/hoptoad.sh "node.js has started!" 
    echo "\n*********\nServer started\n$(date)\n*********" >> /var/.../SocketServer.log 

end script