2013-03-14 126 views
0

我想在Apache服務器的端口80上運行我的node.js應用程序。我曾嘗試2種方法一個通過Apache:如何使用http-proxy在端口80上運行node.js應用程序?

<VirtualHost *:80> 
    ServerName domainName.com 
    ServerAlias www.domainName.com 

    ProxyRequests off 

    <Proxy *> 
     Order deny,allow 
     Allow from all 
    </Proxy> 

    <Location /> 
     ProxyPass http://domainName:8080 
     ProxyPassReverse http://domainName:8080 
    </Location> 
</VirtualHost> 

當我使用這個我在Chrome控制檯中看到502 proxy error。服務器找不到我的CSSSocket.io和其他JS文件。

更新:我通過將http://domainName.com:8080/放在鏈接前解決了CSS和正常.js文件的這個錯誤。但問題仍然存在socket.io!無法找到Socket.io!

,第二種方法是使用http-proxy模塊(這是我發現的例子,請參見下面這個職位的評論):這是在這裏解釋

var http = require('http'), 
httpProxy = require('http-proxy'), 
proxyServer = httpProxy.createServer ({ 
    hostnameOnly: true, 
    router: { 
     'domain.com':  '127.0.0.1:81', 
     'domain.co.uk':  '127.0.0.1:82', 
     '127.0.0.1':  '127.0.0.1:83' 
    } 
}); 

proxyServer.listen(80); 

how to put nodejs and apache in the same port 80

我不不知道如何讓我的代碼工作,因爲我使用的是Express

這是我的代碼相關部分:

var express = require('express'); 
var http = require('http'); 
var io = require('socket.io'); 
var connect = require('connect'); 
var sanitize = require('validator').sanitize; 
var app = express(); 
var MemoryStore = express.session.MemoryStore; 
var server = http.createServer(app); 

var sessionStore = new MemoryStore(); 
var io = io.listen(server); 
app.configure(function() { 
    //app.use(express.logger()); 
    app.use(express.cookieParser()); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.session({ 
      store: sessionStore, 
      secret: 'someSecret', 
      key: 'cookie.sid', maxAge: null })); 
      }); 
app.use(app.router); 
app.use("/styles", express.static(__dirname + '/styles')); 
app.use("/images", express.static(__dirname + '/styles/images')); 
app.use("/js", express.static(__dirname + '/js')); 
// routing 
app.get('/', function (req, res) { 
    res.sendfile(__dirname + '/index.html'); 
}); 

server.listen(8080); 

我傾向於第二種方法,因此,如果有人可以幫助我得到它的工作,我會很感激。

+0

您是否正確使用該http代理代碼?你必須配置它來監聽端口80和代理端口8080. – 2013-03-14 13:49:31

+0

@AndreasHultgren否,不是字面意思。我改變它聽80和代理8080.如果你看看我提供的鏈接,該示例不包含任何關於快遞,我正在使用。 – Loolooii 2013-03-14 13:51:16

+0

@AndreasHultgren這是該示例的鏈接:http://stackoverflow.com/a/11174042/163799 – Loolooii 2013-03-14 13:52:16

回答

3

爲了讓socket.io工作在具有多個域的節點http-proxy上,這裏是我的設置。我不確定它是否是最好的(我希望它可以與路由器對象一起使用),但它可以工作。

var http = require('http'), 
    httpProxy = require('http-proxy'); 

httpProxy.setMaxSockets(4096); 

var server1 = new httpProxy.HttpProxy({ 
    target: { 
    host: '127.0.0.1', 
    port: '3000' 
    } 
}); 

var server2 = new httpProxy.HttpProxy({ 
    target: { 
    host: '127.0.0.1', 
    port: '3001' 
    } 
}); 

var server = http.createServer(function(req ,res){ 
    switch(req.headers.host){ 
    case 'server1.com': 
     server1.proxyRequest(req, res); 
    break; 
    case 'server2.com': 
     server2.proxyRequest(req, res); 
    break; 
    } 
}); 

server.on('upgrade', function(req, socket, head){ 
    // Cases need only for servers that actually use websockets 
    switch(req.headers.host){ 
    case 'server1.com': 
     server1.proxyWebSocketRequest(req, socket, head); 
    break; 
    case 'server2.com': 
     server2.proxyWebSocketRequest(req, socket, head); 
    break; 
    } 
}); 

server.listen(80); 
+0

setMaxSockets意味着最大登錄用戶數量正確嗎?在我的情況? – Loolooii 2013-03-18 13:53:47

+0

而在這一行中:var server = http.createServer(app);我將快速應用作爲createServer()的參數,但在這種情況下我該如何做到這一點?謝謝。 – Loolooii 2013-03-18 13:56:09

+1

setMaxSockets是同時套接字連接的最大數量。我認爲將代理作爲單獨的應用運行是最好的,尤其是在代理不同的應用/域時。因此,您可以將上述內容放在'start.js'中,並使用'node start.js'運行它,並像平常一樣運行您自己的應用程序。你不應該需要改變應用程序本身的任何東西。 – 2013-03-18 14:34:23

相關問題