Çoğu bağlantı noktasında dinlerken Node.js EACCES hatası


250

Bir uygulamayı test ediyorum (umarım heroku üzerinde çalışıyorum, ancak yerel olarak da sorun yaşıyorum). Http.Server.listen () çalıştırıldığında bana bir EACCES hatası veriyor - ancak yalnızca bazı bağlantı noktalarında gerçekleşiyor.

Yani, yerel olarak koşuyorum:

joe@joebuntu:~$ node
> var h = require('http').createServer();
> h.listen(900);
Error: EACCES, Permission denied
    at Server._doListen (net.js:1062:5)
    at net.js:1033:14
    at Object.lookup (dns.js:132:45)
    at Server.listen (net.js:1027:20)
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:150:22)
    at Interface.emit (events.js:42:17)
    at Interface._onLine (readline.js:132:10)
    at Interface._line (readline.js:387:8)
    at Interface._ttyWrite (readline.js:564:14)

900 numaralı bağlantı noktasında (veya denediğim diğer 20 bağlantı noktasından) hiçbir şeyim yok, bu yüzden bu işe yarayacak. Tuhaf yanı tam o does bazı limanlarda üzerinde çalışmaya. Örneğin, 3000 numaralı bağlantı noktası mükemmel çalışır.

Buna ne sebep olur?

Güncelleme 1:

Yerel bilgisayarımda EACCES hatasının geldiğini anladım, çünkü bu bağlantı noktalarını bağlamak için düğümü kök olarak çalıştırmam gerekiyor. Bunun neden olduğunu bilmiyorum, ama sudo kullanmak sorunu düzeltir. Ancak bu, Heroku'da nasıl düzelteceğimi açıklamıyor. Heroku'da root olarak çalışmanın bir yolu yok, bu yüzden 80 numaralı bağlantı noktasını nasıl dinleyebilirim?


23
1024'ten daha düşük bağlantı noktaları geleneksel olarak yükseltilmiş izinler gerektirir. Heroku'da, 80 numaralı bağlantı noktasını dinlemezsiniz, ortam değişkenleri aracılığıyla size söyledikleri bağlantı noktasını dinlersiniz ve yönlendirme katmanının, 80 numaralı bağlantı noktasını kenarda bağlamasını sağlarsınız.
Mâtt Frëëman

Güncellemeniz 1 bana yardımcı oldu. 'sudo node myporgram.js' çalıştırdı.
Sabre

Yanıtlar:


352

İş istasyonunuzda çalışıyor

Genel bir kural olarak, kök ayrıcalıkları olmadan çalışan işlemler 1024'ün altındaki bağlantı noktalarına bağlanamaz.

Bu yüzden daha yüksek bir bağlantı noktası deneyin veya üzerinden yükseltilmiş ayrıcalıklarla çalıştırın sudo. Eğer düşük bağlantı noktası kullanarak bağlanan sonra sen ayrıcalıkları eski sürüme geçebilir process.setgidve process.setuid.

Heroku üzerinde çalışıyor

Uygulamalarınızı heroku üzerinde çalıştırırken, bağlantı noktasını PORT ortam değişkeninde belirtildiği gibi kullanmanız gerekir.

Bkz. Http://devcenter.heroku.com/articles/node-js

const server = require('http').createServer();
const port = process.env.PORT || 3000;

server.listen(port, () => console.log(`Listening on ${port}`));

3
Bu, Heroku tarafından sağlanan bağlantı noktasını kullanmak zorunda olduğum anlamına mı geliyor ve daha sonra bunu 80 numaralı bağlantı noktasına aktarmak için sahne arkasında biraz sihir yapacaklar mı? 80 numaralı bağlantı noktasında olmayan bir şey çalıştırmak istersem ne olur?
jwegner

12
Evet. Yalnızca size $ PORT adresinde söylediğimiz bağlantı noktasını dinleyebilirsiniz. Bağlantı noktanıza 80 veya 443 yönlendirme ile ilgileniriz. Dinamoyu hareket ettirdikçe gerçek bağlantı noktası her zaman değişir. Zaman içinde bu noktada biz sadece halka 80 ve 443 den yönlendirme desteklemek
Will

@ Bu kısıtlamanın kaldırılma şansı olacak mı? Özellikle, 80 veya 443 dışındaki bağlantı noktalarını dinleyebiliyor musunuz? Bu oldukça kısıtlayıcı bir set, her şey düşünülmüş.
ghayes

2
Uygulamanızın neden http ve https'den farklı bir bağlantı noktasında çalışmasını istiyorsunuz?
Will

1
@ Heroku'da basit bir oyun sunucusuna ev sahipliği yapmak istiyorum. Birliğin crossdomain.xml843 limanından aktarılması gerekiyor .
polkovnikov.ph

178

Ayrıcalıksız kullanıcı (kök değil) 1024'in altındaki bağlantı noktalarında bir dinleme soketi açamaz.


5
Geliştirilmiş - bu iyi bir genel kuraldır, ancak bunun istisnaları vardır, örneğin, Linux'ta 'yetenekler'.
mikemaccana

3
Bana saatlerce hata ayıklama yaptınız. Bunu bilmiyordum.
Malharhak

6
Ancak bu gibi değil, ben sudo(gulp aslında) düğümü kullanarak bir ekspres sunucu çalıştırırken yapmak istemiyorum . Yani doesnt mantıklı
blamb

bu bilgelik
mauris

4
@blamb Daha sonra MeetMehta'nın çözümünü kullanın ; ^)
16'da

108

Bu referans bağlantısını kontrol edin :

Bağlantı Noktası 80'i Kullanmak için Güvenli Kullanıcı İzni Verme

Unutmayın, uygulamalarınızı kök kullanıcı olarak çalıştırmak istemiyoruz, ancak bir sorun var: güvenli kullanıcınızın varsayılan HTTP bağlantı noktasını kullanma izni yok (80). Hedefiniz, ziyaretçilerin kullanabileceği, kullanımı kolay bir URL'ye giderek web sitesini yayınlayabilmektir. http://ip:port/

Ne yazık ki, kök olarak oturum açmadığınız sürece normalde http://ip:port-> bağlantı noktası numarası> 1024 gibi bir URL kullanmanız gerekir .

Birçok insan burada takılı kalıyor, ancak çözüm kolay. Birkaç seçenek var ama bu benim sevdiğim. Aşağıdaki komutları yazın:

sudo apt-get install libcap2-bin
sudo setcap cap_net_bind_service=+ep `readlink -f \`which node\``

Şimdi, bir Düğüm uygulamasına bağlantı noktası 80'de çalışmasını istediğinizi söylediğinizde, şikayet etmeyecektir.


5
Bu kesinlikle en iyi çözümdür.
Mark Lagendijk

1
@ MarkLagendijk: Teşekkürler Mark. Aynı soruyu yanlışlıkla sordum ve buraya ayrıntılı bir cevap gönderdim stackoverflow.com/questions/23281895/… . Ayrıca düzenlemekten çekinmeyin.
Mehta ile tanış

6
neden bu cevap değil 👍
KhaledMohamedP

@KhaledMohamedP: Yardım etti sevindim :)
Mehta ile tanışın

Kim demiş bu hala pm2 modülü ile çalışmaz. PM2'nizi kullanarak öldürün pm2 killve yeniden oluşturun.
Prasanth Jaya

10

Başka bir yaklaşım, bağlantı noktası yeniden yönlendirmesi yapmaktır:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 900 -j REDIRECT --to-port 3000

Ve sunucunuzu> 1024 bağlantı noktasında çalıştırın:

require('http').createServer().listen(3000);

ps aynı https (443) bağlantı noktası için bu arada yapılabilir.


1
Teşekkür ederim teşekkür ederim! Bu, güvenli bağlantı noktaları için bir saat hata ayıklama, SSL yeniden yönlendirme için bir saat daha kurtardı ve ayrıca AWS Lightstail'deki bir geliştirme sunucusunun görünürlüğünü kısıtlamamı sağladı (isteklerin IP adresine göre ince ayar yapılmasına izin vermiyor).
miguelmorin

3

Bu, düğümün tanımlanan bağlantı noktasını dinleyemediği anlamına gelir. 1234 veya 2000 veya 3000 gibi bir şeyle değiştirin ve sunucunuzu yeniden başlatın.


3

AMAN TANRIM!! Benim durumum ....listen(ip, port)yerine yapıyordum ...listen(port, ip)ve bu hata msj kusuyor:Error: listen EACCES localhost

Bağlantı noktası numaralarını> = 3000 kullanıyordum ve hatta yönetici erişimini denedim. Hiçbir şey işe yaramadı. Sonra daha yakından bir bakışla, sorunu fark ettim. Olarak değiştirildi...listen(port, ip) ve her şey iyi çalışmaya başladı!

Sadece başka birine yararlı olması durumunda bu çağrı ...


Teşekkür ederim! Ben de aynı problemi yaşadım. Ben hostname, port kullanarak diğer tüm API'lara alışkınım.
David

Wekan docker görüntüsünü çalıştırmaya çalışırken bu sorunu yaşadım. Bu ipucunu kullanarak çözdüm. Teşekkür ederim.
Angelo Polotto

@ dilip-muthukurussimana ....listen(ip, port)Cevabınızda (dörtlü .) olmak istediniz mi ? Bu yüzden argümanların sırası hakkında konuştuğunuzu fark etmem bir dakika sürdü.
bschlueter

Evet, sadece argümanların sırası demek istedim. Pls ....oraya (dört nokta) koymayın , ki açık olduğunu düşündüm.
Dilip Muthukurussimana

2

Macimde bu hatayı aldım çünkü varsayılan olarak apache sunucusunu, benim durumumda 80 olan düğüm sunucusu tarafından kullanılanla aynı portu kullanarak çalıştırdı. Tek yapmam gereken bunu durdurmak sudo apachectl stop

Umarım bu birine yardımcı olur.


2

Bu hatayı mac'umda da aldım. npm run devWindows'ta Nodejs uygulamamı çalıştırmak için kullanıyorum ve iyi çalışıyor. Ama mac'umda bu hatayı aldım error given was: Error: bind EACCES null:80.

Bunu çözmenin bir yolu, root erişimi ile çalıştırmaktır. Sen kullanabilir sudo npm run devve şifrenizin koymak için gereklidir.

Uygulamanızı kök izinleri olmadan çalışan 3000 gibi ayrıcalıklı olmayan bir bağlantı noktasında sunmak genellikle tercih edilir.

başvuru: http 80 bağlantı noktasını dinlerken Node.js EACCES hatası (izin verilmedi)


2

Ben port 8080 çalışmasına inkar edildiğini benzer bir sorun vardı, ama aynı zamanda herhangi bir başka .

Görünen o ki, env.localokuduğu dosya aşağıdaki gibi değişken adlarından sonra yorumlar içeriyordu:

PORT=8080 # The port the server runs at

Ve bu şekilde yorumladı, limanı kullanmaya çalıştı "8080 # The port the server runs at açık bir şekilde geçersiz bir bağlantı noktası olan " bağlantı noktasını (-1) . Yorumları kaldırmak tamamen çözdü.

Bu arada Windows 10 ve Git Bash kullanma.


Tam olarak burada açıklanan sorun olmadığını biliyorum , ama orada birine yardım edebilir. Bu soruya cevabımın cevabını ararken indim, yani ... belki?


Evet, bunu yaşadım. .Env dosyalarındaki değerlerden sonraki yorumlar buna neden olabilir.
Danoz

1

Bağlantı noktası 80'e bağlanmak için sudo kullanıyorsanız ve PORT & NODE_ENV env değişkenlerini kullanıyorsanız, bu değişkenleri artık kullanıcı profiliniz değil kök profil altında olduğunuz için yeniden dışa aktarmanız gerektiğini unutmayın. Yani, bunu Mac'imde çalışmak için aşağıdakileri yaptım:

sudo su
export NODE_ENV=production
export PORT=80
docpad run

1

bu, yerel olarak barındırmaya çalıştığınız bağlantı noktası portfordedeyse olur


1

Yetkilendirmeyi deneyin:

http://manpages.ubuntu.com/manpages/hardy/man1/authbind.1.html

Yükledikten sonra, aşağıdaki klasörde kullanmak istediğiniz bağlantı noktası numarasının adını içeren bir dosya ekleyebilirsiniz: / etc / authbind / byport /

Chmod kullanarak 500 izin verin ve programı çalıştırmak istediğiniz kullanıcının sahipliğini değiştirin.

Bundan sonra, projenizdeki kullanıcı olarak "authbind node ..." yapın.


1

Benim hatam sadece server.js'deki port numarasını değiştirerek çözüldü.

const port = process.env.PORT || 8085;

Bağlantı noktası numaramı 8080'den 8085 olarak değiştirdim.

Umarım yardımcı olur.


0

Birçok farklı yolu denedikten sonra, IIS'yi pencerelerime yeniden yüklemek sorunu çözdü.


0

Hatam (Windows'ta) kullanılarak çözüldü

app.set('PORT', 4000 || process.env.PORT);

app.listen(app.get('PORT'), <IP4 address> , () => {
    console.log("Server is running at " + app.get('PORT'));
});

NodeJS uygulamasının Windows Güvenlik Duvarı'ndaki ağa erişmesine izin verin.


0

yeniden başlatma yeterli değildi! Sorunu çözmenin tek yolu aşağıdaki gibidir:

O limanda çalışan servisi öldürmelisin.

cmd'de yönetici olarak çalıştırın ve şunu yazın: netstat -aon | find / i "dinleme"

etkin hizmetin bir listesini alırsınız, 4200'de çalışan bağlantı noktasını arar ve onu öldürmek için son sütun olan işlem kimliğini kullanırsınız.

: taskkill / F / PID 2652

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.