ฉันจะกำหนดค่าเซิร์ฟเวอร์ HTTP Nginx proxy_pass Node.js ผ่านซ็อกเก็ต UNIX ได้อย่างไร


16

ฉันกำลังพยายามกำหนดค่าเซิร์ฟเวอร์ Nginx เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ Node.js HTTP ผ่านซ็อกเก็ตโดเมน UNIX

ไฟล์การกำหนดค่า Nginx:

server {
  listen 80;

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

(ตามhttp://wiki.nginx.org/HttpProxyModule#proxy_pass )

สคริปต์ Node.js:

var http = require('http');

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

ตอนนี้เมื่อฉันพยายามโทร

curl http://localhost/

ฉันได้รับหน้าข้อผิดพลาด 502 Bad Gateway เป็นแบบม้วนเท่านั้นและไม่มีสิ่งใดในกระบวนการ Node.js

ฉันกำลังทำอะไรผิดหรือเปล่า?

แก้ไข:

หลังจากลองวิธีแก้ปัญหาของ quanta ความผิดพลาดจะต้องเกี่ยวข้องกับการกำหนดค่า Nginx เนื่องจากกระบวนการ Node.js สร้างการเชื่อมต่อกับซ็อกเก็ตอย่างถูกต้อง

ฉันยังพยายามกำหนดค่า Nginx ด้วยวิธีนี้:

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

server {
  listen 80;

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

แต่มันก็ไม่ได้ผลเหมือนกัน

BTW ฉันใช้ Nginx v1.0.6

ต่อไปนี้จะถูกเขียนไปยังบันทึกข้อผิดพลาดใน Nginx เมื่อฉันใช้การกำหนดค่าที่สอง

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"

คำตอบ:


7

chmod 777 /tmp/app.socket

นี่เป็นวิธีแก้ปัญหา แต่ไม่ใช่วิธีแก้ปัญหา

คุณควรเรียกใช้ทั้งเว็บเซิร์ฟเวอร์กับผู้ใช้เดียวกันและ / หรือกลุ่มเดียวกันดังนั้นคุณไม่จำเป็นต้องทำให้โลกซ็อกเก็ตของคุณอ่านเขียนได้ ยังฉันไม่เห็นว่าทำไมซ็อกเก็ตจะต้องมีการปฏิบัติการ ดังนั้น 6 ควรจะเพียงพอ เช่น: 660


สำหรับผู้ที่ไม่ค่อยคุ้นเคยกับการอนุญาต Unix หากมีการใช้รูปแบบนี้สำหรับหลายบัญชีในโฮสต์เดียวกันแต่ละบัญชีสามารถและเขียนไปยังซ็อกเก็ตอื่น ๆ ได้ นั่นเป็นเหตุผลที่นี่คือ "ไม่ใช่วิธีแก้ปัญหา" แม้ว่าจะใช้งานได้
Mark Stosberg

5

"502 Bad Gateway"หมายความว่า Nginx ไม่สามารถรับการตอบสนองจากเซิร์ฟเวอร์ upstream ตรวจสอบให้แน่ใจว่าคุณมีกระบวนการรับฟัง/tmp/app.socket:

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

ฉันมีกระบวนการฟัง/tmp/app.socketแล้ว unix 2 [ ACC ] STREAM HÖRT 29673 7029/node /tmp/app.socketเมื่อฉันเรียกใช้คำสั่งของคุณมันทำให้ฉัน แต่ขอบคุณสำหรับเคล็ดลับของคุณ คำสั่งนี้มีประโยชน์มากทีเดียว
pvorb

3

ฉันแก้ไขมันแล้ว ข้อความบันทึกข้อผิดพลาดที่ฉันโพสต์ด้านบนนำฉันไปสู่คำตอบ

ฉันมักจะเริ่มต้นกระบวนการ Node.js ในฐานะผู้ใช้ปกติในขณะที่ Nginx เริ่มต้นจากรูท เมื่อ Node.js เริ่มต้นขึ้นมันจะสร้างซ็อกเก็ตที่มีsrwxr-xr-xสิทธิ์ ดังนั้น Nginx ไม่สามารถเขียนไปยังซ็อกเก็ตได้เท่านั้นที่สามารถอ่านได้จากมัน วิธีนี้ทุกอย่างสามารถตั้งค่าได้อย่างถูกต้องเมื่อกระบวนการเริ่มต้นขึ้น แต่เมื่อฉันโทรไปที่หน้าเว็บ Nginx ก็รู้ว่ามันไม่มีสิทธิ์ในการส่งคำขอไปยังซ็อกเก็ต

ทางออกคือการทำงาน

chmod 777 /tmp/app.socket

ตอนนี้ทุกอย่างก็โอเค

ขอบคุณ!


2

ฉันรู้ว่าฉันมางานปาร์ตี้ช้า แต่หน้านี้ปรากฏขึ้นในการค้นหาโดย Google สำหรับปัญหาที่แน่นอนนี้ การใช้คำสั่ง shell ไม่ใช่ทางออกที่ดีสำหรับฉันและนี่คือวิธีที่ฉันแก้ไข

แทนที่จะเรียกใช้ chmod ด้วยตนเองคุณสามารถทำให้ Node ทำได้ด้วยไลบรารี 'fs' หลังจากสร้างซ็อกเก็ตแล้ว:

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

เห็นได้ชัดว่าถ้าคุณมีสิ่งอื่นในเหตุการณ์ onListening ของคุณอยู่แล้วคุณควรเพิ่มการเรียกไปยัง chmodSync ในฟังก์ชันที่มีอยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.