"Nicht ERHALTEN" auf reverse-proxy Nginx-Buchse.io auf express.js
Ich verfolgt habe dieses tutorial zu bekommen Node.js arbeiten durch Nginx auf einem zwei-Ubuntu-14.04-Server über private networking (Node.js ist auf myappserver - zugänglich über private IP-myprivatewebserver und öffentlich über mypublicappserver - und Nginx auf mywebserver). Alles funktioniert gut bis zu diesem Zeitpunkt - ich kann den Zugriff auf eine node.js Anwendung auf myprivateappserver:3000 Proxy über Nginx, indem Sie zu http://mywebserver/node.
Jedoch, wenn ich versuche, und führen Sie die chat-Anwendung in-Buchse.io auf express.js es funktioniert, wenn ich direkt auf ihn zugreifen (http://mypublicappserver:3000) aber, wenn ich versuche, und greifen Sie über meine Nginx-proxy (http://mywebserver/node), erhalte ich "Cannot GET /node" im browser und in der firebug-Konsole"
"NetworkError: 404 Not Found - http://mywebserver/node".
Wenn ich curl http://myprivateappserver:3000 von mywebserver, bekomme ich index.html aus meiner Steckdose.io-Anwendung in Ordnung.
Meine /etc/nginx/sites-available/default enthält:
location /node{
proxy_pass http://myprivateappserver:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
Meine index.js ist:
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
app.get('/', function(req, res){
res.sendFile(__dirname + '/index.html');
});
io.on('connection', function(socket){
console.log('a user connected');
socket.on('disconnect', function(){
console.log('user disconnected');
});
socket.on('chat message', function(msg){
io.emit('chat message', msg);
});
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
und meine index.html ist:
<!doctype html>
<html>
<head>
<title>Socket.IO chat</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font: 13px Helvetica, Arial; }
form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
form input { border: 0; padding: 10px; width: 90%; margin-right: .5%; }
form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
#messages { list-style-type: none; margin: 0; padding: 0; }
#messages li { padding: 5px 10px; }
#messages li:nth-child(odd) { background: #eee; }
</style>
</head>
<body>
<ul id="messages"></ul>
<form action="">
<input id="m" autocomplete="off" /><button>Send</button>
</form>
<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var socket = io();
$('form').submit(function(){
socket.emit('chat message', $('#m').val());
$('#m').val('');
return false;
});
socket.on('chat message', function(msg){
$('#messages').append($('<li>').text(msg));
});
</script>
</body>
</html>
Dies ist mein Erster Ausflug in die nginx/node/express/Buchse (normalerweise bin ich eine Apache/CakePHP person), damit ich gut sein kann, fehlt etwas sehr einfach, aber wäre auch sehr dankbar für irgendwelche Hinweise, wie zu Debuggen was schief geht,
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, weil SocketIO verwendet
/socket.io
Pfad standardmäßig, so müssen Sie konfigurieren Nginx so, dass es den proxy nicht nur/node
Anfrage, aber/socket.io
zu:(By the way, es sieht aus wie Sie haben Tippfehler: Sie schrieb
proxypass
, aber die richtige form istproxy_pass
. Das gleiche gilt für andereproxy
Richtlinien)Sie auch brauchen, um eine weitere Bearbeitung in Ihrem NodeJS-server-Datei. Ersetzen:
mit:
Nun sollte es funktionieren.
Dies ist nicht die einzige Lösung. Sie könnte auch ändern, SocketIO Weg mit einigen änderungen in der Nginx-config, aber die oben beschriebene Lösung scheint die simlest zu mir. Viel Glück!
$httpupgrade
variable. Viel Glück:)Gut aswer von Neugierig. Ich möchte hinzufügen, dass Sie nicht anpassen, um die node.js Anwendung wenn Sie sub_filter. Ihre nginx muss erstellt worden mit diesem Modul.
Funktioniert das auch ohne " ^ " und " \ " Zeichen.