Node.js uygulaması, bağlantı noktasını engelleyen başka bir işlem olmamasına rağmen 80 numaralı bağlantı noktasında çalışamaz


94

Amazon EC2'de Node.js yüklü bir Debian örneğini çalıştırıyorum. Aşağıdaki kodu çalıştırırsam:

http = require('http');

http.createServer(function (request, response){
  response.writeHead(200, {'Content-Type':'text/plain'});
  response.end('Hello World\n');
}).listen(80);
console.log("Running server at port 80");

80 numaralı bağlantı noktasında dinleyen başka bir işlem olduğunu söyleyen aşağıdaki çıktıyı alıyorum:

Running server at port 80

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EACCES
    at errnoException (net.js:901:11)
    at Server._listen2 (net.js:1020:19)
    at listen (net.js:1061:10)
    at Server.listen (net.js:1127:5)
    at Object.<anonymous> (/home/admin/nodetests/nodetest.js:6:4)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)

Şimdi bir işlem olup olmadığını kontrol ettiğimde (herhangi bir şeyin gizli olması durumunda root olarak) 80 numaralı bağlantı noktasında şunları kullanarak dinleme:

netstat -tupln

80 numaralı bağlantı noktasında hiçbir şey dinlemediğini söyleyen aşağıdaki çıktıyı alıyorum:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1667/sshd       
tcp6       0      0 :::22                   :::*                    LISTEN      1667/sshd

Eğer bir fark yaratıyorsa, debian'ın gelen kuralı olarak 80 numaralı bağlantı noktasının açık olduğuna dikkat etmeliyim.

Sorum şu: Neyi yanlış yapıyorum? 80 numaralı bağlantı noktasını dinleme sürecini nasıl belirleyemiyorum? Debian'da neden engelleniyor? Kodun doğru çalışmasını sağlamak için hangi adımları atmalıyım?

Yanıtlar:


198

Hata kodu EACCES, uygulamaları o bağlantı noktasında çalıştırmak için uygun izinlere sahip olmadığınız anlamına gelir. Linux sistemlerinde, 1024'ün altındaki herhangi bir bağlantı noktası, kök erişimi gerektirir.


5
bu nedenle, sudo kullanma yetkiniz varsa sudo node myapp.js bunu yapacaktır (sadece yeni başlayanlar için onu takip edin).
AlexMA

21
@AlexMA ama bir sunucuyu root olarak çalıştırmak büyük bir hayır değil
Patrick Evans

1
O halde 80 numaralı bağlantı noktasında düğümü nasıl çalıştırırsınız? Sadece ... yapmamalı ve vekil kullanmalı mısın?
AlexMA

9
@PatrickEvans Sanırım en iyi uygulama, farklı bir bağlantı noktasında çalıştırmak ve burada belirtildiği gibi bir bağlantı noktası yönlendirme kuralı oluşturmaktır: stackoverflow.com/questions/16573668/…
AlexMA

73

80 numaralı bağlantı noktasında çalışmak yerine 80 numaralı bağlantı noktasını uygulamanızın bağlantı noktasına (> 1024) yönlendirebilirsiniz.

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000

Bu, uygulamanız 3000 numaralı bağlantı noktasında çalışıyorsa işe yarar.


1
bunu yaptı. İptables'ı yeni bir debian kurulumunda çalıştırmak için root olmanız gerektiğini, aksi takdirde $ PATH bunu göstermeyecektir.
Brian Yeh

Evet, muhtemelen bunu yapmanın en kolay yolu buydu. Port 80'e dokunurken bana sorunlar veren Google Cloud Compute'tayım. Bu harikaydı. Teşekkürler.
Andy

Kabul edilen çözüm bu olmalıdır. Web sunucusunu sudo olarak çalıştırmak tehlikelidir ve uygulamada herhangi bir güvenlik açığı varsa potansiyel olarak saldırgana kök erişimi sağlar; ayrıca, uygulama herhangi bir dosya oluşturacak olsaydı, diğer kullanıcılar tarafından erişilemezler ve sudodaha da fazla kullanmanıza neden olurlardı .
jesusiniesta

Neden olduğundan emin değilim, ancak Ubuntu 14.04'te bu benim için işe yaramadı. Şimdi ssh aracılığıyla port yönlendirmeyi kullanıyorum, bu da aynı derecede kolay. Aşağıda bir cevap gönderdim .
panepeter

20

Kısa cevap: Aşağıdakileri kullanarak o bağlantı noktasına düğüm erişimine izin verebilirsiniz:

setcap 'cap_net_bind_service=+ep' /path/to/nodejs

uzun cevap

Düzenle:

Yeni düğüm sürümlerinde çalışmayabilir


bu hile yaptı. @LinuxMint - sudo setcap 'cap_net_bind_service = + ep' / usr / local / bin / node
birleştir

Bazen bir güncelleme konum yolunu düğüm olarak değiştirir ve bu çalışmayı durdurur. Bu nedenle, düğüme giden yeni yol için onu tekrar çalıştırmanız gerekecek.
steampowered

Görünüşe göre bu artık düğüm sürümü 8'den sonra
timaw

6

Eğer varsa unutmayın apacheçalışan, bir sankondan bir ters vekil oluşturabilir. Düğümünüz bağlantı noktasında çalışıyorsa 8080:

<VirtualHost 127.0.0.1:80>
        ServerName myLocalServer

        ProxyPass        /  http://localhost:8080/
        ProxyPassReverse /  http://localhost:8080/
</VirtualHost>

Elbette sunucuyu şuraya ekleyin /etc/hosts:

127.0.0.1    myLocalServer

İlgili apache modüllerini etkinleştirmeniz gerekecek:

sudo a2enmod proxy_html
sudo a2enmod proxy_http
sudo a2enmod proxy_connect
sudo a2enmod proxy_ajp
sudo service apache2 restart

... ve şimdi bağlanabilirsiniz http://myLocalServer.


3

Bir geliştirme ortamı için hızlı ve kolay bir çözüm arayanlar için , ssh aracılığıyla bağlantı noktası iletme güzel bir alternatif olabilir:

ssh -L 80:localhost:3000 yourusername@localhost -N

Bu, localhost üzerindeki 80 numaralı bağlantı noktasını localhost üzerindeki 3000 numaralı bağlantı noktasına iletir.

Kök olarak çalıştırılması gerekir (ayrıcalıklı bağlantı noktası). İptal etmek için terminalde ctrl-c tuşlarına basmanız yeterlidir. ( -fKomutun arka planda çalışmasını sağlamak için bayrağı ekleyebilirsiniz , ancak daha sonra onu öldürmek için yeniden bulmanız gerekir).

Bu çözüm, yerel olarak çalışan bir ssh sunucusuna sahip olmanızı gerektirir . Hızlı bir şekilde yapılabilir , ancak paylaşılan bir ağ üzerindeyseniz lütfen güvenlik sonuçlarını aklınızda bulundurun. En azından bir miktar ek güvenlik uygulamak isteyebilirsiniz (parola ve kök oturumunu devre dışı bırakın).

Şahsen bunu yalnızca yerel makinemde kullanıyorum. Bunu üretim üzerinde çalıştırırsanız isteklerinizin işleme hızını nasıl etkileyeceğinden emin değilim, belki birinin bir fikri vardır. Her neyse, bu komutun her zaman çalıştığından emin olmanız gerekir, bu da daha fazla baş ağrısına neden olur. Üretim ortamları için nginx gibi bir ters proxy kullanmanızı öneririm .


2

hekzasiyanür yanıtı doğrudur. ama bunun işe yaraması için herhangi bir çözüm var mı?

cevap Evet.

Nasıl?

Bir kullanabilirsiniz reverse proxyörneğin çalıştırma a nginx reverse proxyportunda 80ve hedefe vekil geçmesi ip:porto düğüm kullanımı bunu.

bunu kullanarak kurabilirsiniz, docker containerbu da hayatı daha da kolaylaştırır. bu, docker hub'da çekebileceğiniz resmi nginx yapısıdır.

reverse proxyGoogle'da kullanmanın daha da fazla faydası var.


0

Aynı hatayı aldım ve uygulamamı sudo kullanarak çalıştırmayı denedim ve benim için çalıştı.

sudo olmadan

mansi@mansi:~/NodePractice$ node myFirst.js 
events.js:141
      throw er; // Unhandled 'error' event
      ^

Error: listen EACCES 0.0.0.0:80
    at Object.exports._errnoException (util.js:870:11)
    at exports._exceptionWithHostPort (util.js:893:20)
    at Server._listen2 (net.js:1224:19)
    at listen (net.js:1273:10)
    at Server.listen (net.js:1369:5)
    at Object.<anonymous> (/home/mansi/NodePractice/myFirst.js:6:4)
    at Module._compile (module.js:410:26)
    at Object.Module._extensions..js (module.js:417:10)
    at Module.load (module.js:344:32)
    at Function.Module._load (module.js:301:12)

ve sudo ile

mansi@mansi:~/NodePractice$ sudo node myFirst.js 
^C

... kesinlikle yapmak istemediğin şey bu. Güvenlik sorunları yaratır.
bvdb

-2

Hata kodu EACCES, uygulamaları o bağlantı noktasında çalıştırmak için uygun izinlere sahip olmadığınız anlamına gelir. Linux sistemlerinde, 1024'ün altındaki herhangi bir bağlantı noktası, kök erişimi gerektirir.

Programı sudoizinle çalıştırın . Run sudo suprogramı çalıştırmadan önce komut.


Heksasiyanürler cevabı altındaki yayın yorumlarına bakın. Teşekkürler.
Brian Yeh
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.