Nginx proxy_pass Node.js HTTP sunucusunu UNIX soketi üzerinden nasıl yapılandırabilirim?


16

Bir UNIX etki alanı soketi aracılığıyla bir Node.js HTTP sunucusuna bağlanmak için bir Nginx sunucusu yapılandırmaya çalışıyorum.

Nginx yapılandırma dosyası:

server {
  listen 80;

  location / {
    proxy_pass http://unix:/tmp/app.socket:/;
  }
}

( http://wiki.nginx.org/HttpProxyModule#proxy_pass uyarınca )

Node.js betiği:

var http = require('http');

http.createServer(function(req, res) {
  console.log('received request');
  req.end('received request\n');
}).listen('/tmp/app.socket');

Şimdi aramaya çalıştığımda

curl http://localhost/

Ben sadece curl 502 Bozuk Ağ Geçidi hata sayfasını alıyorum ve Node.js işleminde hiçbir şey.

Yanlış bir şey mi yapıyorum?

Düzenle:

Quanta'nın çözümünü denedikten sonra, Node.js işlemi sokete bağlantıyı doğru şekilde kurduğundan, hatanın Nginx yapılandırmasıyla ilgili olması gerekir.

Ayrıca Nginx'i şu şekilde yapılandırmaya çalıştım:

upstream myapp {
  server unix:/tmp/app.socket;
}

server {
  listen 80;

  location / {
    proxy_pass http://myapp;
  }
}

Ama bu da işe yaramadı.

BTW Nginx v1.0.6 kullanıyorum.

İkinci yapılandırmayı kullandığımda, Nginx hata günlüğüne aşağıdakiler yazılıyor

2011/09/28 13:33:47 [crit] 1849#0: *5 connect() to unix:/tmp/app.socket failed  (13: Permission denied) while connecting to upstream, client: 127.0.0.1,        server: , request: "GET / HTTP/1.1", upstream: "http://unix:/tmp/app.socket:/", host: "localhost:80"

Yanıtlar:


7

chmod 777 /tmp/app.socket

Bu bir çözümdür ama çözüm değildir.

büyük olasılıkla her iki web sunucusunu aynı kullanıcı ve / veya aynı grupla çalıştırmanız gerekir, böylece soket dünyanızı yazılabilir yapmak zorunda kalmazsınız. Ayrıca neden bir soket yürütülebilir olması gerektiğini görmüyorum. bu yüzden 6 yeterlidir. yani: 660


Unix izinlerine daha az aşina olanlar için, bu şema aynı ana bilgisayardaki birden çok hesap için kullanılmışsa, her hesap diğer sokete yazabilir ve yazabilir. Bu yüzden çalışmasına rağmen bu bir "çözüm değil".
Mark Stosberg

5

"502 Bozuk Ağ Geçidi" , Nginx'in yukarı akış sunucusundan yanıt alamayacağı anlamına gelir. Şu işlemleri dinlediğinizden emin olun /tmp/app.socket:

# netstat --protocol=unix -nlp | grep app.socket

Dinlemem gereken bir süreç var /tmp/app.socket. Komutunu verdiğimde bana veriyor unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket. Ama bahşiş için teşekkürler. Bu komut oldukça kullanışlıdır.
pvorb

3

Çözdüm. Yukarıda gönderdiğim hata günlüğü mesajı beni cevaba götürüyor.

Nginx kök tarafından başlatılırken, Node.js işlemini her zaman normal bir kullanıcı olarak başlattım. Node.js başlatıldığında, srwxr-xr-xhakları olan soketi yarattı . Böylece Nginx sokete yazamadı, sadece ondan okuyabildi. Bu şekilde süreçler başladığında her şey doğru şekilde kurulabilirdi. Ama bir kez bir web sayfasını aradığımda, Nginx, sokete istekte bulunma hakkının olmadığını fark etti.

Çözüm,

chmod 777 /tmp/app.socket

Şimdi herşey iyi.

Neyse, teşekkürler!


2

Partiye geç kaldığımı biliyorum, ancak bu sayfa tam olarak bu sorunu bulmak için bir Google aramasında geldi. Bir kabuk komutu çalıştırmak benim için gerçekten ideal bir çözüm değil ve ben de bu şekilde çözdüm;

Chmod'u manuel olarak çalıştırmak yerine, düğümün soket oluşturulduktan sonra 'fs' kitaplığıyla yapmasını sağlayabilirsiniz:

var fs = require('fs');

var server = http.createServer(...This varies by implementation...);

server.listen('/path/to/socket');

server.on('listening', onListening);

function onListening() {
  fs.chmodSync('/path/to/socket', '777');
}

Açıkçası, onListening etkinliğinizde başka şeyler varsa, mevcut işleve chmodSync çağrısını eklemeniz yeterlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.