Bagaimana cara mengkonfigurasi server HTTP Nginx proxy_pass Node.js melalui soket UNIX?

16

Saya mencoba mengkonfigurasi server Nginx untuk terhubung ke server HTTP Node.js melalui soket domain UNIX.

File konfigurasi Nginx:

server {
  listen 80;

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

(menurut http://wiki.nginx.org/HttpProxyModule#proxy_pass )

Skrip Node.js:

var http = require('http');

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

Sekarang, ketika saya mencoba menelepon

curl http://localhost/

Saya hanya mendapatkan halaman kesalahan Gateway 502 di curl dan tidak ada pada proses Node.js.

Apakah saya melakukan sesuatu yang salah?

edit:

Setelah mencoba solusi quanta, kesalahan harus ada hubungannya dengan konfigurasi Nginx, karena proses Node.js membuat koneksi ke soket dengan benar.

Saya juga mencoba mengkonfigurasi Nginx dengan cara ini:

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

server {
  listen 80;

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

Tapi ini juga tidak berhasil.

BTW Saya menggunakan Nginx v1.0.6.

Berikut ini sedang ditulis ke log kesalahan di Nginx, ketika saya menggunakan konfigurasi kedua

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"
pvorb
sumber

Jawaban:

6

chmod 777 /tmp/app.socket

Ini adalah solusi tetapi bukan solusinya.

Anda mungkin harus menjalankan kedua server web dengan pengguna dan / atau grup yang sama sehingga Anda tidak perlu membuat dunia socket Anda dapat ditulis. Juga saya tidak melihat mengapa soket perlu dieksekusi. jadi 6 harus cukup. yaitu: 660

Fehlersturm
sumber
Bagi mereka yang kurang terbiasa dengan izin Unix, jika skema ini digunakan untuk beberapa akun pada host yang sama, setiap akun dapat dan menulis ke soket yang lain. Itu sebabnya ini "bukan solusi" meskipun itu bekerja.
Mark Stosberg
5

"502 Bad Gateway" berarti bahwa Nginx tidak dapat menerima respons dari server hulu. Pastikan Anda memiliki proses dengarkan /tmp/app.socket:

# netstat --protocol=unix -nlp | grep app.socket
kuanta
sumber
Saya punya proses mendengarkan /tmp/app.socket. Ketika saya menjalankan perintah Anda itu memberi saya unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socket. Tapi terima kasih atas tipnya. Perintah ini cukup berguna.
pvorb
3

Saya menyelesaikannya. Pesan log kesalahan yang saya posting di atas menuntun saya ke jawabannya.

Saya selalu memulai proses Node.js sebagai pengguna normal, sementara Nginx dimulai oleh root. Ketika Node.js dimulai, ia menciptakan soket dengansrwxr-xr-x hak. Jadi Nginx tidak bisa menulis ke soket, hanya bisa membaca dari itu. Dengan cara ini semuanya bisa diatur dengan benar, ketika proses dimulai. Tetapi begitu saya menelepon halaman web, Nginx menyadari bahwa itu tidak memiliki hak untuk mem-proxy permintaan ke soket.

Solusinya adalah berjalan

chmod 777 /tmp/app.socket

Sekarang semuanya baik-baik saja.

Bagaimanapun, terima kasih!

pvorb
sumber
2

Saya tahu saya terlambat ke pesta, tetapi halaman ini muncul di pencarian Google untuk masalah yang tepat ini. Menjalankan perintah shell sebenarnya bukan solusi ideal bagi saya, dan inilah cara saya menyelesaikannya;

Alih-alih menjalankan chmod secara manual, Anda dapat membuat Node melakukannya dengan pustaka 'fs' setelah soket dibuat:

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');
}

Tentunya jika Anda sudah memiliki hal-hal lain di acara onListening Anda, Anda harus menambahkan panggilan ke chmodSync ke dalam fungsi yang ada.

jliles
sumber