Pertanyaan Node.js + Nginx - Apa sekarang?


Saya telah mengatur Node.js dan Nginx di server saya. Sekarang saya ingin menggunakannya, tetapi, sebelum saya mulai ada 2 pertanyaan:

  1. Bagaimana cara mereka bekerja bersama? Bagaimana saya harus menangani permintaan tersebut?
  2. Ada 2 konsep untuk server Node.js, mana yang lebih baik:

    Sebuah. Buat server HTTP terpisah untuk setiap situs web yang membutuhkannya. Kemudian muat semua kode JavaScript di awal program, sehingga kode tersebut diinterpretasikan sekali.

    b. Buat satu server Node.js yang menangani semua permintaan Node.js. Ini membaca file yang diminta dan mengosongkan isinya. Jadi file diinterpretasikan pada setiap permintaan, tetapi logika server jauh lebih sederhana.

Tidak jelas bagi saya bagaimana menggunakan Node.js dengan benar.


856
2018-02-15 20:49


asal


Jawaban:


Nginx berfungsi sebagai server ujung depan, yang dalam hal ini mengesahkan permintaan ke server node.js. Oleh karena itu Anda perlu men-setup file konfigurasi nginx untuk node.

Ini yang telah saya lakukan di kotak Ubuntu saya:

Buat file yourdomain.com di /etc/nginx/sites-available/:

vim /etc/nginx/sites-available/yourdomain.com

Di dalamnya Anda harus memiliki sesuatu seperti:

# the IP(s) on which your node server is running. I chose port 3000.
upstream app_yourdomain {
    server 127.0.0.1:3000;
    keepalive 8;
}

# the nginx server instance
server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com www.yourdomain.com;
    access_log /var/log/nginx/yourdomain.com.log;

    # pass the request to the node.js server with the correct headers
    # and much more can be added, see nginx config options
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_set_header X-NginX-Proxy true;

      proxy_pass http://app_yourdomain/;
      proxy_redirect off;
    }
 }

Jika Anda ingin nginx (> = 1.3.13) untuk menangani permintaan websocket juga, tambahkan baris berikut di location / bagian:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

Setelah Anda memiliki pengaturan ini Anda harus mengaktifkan situs yang ditentukan dalam file konfigurasi di atas:

cd /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com

Buat aplikasi server node Anda di /var/www/yourdomain/app.js dan jalankan di localhost:3000

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello World\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

Tes untuk kesalahan sintaks:

nginx -t

Mulai ulang nginx:

sudo /etc/init.d/nginx restart

Terakhir memulai server simpul:

cd /var/www/yourdomain/ && node app.js

Sekarang Anda akan melihat "Hello World" di domainAnda.com

Satu catatan terakhir berkaitan dengan memulai server node: Anda harus menggunakan semacam sistem pemantauan untuk daemon node. Ada yang luar biasa tutorial di node dengan pemula dan monit.


1177
2018-02-16 10:20



Anda juga dapat mengatur beberapa domain dengan nginx, meneruskan ke beberapa proses node.js.

Misalnya untuk mencapai ini:

/ etc / nginx / sites-enabled / domain1

server {
    listen 80;
    listen [::]:80;
    server_name domain1.com;
    access_log /var/log/nginx/domain1.access.log;
    location / {
        proxy_pass    http://127.0.0.1:4000/;
    }
}

Di / etc / nginx / sites-enabled / domain2

server {
    listen 80;
    listen [::]:80;
    server_name domain2.com;
    access_log /var/log/nginx/domain2.access.log;
    location / {
        proxy_pass    http://127.0.0.1:5000/;
    }
}

146
2018-05-02 11:38



Anda juga dapat memiliki url berbeda untuk aplikasi dalam satu konfigurasi server:

Di / etc / nginx / sites-enabled / yourdomain:

server {
    listen 80;
    listen [::]:80;
    server_name yourdomain.com;

    location ^~ /app1/{
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass    http://127.0.0.1:3000/;
    }

    location ^~ /app2/{
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_pass    http://127.0.0.1:4000/;
    }
}

Mulai ulang nginx:

sudo service nginx restart

Memulai aplikasi.

app1.js node

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app1!\n');
}).listen(3000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:3000/');

node app2.js

var http = require('http');
http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello from app2!\n');
}).listen(4000, "127.0.0.1");
console.log('Server running at http://127.0.0.1:4000/');

44
2018-03-31 17:31



Saya proksi aplikasi Node Express independen melalui Nginx.

Dengan demikian aplikasi baru dapat dengan mudah dipasang dan saya juga dapat menjalankan hal-hal lain di server yang sama di lokasi yang berbeda.

Berikut adalah detail lebih lanjut tentang penyiapan saya dengan contoh konfigurasi Nginx:

Menerapkan beberapa aplikasi Node pada satu server web di subfolder dengan Nginx

Hal-hal menjadi rumit dengan Node ketika Anda perlu memindahkan aplikasi Anda dari localhost ke internet.

Tidak ada pendekatan umum untuk penyebaran Node.

Google dapat menemukan banyak artikel tentang topik ini, tetapi saya berjuang untuk menemukan solusi yang tepat untuk pengaturan yang saya perlukan.

Pada dasarnya, saya memiliki server web dan saya ingin aplikasi Node dipasang ke subfolder (mis. http: // myhost / demo / pet-project /) tanpa memasukkan ketergantungan konfigurasi apa pun ke kode aplikasi.

Pada saat yang sama saya ingin hal-hal lain seperti blog berjalan di server web yang sama.

Kedengarannya sederhana ya? Sepertinya tidak.

Dalam banyak contoh di web, aplikasi Node dapat dijalankan di port 80 atau diproksikan oleh Nginx ke root.

Meskipun kedua pendekatan ini berlaku untuk kasus penggunaan tertentu, keduanya tidak memenuhi kriteria sederhana namun sedikit eksotis.

Itulah mengapa saya membuat konfigurasi Nginx saya sendiri dan di sini adalah ekstrak:

upstream pet_project {
  server localhost:3000;
}

server {
  listen 80;
  listen [::]:80;
  server_name frontend;

  location /demo/pet-project {
    alias /opt/demo/pet-project/public/;
    try_files $uri $uri/ @pet-project;
  }

  location @pet-project {
    rewrite /demo/pet-project(.*) $1 break;

    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $proxy_host;
    proxy_set_header X-NginX-Proxy true;

    proxy_pass http://pet_project;
    proxy_redirect http://pet_project/ /demo/pet-project/;
  }
}

Dari contoh ini Anda dapat melihat bahwa saya me-mount aplikasi Pet Project Node saya yang berjalan pada port 3000 ke http: // myhost / demo / pet-project.

Nginx pertama memeriksa apakah sumber daya yang diminta adalah file statis tersedia di / opt / demo / pet-project / public / dan jika demikian berfungsi seperti itu yang sangat efisien, jadi kita tidak perlu memiliki lapisan redundan seperti Connect middleware statis.

Kemudian semua permintaan lainnya ditimpa dan diproksikan Pet Project Node aplikasi, sehingga aplikasi Node tidak perlu tahu di mana itu sebenarnya dipasang dan dengan demikian dapat dipindahkan ke mana saja murni oleh konfigurasi.

proxy_redirect adalah suatu keharusan untuk menangani header Lokasi dengan benar. Ini sangat penting jika Anda gunakan res.redirect () di aplikasi Node Anda.

Anda dapat dengan mudah mereplikasi pengaturan ini untuk beberapa aplikasi Node yang berjalan pada port yang berbeda dan menambahkan lebih banyak penangan lokasi untuk tujuan lain.

Dari: http://skovalyov.blogspot.dk/2012/07/deploy-multiple-node-applications-on.html


26
2017-07-13 07:53



Node.js dengan konfigurasi Nginx.

$ sudo nano /etc/nginx/sites-available/subdomain.your_domain.com

tambahkan konfigurasi berikut sehingga Nginx bertindak sebagai proxy redirect ke port 3000 traffic dari server ketika kita berasal dari "subdomain.your_domain.com"

upstream subdomain.your_domain.com {
  server 127.0.0.1:3000;
}
server {
  listen 80;
  listen [::]:80;
  server_name subdomain.your_domain.com;
  access_log /var/log/nginx/subdomain.your_domain.access.log;
  error_log /var/log/nginx/subdomain.your_domain.error.log debug;
  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarder-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://subdomain.your_domain.com;
    proxy_redirect off;
  }
}

8
2018-03-17 12:24



menjawab pertanyaan Anda 2:

Saya akan menggunakan opsi b hanya karena mengkonsumsi sumber daya jauh lebih sedikit. dengan opsi 'a', setiap klien akan menyebabkan server mengkonsumsi banyak memori, memuat semua file yang Anda butuhkan (meskipun saya suka php, ini adalah salah satu masalah dengan itu). Dengan opsi 'b' Anda dapat memuat pustaka Anda (kode yang dapat digunakan kembali) dan membagikannya di antara semua permintaan klien.

Tetapi pastikan bahwa jika Anda memiliki beberapa core Anda harus men-tweak node.js untuk menggunakan semuanya.


6
2018-01-03 04:51



Anda juga bisa menggunakan node.js untuk menghasilkan file statis ke dalam direktori yang dilayani oleh nginx. Tentu saja, beberapa bagian dinamis dari situs Anda dapat dilayani oleh node, dan beberapa oleh nginx (statis).

Setelah beberapa dari mereka dilayani oleh nginx meningkatkan kinerja Anda ..


5
2017-07-05 14:17



Kita dapat dengan mudah mengatur aplikasi Nodejs oleh Nginx bertindak sebagai proxy terbalik.
Konfigurasi berikut mengasumsikan aplikasi NodeJS berjalan di 127.0.0.1:8080,

  server{
     server_name domain.com sub.domain.com; # multiple domains

     location /{ 
      proxy_pass http://127.0.0.1:8080;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }

     location /static/{
       alias /absolute/path/to/static/files; # nginx will handle js/css
     }
   } 

di atas pengaturan aplikasi Nodejs Anda akan,

  • mendapatkan HTTP_HOST tajuk tempat Anda dapat menerapkan logika khusus domain untuk melayani respons. '
  • Aplikasi Anda harus dikelola oleh manajer proses seperti pm2 atau supervisor untuk menangani situasi / menggunakan kembali soket atau sumber daya dll.

  • Siapkan layanan pelaporan kesalahan untuk mendapatkan kesalahan produksi jaga atau rollbar

CATATAN: Anda dapat mengatur logika untuk menyerahkan rute permintaan khusus domain, buat a middleware untuk aplikasi expressjs


4
2018-01-07 18:54



Saya membuat repositori di Github yang dapat Anda kloning, gelandangan-simpul-nginx-boilerplate

pada dasarnya aplikasi node.js di /var/www/nodeapp aku s

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(4570, '127.0.0.1');

console.log('Node Server running at 127.0.0.1:4570/');

dan konfigurasi nginx di /etc/nginx/sites-available/ aku s

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/nodeapp;
        index index.html index.htm;

        server_name localhost;

        location / {
          proxy_pass http://127.0.0.1:4570;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection 'upgrade';
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
}

4
2018-03-18 10:24



Nginx dapat bertindak sebagai server proxy terbalik yang berfungsi seperti manajer proyek. Ketika mendapat permintaan itu menganalisisnya dan meneruskan permintaan ke hulu (anggota proyek) atau menangani dirinya sendiri. Nginx memiliki dua cara menangani permintaan berdasarkan cara pengaturannya.

  • melayani permintaan
  • meneruskan permintaan ke server lain

    server{
     server_name mydomain.com sub.mydomain.com;
    
     location /{ 
      proxy_pass http://127.0.0.1:8000;  
      proxy_set_header Host $host;
      proxy_pass_request_headers on;  
     }
    
     location /static/{
       alias /my/static/files/path;
     }
    

    }

Server permintaan

Dengan konfigurasi ini ketika permintaan url adalah    mydomain.com/static/myjs.js itu mengembalikan myjs.js file di    /my/static/files/path map. Saat Anda mengonfigurasi nginx untuk melayani   file statis itu menangani permintaan itu sendiri.

meneruskan permintaan ke server lain

Ketika permintaan url adalah mydomain.com/dothis nginx akan meneruskan   permintaan untuk http://127.0.0.1:8000. Layanan yang sedang berjalan di   port localhost 8000 akan menerima permintaan dan mengembalikan respons   ke nginx dan nginx mengembalikan respons ke klien.

Ketika Anda menjalankan server node.js pada port 8000 nginx akan meneruskan permintaan ke node.js. Tulis logika node.js dan tangani permintaan itu. Itu saja Anda memiliki server nodejs Anda berjalan di belakang server nginx.

Jika Anda ingin menjalankan layanan lain selain nodejs, jalankan layanan lain seperti Django, flask, php pada port yang berbeda dan konfigurasikan dalam nginx.


2
2017-09-27 08:07