Saya menjalankan instans Debian di Amazon EC2 dengan Node.js diinstal. Jika saya menjalankan kode di bawah ini:
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");
Saya mendapatkan output di bawah ini yang memberi tahu saya ada proses lain yang mendengarkan di port 80:
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)
Sekarang ketika saya memeriksa untuk melihat apakah ada proses (sebagai root jika ada yang tersembunyi) mendengarkan pada port 80 menggunakan:
netstat -tupln
Saya mendapatkan output di bawah ini, yang memberi tahu saya tidak ada yang mendengarkan di port 80:
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
Saya harus mencatat bahwa debian memiliki port 80 terbuka sebagai aturan masuk jika itu membuat perbedaan.
Pertanyaan saya adalah: Apa yang saya lakukan salah? Kenapa saya tidak dapat mengidentifikasi proses mendengarkan port 80? Mengapa diblokir di Debian? Langkah apa yang harus saya ambil agar kode berjalan dengan benar?
sumber
Alih-alih berjalan pada port 80, Anda dapat mengalihkan port 80 ke port aplikasi Anda (> 1024) menggunakan
Ini akan bekerja jika aplikasi Anda berjalan pada port 3000.
sumber
sudo
.Jawaban singkat: Anda dapat mengizinkan akses node ke port itu menggunakan:
setcap 'cap_net_bind_service=+ep' /path/to/nodejs
jawaban panjang
Edit:
Mungkin tidak berfungsi pada versi node baru
sumber
Perhatikan bahwa jika Anda telah
apache
menjalankan, Anda dapat membuat proxy terbalik di vhost. Jika node Anda berjalan di porta8080
:Tentu saja, tambahkan server ke
/etc/hosts
:Anda perlu mengaktifkan modul apache yang relevan:
... dan sekarang Anda dapat terhubung ke
http://myLocalServer
.sumber
Bagi mereka yang mencari solusi cepat dan mudah untuk lingkungan pengembangan , penerusan porta melalui ssh bisa menjadi alternatif yang bagus:
Ini meneruskan port 80 di localhost ke port 3000 di localhost.
Ini harus dijalankan sebagai root (port istimewa). Untuk membatalkannya, cukup tekan ctrl-c di terminal. (Anda dapat menambahkan
-f
bendera untuk menjalankan perintah di latar belakang, tetapi kemudian Anda perlu menemukannya lagi untuk mematikannya).Solusi ini mengharuskan Anda memiliki server ssh yang berjalan secara lokal . Ini dapat dilakukan dengan cepat , tetapi harap diingat implikasi keamanan jika Anda berada di jaringan bersama. Anda mungkin ingin menerapkan setidaknya beberapa tingkat keamanan tambahan (nonaktifkan kata sandi & login root).
Saya pribadi hanya pernah menggunakan ini di mesin lokal saya. Saya tidak yakin bagaimana pengaruhnya terhadap kecepatan pemrosesan permintaan Anda jika Anda menjalankan ini pada produksi, mungkin seseorang punya ide. Bagaimanapun, Anda perlu memastikan perintah ini terus berjalan sepanjang waktu, yang menyebabkan lebih banyak sakit kepala. Untuk lingkungan produksi , saya sarankan menggunakan proxy terbalik seperti nginx .
sumber
jawaban heksasiana benar. tetapi apakah ada solusi untuk membuat ini berhasil?
jawabannya iya.
bagaimana?
Anda dapat menggunakan
reverse proxy
misalnya menjalankannginx reverse proxy
di port80
dan meneruskan proxy ke tujuanip:port
node yang menggunakannya.Anda dapat mengaturnya menggunakan
docker container
yang membuat hidup lebih mudah. ini adalah versi resmi nginx di hub docker yang dapat Anda tarik.bahkan ada lebih banyak manfaat dalam menggunakan
reverse proxy
yang Anda dapat google.sumber
Saya mendapatkan kesalahan yang sama dan saya mencoba menjalankan aplikasi saya menggunakan sudo dan itu berhasil untuk saya.
tanpa sudo
dan dengan sudo
sumber
Menggunakan PORT 80 membutuhkan beberapa izin khusus. Menggunakan
sudo
sebelum menjalankan pernyataan aplikasi memecahkan masalah saya. misalnya, jika Anda menggunakan npm untuk menjalankan aplikasi, Anda dapat mengetiksudo npm start
sumber
Kode kesalahan
EACCES
berarti Anda tidak memiliki izin yang tepat untuk menjalankan aplikasi di porta itu. Pada sistem Linux, port apa pun di bawah 1024 memerlukan akses root.Jalankan program dengan
sudo
izin. Jalankansudo su
perintah sebelum menjalankan program.sumber