Kesalahan Node.js EACCES saat mendengarkan di sebagian besar porta

250

Saya menguji aplikasi (mudah-mudahan berjalan di heroku, tetapi saya juga punya masalah di tempat). Ini memberi saya kesalahan EACCES ketika menjalankan http.Server.listen () - tetapi itu hanya terjadi pada beberapa port.

Jadi, secara lokal saya menjalankan:

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)

Saya tidak memiliki apa pun yang berjalan di port 900 (atau salah satu dari 20 port lain yang pernah saya coba), jadi ini seharusnya berfungsi. Bagian aneh adalah bahwa hal itu tidak bekerja pada beberapa port. Misalnya, port 3000 berfungsi dengan baik.

Apa yang menyebabkan ini?

Pembaruan 1:

Saya menemukan bahwa di komputer lokal saya, kesalahan EACCES akan datang karena saya harus menjalankan simpul sebagai root untuk mengikat port-port tertentu. Saya tidak tahu mengapa ini terjadi, tetapi menggunakan sudo memperbaikinya. Namun, ini tidak menjelaskan bagaimana saya akan memperbaikinya di Heroku. Tidak ada cara untuk menjalankan sebagai root pada Heroku, jadi bagaimana saya bisa mendengarkan pada port 80?

jwegner
sumber
23
Pelabuhan kurang 1024 secara tradisional membutuhkan izin tinggi. Pada Heroku Anda tidak mendengarkan port 80, Anda mendengarkan port yang mereka kirim melalui variabel lingkungan, dan biarkan layer routing mereka menangani port 80 yang mengikat di tepi.
Mâtt Frëëman
Pembaruan Anda 1 membantu saya. 'sudo node myporgram.js' membuatnya dijalankan.
Sabre

Jawaban:

352

Berjalan di workstation Anda

Sebagai aturan umum, proses yang berjalan tanpa hak akses root tidak dapat mengikat ke port di bawah 1024.

Jadi cobalah port yang lebih tinggi, atau jalankan dengan privilege yang ditingkatkan via sudo. Anda dapat menurunkan versi keistimewaan setelah Anda terikat ke port rendah menggunakan process.setgiddan process.setuid.

Berjalan di heroku

Saat menjalankan aplikasi Anda di heroku Anda harus menggunakan port seperti yang ditentukan dalam variabel lingkungan PORT.

Lihat 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}`));
Ben Taber
sumber
3
Apakah ini berarti saya harus menggunakan port yang disediakan oleh Heroku, dan kemudian mereka akan melakukan sihir di belakang layar untuk mentransfernya ke port 80? Bagaimana jika saya ingin menjalankan sesuatu yang tidak pada port 80?
jwegner
12
Iya. Anda hanya dapat mendengarkan port yang kami beri tahu di $ PORT. Kami menangani perutean 80 atau 443 ke port Anda. Port aktual berubah sepanjang waktu saat kami memindahkan dyno Anda. Saat ini kami hanya mendukung perutean publik dari 80 dan 443.
Akan
@ Akankah ada peluang pembatasan itu diangkat? Secara khusus, dapat mendengarkan pada port selain 80 atau 443? Itu set yang cukup ketat, semua hal dipertimbangkan.
ghayes
2
Mengapa Anda ingin aplikasi Anda berjalan pada port yang berbeda dari http dan https?
Will
1
@Apakah saya ingin meng-host server game sederhana di Heroku. Unity perlu ditransfer crossdomain.xmlmelalui port 843.
polkovnikov.ph
178

Pengguna yang tidak memiliki hak istimewa (bukan root) tidak dapat membuka soket pendengaran pada port di bawah 1024.

pengguna1303768
sumber
5
Diperbaharui - ini adalah aturan umum yang baik, tetapi ada pengecualian untuk ini, misalnya, 'kemampuan' di Linux.
mikemaccana
3
Anda baru saja menyelamatkan saya jam debug. Saya tidak tahu tentang itu.
Malharhak
6
Saya tidak suka ini, saya tidak mau harus sudoketika menjalankan server ekspres menggunakan node (tegukan sebenarnya). Jadi tidak masuk akal
mengacaukan
bagian dari kebijaksanaan ini
mauris
4
@blamb Lalu gunakan solusi MeetMehta ; ^)
ruffin
107

Periksa tautan referensi ini :

Berikan Izin Pengguna Aman Untuk Menggunakan Port 80

Ingat, kami TIDAK ingin menjalankan aplikasi Anda sebagai pengguna root, tetapi ada halangan: pengguna aman Anda tidak memiliki izin untuk menggunakan port HTTP default (80). Tujuan Anda adalah untuk dapat menerbitkan situs web yang dapat digunakan pengunjung dengan menavigasi ke URL yang mudah digunakan seperti http://ip:port/

Sayangnya, kecuali jika Anda masuk sebagai root, Anda biasanya harus menggunakan URL like http://ip:port- di mana nomor port> 1024.

Banyak orang terjebak di sini, tetapi solusinya mudah. Ada beberapa opsi tapi ini yang saya suka. Ketikkan perintah berikut:

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

Sekarang, ketika Anda memberi tahu aplikasi Node bahwa Anda ingin dijalankan pada port 80, itu tidak akan mengeluh.

Temui Mehta
sumber
5
Ini jelas merupakan solusi terbaik.
Mark Lagendijk
1
@MarkLagendijk: Terima kasih, Mark. Saya juga mengajukan pertanyaan yang sama secara keliru dan memposting jawaban terperinci di sini stackoverflow.com/questions/23281895/… . Jangan ragu untuk mengeditnya juga.
Temui Mehta
6
mengapa ini bukan jawaban 👍
KhaledMohamedP
@KhaledMohamedP: Senang membantu :)
Temui Mehta
Siapa bilang ini masih tidak berfungsi dengan modul PM2. Bunuh pm2 Anda menggunakan pm2 killdan membuatnya kembali.
Prasanth Jaya
10

Pendekatan lain adalah dengan melakukan redirection port:

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

Dan jalankan server Anda di> port 1024:

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

ps hal yang sama dapat dilakukan untuk https (443) port by the way.

sebelas
sumber
1
Terima kasih terima kasih! Ini menyelamatkan saya satu jam dari debugging untuk port yang aman, satu jam lagi untuk pengalihan SSL, dan juga memungkinkan saya untuk membatasi visibilitas server pengembangan pada AWS Lightstail (yang tidak memungkinkan fine-tuning permintaan dengan alamat IP).
miguelmorin
3

Ini berarti simpul tidak dapat mendengarkan pada port yang ditentukan. Ubah ke sesuatu seperti 1234 atau 2000 atau 3000 dan mulai ulang server Anda.

Mark Karwowski
sumber
3

OH TUHAN!! Dalam kasus saya, saya ....listen(ip, port)malah melakukan...listen(port, ip) dan itu memunculkan pesan kesalahan:Error: listen EACCES localhost

Saya menggunakan nomor port> = 3000 dan bahkan mencoba dengan akses admin. Tidak ada yang berhasil. Kemudian dengan relook yang lebih dekat, saya perhatikan masalahnya. Mengubahnya ...listen(port, ip)dan semuanya mulai bekerja dengan baik !!

Hanya menyebut ini kalau-kalau berguna bagi orang lain ...

Dilip Muthukurussimana
sumber
Terima kasih! Saya memiliki masalah yang sama. Saya sudah terbiasa dengan semua API lain menggunakan nama host, port.
David
Saya memiliki masalah ini ketika saya mencoba menjalankan image docker Wekan. Saya memecahkan menggunakan tip ini. Terima kasih.
Ângelo Polotto
@ dilip-muthukurussimana Apakah Anda berniat untuk ....listen(ip, port)menjawab (dengan empat .)? Butuh satu menit untuk menyadari Anda berbicara tentang urutan argumen karena itu.
bschlueter
Ya, maksud saya hanya urutan argumen. Tolong jangan taruh ....(empat titik) di sana, yang saya pikir sudah jelas.
Dilip Muthukurussimana
2

Saya mendapatkan kesalahan ini di mac saya karena menjalankan apache server secara default menggunakan port yang sama dengan yang digunakan oleh server node yang dalam kasus saya adalah port 80. Yang harus saya lakukan adalah menghentikannya dengan sudo apachectl stop

Semoga ini bisa membantu seseorang.

mabounassif
sumber
2

Saya mendapat kesalahan ini di mac saya juga. Saya gunakan npm run devuntuk menjalankan aplikasi Nodejs saya di Windows dan berfungsi dengan baik. Tapi saya mendapat kesalahan ini di mac saya - error given was: Error: bind EACCES null:80.

Salah satu cara untuk mengatasinya adalah dengan menjalankannya dengan akses root. Anda dapat menggunakan sudo npm run devdan membutuhkan kata sandi Anda.

Pada umumnya lebih disukai untuk melayani aplikasi Anda pada port yang tidak memiliki hak istimewa, seperti 3000, yang akan berfungsi tanpa izin root.

referensi: Kesalahan Node.js EACCES saat mendengarkan di port http 80 (izin ditolak)

PAN ZILONG
sumber
2

Aku punya masalah yang sama bahwa itu menyangkal untuk berjalan pada port 8080, tetapi juga setiap lainnya.

Ternyata, itu karena env.localfile yang dibacanya berisi komentar setelah nama variabel seperti:

PORT=8080 # The port the server runs at

Dan itu menafsirkannya seperti itu, mencoba menggunakan port " 8080 # The port the server runs at", yang jelas merupakan port yang tidak valid (-1). Menghapus komentar sepenuhnya menyelesaikannya.

Omong-omong, menggunakan Windows 10 dan Git Bash.


Aku tahu itu tidak persis masalah yang dijelaskan di sini, tetapi mungkin membantu seseorang di luar sana. Saya mendarat di pertanyaan ini mencari masalah untuk jawaban saya, jadi ... mungkin?

Fusseldieb
sumber
Yap, saya pernah mengalami ini. Komentar setelah nilai dalam file .env dapat menyebabkan ini.
Danoz
1

Ingatlah jika Anda menggunakan sudo untuk mengikat port 80 dan menggunakan variabel env PORT & NODE_ENV Anda harus mengekspor kembali vars tersebut karena Anda sekarang berada di bawah profil root dan bukan profil pengguna Anda. Jadi, agar ini berfungsi di Mac saya, saya melakukan hal berikut:

sudo su
export NODE_ENV=production
export PORT=80
docpad run
Sean
sumber
1

ini terjadi jika port yang Anda coba host secara lokal portfowarded

Jasper Smith
sumber
1

Coba authbind:

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

Setelah menginstal, Anda dapat menambahkan file dengan nama nomor port yang ingin Anda gunakan di folder berikut: / etc / authbind / byport /

Berikan 500 izin menggunakan chmod dan ubah kepemilikan ke pengguna yang Anda inginkan untuk menjalankan program.

Setelah itu, lakukan "authbind node ..." sebagai pengguna di proyek Anda.

DraughtGlobe
sumber
1

Kesalahan saya teratasi hanya dengan mengubah nomor port di server.js Khususnya di baris ini

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

Saya mengubah nomor port saya menjadi 8085 dari 8080.

Semoga ini bisa membantu.

Alok Ranjan
sumber
0

Setelah mencoba berbagai cara, menginstal ulang IIS di windows saya memecahkan masalah.

CageE
sumber
0

Kesalahan saya diselesaikan menggunakan (Pada Windows)

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

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

Izinkan aplikasi NodeJS untuk mengakses jaringan di Windows Firewall.

Prathamesh Lebih Banyak
sumber
0

restart tidak cukup! Satu-satunya cara untuk memecahkan masalah adalah dengan yang berikut:

Anda harus mematikan layanan yang berjalan di port itu.

di cmd, jalankan sebagai admin, lalu ketik: netstat -aon | temukan / saya "mendengarkan"

maka Anda akan mendapatkan daftar dengan layanan aktif, mencari port yang berjalan pada 4200 dan menggunakan proses id yang merupakan kolom terakhir untuk membunuhnya dengan

: taskkill / F / PID 2652

Krebto
sumber