Bagaimana menjalankan aplikasi node.js di port 80? Apakah proses memblokir port saya?


8

Saya percaya port 80 pada instance jarak jauh saya diblokir, dan saya mencoba menjalankan aplikasi node.js menggunakan port 80. Saya telah bereksperimen dengan port 3000 dan 3002, dan kedua port bekerja dengan baik, tetapi saya mendapatkan kesalahan saat menjalankan pada port 80. Saya menduga port 80 diblokir dari output saya di netstat -anbawah, tetapi bagaimana saya bisa menemukan id proses dari alamat yang memblokir port 80 di bawah ini?

[lucas@ecoinstance]~/node/nodetest1$ netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:3002            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:27017         127.0.0.1:51108         ESTABLISHED
tcp        0      0 127.0.0.1:51106         127.0.0.1:27017         ESTABLISHED
tcp        0      0 127.0.0.1:27017         127.0.0.1:51106         ESTABLISHED
tcp        0      0 127.0.0.1:51107         127.0.0.1:27017         ESTABLISHED
tcp        0      0 10.240.241.116:3002     174.61.171.61:36583     TIME_WAIT  
tcp        0      0 127.0.0.1:27017         127.0.0.1:51109         ESTABLISHED
tcp        0      0 10.240.241.116:42423    169.254.169.254:80      ESTABLISHED
tcp        0      0 127.0.0.1:51108         127.0.0.1:27017         ESTABLISHED
tcp        0    532 10.240.241.116:22       174.61.171.61:56824     ESTABLISHED
tcp        0      0 127.0.0.1:27017         127.0.0.1:51107         ESTABLISHED
tcp        0      0 10.240.241.116:42412    169.254.169.254:80      ESTABLISHED
tcp        0      0 127.0.0.1:51109         127.0.0.1:27017         ESTABLISHED
tcp        0      0 127.0.0.1:51105         127.0.0.1:27017         ESTABLISHED
tcp        0      0 10.240.241.116:42422    169.254.169.254:80      TIME_WAIT  
tcp        0      0 127.0.0.1:27017         127.0.0.1:51105         ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN     
udp        0      0 0.0.0.0:49948           0.0.0.0:*                          
udp        0      0 0.0.0.0:68              0.0.0.0:*                          
udp        0      0 10.240.241.116:123      0.0.0.0:*                          
udp        0      0 127.0.0.1:123           0.0.0.0:*                          
udp        0      0 0.0.0.0:123             0.0.0.0:*                          
udp6       0      0 :::12151                :::*                               
udp6       0      0 :::123                  :::*                               
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     405680   /tmp/ssh-KdkxJfFLpKTC/agent.22
813
unix  2      [ ACC ]     STREAM     LISTENING     408230   /tmp/ssh-ofUeNNEwAqtP/agent.22
243
unix  2      [ ACC ]     STREAM     LISTENING     416227   /tmp/mongodb-27017.sock
unix  2      [ ACC ]     SEQPACKET  LISTENING     3692     /run/udev/control
unix  7      [ ]         DGRAM                    5286     /dev/log
unix  2      [ ACC ]     STREAM     LISTENING     5318     /var/run/acpid.socket
unix  2      [ ACC ]     STREAM     LISTENING     16170    /tmp//tmux-1000/default
unix  2      [ ACC ]     STREAM     LISTENING     414450   /var/run/dbus/system_bus_socke

Dan di sini adalah log ketika mencoba dijalankan pada port 80 dengan node.js:

[lucas@ecoinstance]~/node/nodetest1$ npm start

> nodetest1@0.0.1 start /home/lucas/node/nodetest1
> node ./bin/www


events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: listen EACCES
    at errnoException (net.js:904:11)
    at Server._listen2 (net.js:1023:19)
    at listen (net.js:1064:10)
    at Server.listen (net.js:1138:5)
    at Function.app.listen (/home/lucas/node/nodetest1/node_modules/express/lib/applicati
on.js:532:24)                                                                           
    at Object.<anonymous> (/home/lucas/node/nodetest1/bin/www:7:18)
    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)

npm ERR! nodetest1@0.0.1 start: `node ./bin/www`
npm ERR! Exit status 8
npm ERR! 
npm ERR! Failed at the nodetest1@0.0.1 start script.
npm ERR! This is most likely a problem with the nodetest1 package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node ./bin/www
npm ERR! You can get their info via:
npm ERR!     npm owner ls nodetest1
npm ERR! There is likely additional logging output above.
npm ERR! System Linux 3.13-0.bpo.1-amd64
npm ERR! command "/usr/local/bin/node" "/usr/local/bin/npm" "start"
npm ERR! cwd /home/lucas/node/nodetest1
npm ERR! node -v v0.10.28
npm ERR! npm -v 1.4.9
npm ERR! code ELIFECYCLE
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/lucas/node/nodetest1/npm-debug.log
npm ERR! not ok code 0

Dan sudo netstat -lnptidak mengembalikan port 80-an yang cocok:

[lucas@ecoinstance]~/node/nodetest1$ sudo netstat -lnp                           [48/648]
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Progr
am name
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      29160/mon
god    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1976/sshd

tcp6       0      0 :::22                   :::*                    LISTEN      1976/sshd

udp        0      0 0.0.0.0:49948           0.0.0.0:*                           1604/dhcl
ient   
udp        0      0 0.0.0.0:68              0.0.0.0:*                           1604/dhcl
ient   
udp        0      0 10.240.241.116:123      0.0.0.0:*                           2076/ntpd

udp        0      0 127.0.0.1:123           0.0.0.0:*                           2076/ntpd

udp        0      0 0.0.0.0:123             0.0.0.0:*                           2076/ntpd

udp6       0      0 :::12151                :::*                                1604/dhcl
ient   
udp6       0      0 :::123                  :::*                                2076/ntpd

Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   PID/Program name    Path
unix  2      [ ACC ]     STREAM     LISTENING     405680   22814/ssh-agent     /tmp/ssh-K
dkxJfFLpKTC/agent.22813
unix  2      [ ACC ]     STREAM     LISTENING     408230   24049/ssh-agent     /tmp/ssh-o
fUeNNEwAqtP/agent.22243
unix  2      [ ACC ]     STREAM     LISTENING     416227   29160/mongod        /tmp/mongo
db-27017.sock
unix  2      [ ACC ]     SEQPACKET  LISTENING     3692     284/udevd           /run/udev/
control
unix  2      [ ACC ]     STREAM     LISTENING     5318     1798/acpid          /var/run/a
cpid.socket
unix  2      [ ACC ]     STREAM     LISTENING     16170    5177/tmux           /tmp//tmux
-1000/default
unix  2      [ ACC ]     STREAM     LISTENING     414450   28213/dbus-daemon   /var/run/d
bus/system_bus_socket
unix  2      [ ACC ]     STREAM     LISTENING     404225   22324/1             /tmp/ssh-9
TlDmu4bjl/agent.22324

Jawaban:


15

Anda mencoba memulai simpul sebagai pengguna non-root. Linux secara default hanya memungkinkan root untuk mengikat ke port 1024 atau lebih rendah.

Jika Anda ingin menjalankannya sebagai pengguna ini, Anda mungkin ingin melihat /programming/413807/is-there-a-way-for-non-root-processes-to-bind-to- privilege-ports-1024-on-l


1
Menurut halaman bindmanual: EACCES The address is protected, and the user is not the superuser.Dan Anda lihat EACCESdi laporan kesalahan Anda.
Matthew Ife


1

Jawaban sederhana, jawaban terbaik:

  • sudo apt-get install libcap2-bin
  • sudo setcap cap_net_bind_service=+ep /usr/local/bin/node
  • Ta da! Ini memungkinkan aplikasi simpul Anda berjalan di port 80 tanpa mengeluh.

Mengapa saya menyukainya? Karena:

  • Anda tidak harus menggunakan apache atau nginx
  • Anda tidak harus menjalankan aplikasi sebagai root
  • Anda tidak perlu meneruskan port (dan menanganinya setiap kali mesin Anda boot)

Tautan Referensi: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps (Artikel yang bagus tentang cara mengatur aplikasi simpul Anda di cloud hosting).


bagaimana dengan platform selain ubuntu?
Michael

Harus bekerja pada apa pun * nix, saya percaya
Kyle Chadha

1
Bagaimana cara mengembalikan perubahan ini jika tidak berhasil .. ??
Ritesh

1

Saya mencoba menjalankan server menggunakan node server.js. Itu tidak muncul kesalahan. Juga,

lsof -t -i:80

tidak mencantumkan proses apa pun .

Masalahnya adalah saya mencoba untuk mengikat sebagai pengguna yang tidak memiliki hak istimewa. Itu berhasil ketika saya mencoba:

sudo node server.js

Sangat sederhana, tetapi, kadang-kadang Anda mungkin lupa dan Anda akan mulai berjalan di belakang proses server lain ketika Anda memiliki beberapa server seperti apache, nginx dll berjalan di mesin Anda. (Sama seperti yang saya lakukan). Semoga ini bisa membantu seseorang !!!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.