3

How am i supposed to run my node.js code on apache server, which is currently using localhost and port 5000 to apache server,port 8080. This is my serverside code chatserver.js

var httpd = require('http').createServer(handler);
var io = require('socket.io').listen(httpd);
var fs = require('fs');

httpd.listen(5000);

function handler(req, res) {
  fs.readFile(__dirname + '/index.html',
    function(err, data) {
      if (err) {
       res.writeHead(500);
       return res.end('Error loading index.html');
      }

      res.writeHead(200);
      res.end(data);
    }
  );
}

io.sockets.on('connection', function (socket) {
  socket.on('clientMessage', function(content) {
    socket.emit('serverMessage', 'You said: ' + content);
    socket.broadcast.emit('serverMessage', socket.id + ' said: ' + 
      content);
  });
}); 

This is my client side code. index.html

<html>
  <head>
    <title>Node.js WebSocket chat</title>
    <style type="text/css">
      #input {
        width: 200px;
      }
      #messages {
        position: fixed;
        top: 40px;
        bottom: 8px;
        left: 8px;
        right: 8px;
        border: 1px solid #EEEEEE;
        padding: 8px;
      }
    </style>
  </head>

  <body>

    Your message:
    <input type="text" id="input">

    <div id="messages"></div>

    <script src="http://localhost:5000/socket.io/socket.io.js"></script>
    <script type="text/javascript">
      var messagesElement = document.getElementById('messages');
      var lastMessageElement = null;

      function addMessage(message) {
        var newMessageElement = document.createElement('div');
        var newMessageText = document.createTextNode(message);

        newMessageElement.appendChild(newMessageText);
        messagesElement.insertBefore(newMessageElement, 
          lastMessageElement);
        lastMessageElement = newMessageElement;
      }

      var socket = io.connect('http://localhost:5000');
      socket.on('serverMessage', function(content) {
        addMessage(content);
      });

      var inputElement = document.getElementById('input');

      inputElement.onkeydown = function(keyboardEvent) {
        if (keyboardEvent.keyCode === 13) {
          socket.emit('clientMessage', inputElement.value);
          inputElement.value = '';
          return false;
        } else {
          return true;
        }
      };
    </script>

  </body>
</html>
Gyanesh Gouraw
  • 1,991
  • 4
  • 23
  • 31
  • possible duplicate of [Running Node.js in apache?](http://stackoverflow.com/questions/14369865/running-node-js-in-apache) – André Dion Feb 20 '14 at 12:59

1 Answers1

1

You will need to use a reverse proxy configured in the httpd.conf file. I use nginx to do this as it is a little faster and more capable than apache2.

This is my nginx config file:

server {
    listen 80;
    server_name personal.dev.x.onmylemon.co.uk;

    access_log  /var/log/nginx/dev.x.oml.access.log;
    error_log   /var/log/nginx/dev.x.oml.error.log;

    location / {
        # This is the url to your node app on the localhost
        proxy_pass              http://localhost:30450;

        proxy_set_header        Host $host;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

        proxy_connect_timeout   150;
        proxy_send_timeout      100;
        proxy_read_timeout      100;

        proxy_buffers           4 32k;

        client_max_body_size    8m;
        client_body_buffer_size 128k;
    }
}

There is some documentation here for setting up a reverse proxy in apache.

onmylemon
  • 724
  • 8
  • 25