node モジュール node-http-proxy を使い、リバースプロキシ経由でsails.jsを使っている環境があるのですが、Sails.io(Socket.io)への接続がうまくいかずどう対応するのか悩みましたが、実行しているポートへ直接呼び出すことで接続できました。

Version: Sails.js@v0.9.6

/assets(/linker)/js/app.js

(function (io) {

  // as soon as this file is loaded, connect automatically,
  //var socket = io.connect();
  var socket = io.connect(“/hogehoge", {port: 起動ポート});

view(layout.ejs) 側で起動ポートを取得します。

/views/layout.ejs

<%  
  // for reverse-proxy
  var tag = "<script/>window.sailsPort = " + Hook.config.port + "</script/>" %>
<%- tag %>  

あと、リバースプロキシとは直接関係ないですが io.connect を色んなページで取り回したいので window.Socketer を設定しています。

# Socketer.coffee
do(w=window,d=document) ->

  # ref http://qiita.com/Layzie/items/465e715dae14e2f601de
  _is = (type, obj) ->
    clas = Object.prototype.toString.call(obj).slice(8, -1)
    return obj isnt undefined && obj isnt null && clas is type

  # log output
  log = ->
    if (typeof console isnt 'undefined')
      console.log.apply(console, arguments);

  authority = ->
    href = location.href.match(/^(https?):\/{2,3}(([0-9a-zA-Z\.\-:]+?):?([0-9]*?))\//i)
    return {
      input: href[0]
      url: href[2]
      protcol: href[1]
      fqdn: href[3]
      port: href[4]
    }

  domain = ->
    ref = authority()
    base = ref.protcol + "://" + ref.fqdn + ":" + ref.port
    if( base != ref.url and ref.port == "" )
      port = if ref.protcol == "https" then "433" else "80"
      base = base + port

    return base

  ## WebSocket room implements
  class Socketer

    constructor: ( @io, details ) ->

      @self = this
      @details = details
      @domain = domain()
      @volatile= new Array()
      return

    getSocket: ( room ) ->

      if ( ! _is( "String", room ) )
        room = ""

      sockets = @io.sockets[@domain]
      return if sockets then sockets.namespaces[room] else undefined

    bind: ( room="", connect=(->), disconnect=(->) ) ->

      if ( _is( "Function", room ) )
        disconnect = connect
        connect = room
        room = ""

      if ( ! _is( "String", room ) )
        room = ""

      socket = @self.getSocket(room)

      if( socket )
        log( "Already Connecting...", socket )
        if( socket.socket.isClosed )
          socket.socket.open()
        socket.socket.connect(connect)
        return @self

      if room == ""
        socket = @io.connect( undefined, @self.details )
      else
        socket = @io.connect( room, @self.details )

      socket.on "connect", ->

        if( _is("Function",connect) )
          # callback
          setTimeout( ->
            connect( io.sockets, socket )
          ,1)

      socket.on "disconnect", ->
        if( _is("Function", disconnect) )
          setTimeout( ->
            disconnect( io.sockets, socket )
          ,1)

      return @self

    unbind: (room="") ->

      socket = @self.getSocket(room)
      if( socket )
        socket.disconnect()
      return @self

  ## end class Socketer

  instance = null
  w.Socketer = (io, details) ->
    if ( instance )
      instance
    else
      instance = new Socketer(io, details)