Node.js'yi bağlantı noktası 80 (Ubuntu / Linode) ile çalıştırırken en iyi uygulamalar [kapalı]


260

İlk Node.jssunucumu cloud Linux nodekuruyorum ve detayları için oldukça yeniyim Linux admin. (BTW Apache'yi aynı anda kullanmaya çalışmıyorum.)

Her şey doğru kuruldu, ama ben kullanmazsam düğüm ile root logindinleyemediğimi fark ettim port 80. Ancak güvenlik nedeniyle kök olarak çalıştırmak istemem.

En iyi uygulama hangisidir?

  1. Düğüm için güvenli / korumalı olacak şekilde iyi izinler / kullanıcı ayarlandı mı?
  2. 80 numaralı bağlantı noktasının bu kısıtlamalar dahilinde kullanılmasına izin verin.
  3. Düğümü başlatın ve otomatik olarak çalıştırın.
  4. Konsola gönderilen günlük bilgilerini işleyin.
  5. Diğer genel bakım ve güvenlik endişeleri.

Bağlantı noktası 80 trafiğini farklı bir dinleme bağlantı noktasına mı yönlendirmeliyim?

Teşekkürler

Yanıtlar:


532

Bağlantı Noktası 80

Bulut bulut sunucularımda yaptığım şey, 80 numaralı bağlantı noktasını bu komutla 3000 numaralı bağlantı noktasına yeniden yönlendirmektir:

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

Sonra Node.js'imi 3000 numaralı bağlantı noktasında başlatıyorum. 80 numaralı bağlantı noktasından gelen istekler 3000 numaralı bağlantı noktasına eşlenecek.

Ayrıca /etc/rc.localdosyanızı düzenlemeli ve bu satırı eksi olarak eklemelisiniz sudo. Bu, makine açıldığında yönlendirmeyi ekleyecektir. İhtiyacınız yoktur sudo, /etc/rc.localçünkü oradaki komutlar rootsistem önyüklenirken çalıştırılır .

Kütükler

Node.js dosyanızı ile başlatmak için sonsuza dek modülünü kullanın . Herhangi bir çökme durumunda yeniden başlatıldığından emin olur ve konsol günlüklerini bir dosyaya yönlendirir.

Önyüklemede Başlat

Bağlantı noktası yeniden yönlendirmesi için düzenlediğiniz dosyaya Node.js başlangıç ​​komut dosyanızı ekleyin /etc/rc.local. Bu, sistem başladığında Node.js başlatma komut dosyanızı çalıştıracaktır.

Dijital Okyanus ve diğer VPS

Bu sadece Linode için değil, Digital Ocean, AWS EC2 ve diğer VPS sağlayıcıları için de geçerlidir. Ancak, RedHat tabanlı sistemler /etc/rc.localüzerinde /ect/rc.d/local.


3
Bu cevap için teşekkürler, güzel ve noktaya.
Robotbugs

21
BTW, Ubuntu'da, /etc/rc.local
kehers

12
Genellikle "-i eth0" bayrağı sanal özel sunucular için bir sorun olacaktır. Eth0'ı gerektiği gibi değiştirin.
JHAWN

7
Node.js başlangıç ​​komut dosyamı eklersem , sistem önyüklemesinde /etc/rc.localolduğu gibi çalıştırılmaz rootmı? Bu, 80 numaralı bağlantı noktasının amacını yener.
jamix

4
Bağlantı noktası yönlendirmesinin çalışması için, hedef bağlantı noktasının güvenlik duvarınızda da açık olması gerektiğini unutmayın. WRT, önyükleme sırasında bir düğüm örneği başlatırken, bir kullanıcıyı belirtmenize izin veren dağıtımların başlangıç ​​komut dosyalarını / systemd dosyalarını kullanırız.
bk138

116

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, root 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.

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


9
Bu daha iyi, daha basit cevaptır.
Kyle Chadha

2
Ayrıca, burada ayrıntılı cevap eklendi stackoverflow.com/questions/23281895/…
Mehta ile tanışın

1
NGINX gibi bir web sunucusu 80 numaralı bağlantı noktasında nasıl çalışır? Benzer bir şey yapıyor mu?
Eric Andrew Lewis

1
@EricAndrewLewis: Buna bağlı olduğunu söyleyeceğim. Bu hata, sunucuyu kök dışı modda çalıştırdığınızda görünecektir. Ya Nginx sunucusunu root kullanıcısı olarak çalıştırıyorsanız! Ayrıca, normal kullanıcı olarak çalışıyor ve hata alıyorsanız. Bağlantı noktasına erişmek için güvenli izinler vermek üzere yukarıdaki komutları çalıştırın. Ayrıca stackoverflow.com/questions/31369480/…
Mehta ile tanışın

16

80 (veya 443) numaralı bağlantı noktasına bağlandıktan sonra kök ayrıcalıklarını bırakın.

Bu, 80/443 numaralı bağlantı noktasının korumalı kalmasına izin verirken, yine de istekleri kök olarak sunmanızı engeller:

function drop_root() {
    process.setgid('nobody');
    process.setuid('nobody');
}

Yukarıdaki işlevi kullanan tam bir çalışma örneği:

var process = require('process');
var http = require('http');
var server = http.createServer(function(req, res) {
    res.write("Success!");
    res.end();
});

server.listen(80, null, null, function() {
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
    drop_root();
    console.log('User ID:',process.getuid()+', Group ID:',process.getgid());
});

Bu tam referansta daha fazla ayrıntı görün .


9

80 numaralı bağlantı noktası için (orijinal soru buydu) Daniel tam olarak haklı. Kısa bir süre önce SSL sertifikalarını yöneten hafif bir nginx proxy'ye httpsgeçmek zorunda kaldım iptables. Ben yararlı bulduğu cevabı bir birlikte ana fikri ile gabrielhpugliese o nasıl ele alınacağı üzerinde. Temelde ben

Umarım bu başka birini baş ağrısından kurtarabilir. Eminim bunu yapmanın saf düğümlü bir yolu vardır, ancak nginx hızlıydı ve işe yaradı.

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.