Node.js + Nginx - 现在怎么办?

我已经在服务器上设置了 Node.js 和 Nginx。现在,我想使用它,但是在开始之前,有两个问题:

  1. 他们应该如何一起工作?我应该如何处理请求?
  2. Node.js 服务器有两个概念,其中一个更好:

    一种。为每个需要它的网站创建一个单独的 HTTP 服务器。然后在程序开始时加载所有 JavaScript 代码,因此该代码将被解释一次。

    b。创建一个处理所有 Node.js 请求的单个 Node.js 服务器。这将读取请求的文件并评估其内容。因此,每个请求都会解释文件,但是服务器逻辑要简单得多。

我还不清楚如何正确使用 Node.js。

答案

vim /etc/nginx/sites-available/yourdomain.com
# 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;
    }
 }
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
cd /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com
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/');
nginx -t
sudo /etc/init.d/nginx restart
cd /var/www/yourdomain/ && node app.js
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/;
    }
}
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/;
    }
}
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/;
    }
}
sudo service nginx restart
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/');
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/');

我通过 Nginx 代理独立的 Node Express 应用程序。

这样就可以轻松地安装新的应用程序,并且我还可以在同一服务器上不同位置运行其他内容。

以下是有关使用 Nginx 配置示例进行设置的更多详细信息:

使用 Nginx 在子文件夹中的一个 Web 服务器上部署多个 Node 应用程序

当您需要将应用程序从本地主机迁移到 Internet 时,Node 会变得棘手。

没有通用的节点部署方法。

Google 可以找到有关该主题的大量文章,但是我一直在努力寻找适合我所需设置的解决方案。

基本上,我有一个 Web 服务器,我希望将 Node 应用程序安装到子文件夹(即http:// myhost / demo / pet-project / ),而又不对应用程序代码引入任何配置依赖性。

同时,我希望博客之类的其他内容在同一台 Web 服务器上运行。

听起来很简单吧?显然不是。

在 Web 上的许多示例中,节点应用程序要么在端口 80 上运行,要么由 Nginx 代理到根。

即使这两种方法都对某些用例均有效,但它们并不满足我的简单但有点异乎寻常的标准。

这就是为什么我创建了自己的 Nginx 配置并且下面是摘录的原因:

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/;
  }
}

从此示例中,您可以注意到我将在端口 3000 上运行的 Pet Project Node 应用程序安装到http:// myhost / demo / pet-project

首先,Nginx 检查所请求的资源是否为/ opt / demo / pet-project / public / 中可用的静态文件,如果可以的话,它可以高效地提供服务,因此我们不需要像 Connect 这样的冗余层静态中间件。

然后,所有其他请求都将被覆盖并代理到Pet Project Node应用程序,因此 Node 应用程序不需要知道它的实际安装位置,因此可以纯粹通过配置将其移动到任何地方。

必须正确使用proxy_redirect才能处理 Location 标头。如果在 Node 应用程序中使用res.redirect() ,则这非常重要。

您可以轻松地为在不同端口上运行的多个 Node 应用程序复制此设置,并为其他目的添加更多的位置处理程序。

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

$ sudo nano /etc/nginx/sites-available/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;
  }
}

回答您的问题 2:

我之所以使用选项b仅仅是因为它消耗更少的资源。使用选项 “a”,每个客户端都将导致服务器占用大量内存,并加载您需要的所有文件(即使我喜欢 php,这也是它的问题之一)。使用选项 “b”,您可以加载您的库(可重用代码)并在所有客户端请求中共享它们。

但是要注意,如果您有多个内核,则应调整 node.js 以使用所有内核。

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/');
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;
        }
}

您还可以使用 node.js 将静态文件生成到 nginx 服务的目录中。当然,站点的某些动态部分可以由节点提供服务,而某些部分可以由 nginx(静态)提供服务。

nginx 提供其中一些服务可以提高您的性能。

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
     }
   }

Nginx 可以充当反向代理服务器,就像项目经理一样。收到请求后,它将对其进行分析,并将请求转发给上游(项目成员)或自行处理。 Nginx 有两种基于请求配置方式处理请求的方式。

  • 服务请求
  • 将请求转发到另一台服务器

    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;
     }

    }

服务器请求

使用此配置,当请求 URL 为mydomain.com/static/myjs.js它将返回/my/static/files/path文件夹中的myjs.js文件。在将 nginx 配置为提供静态文件时,它会自行处理请求。

将请求转发到另一台服务器

当请求网址为mydomain.com/dothis nginx 会将请求转发至http://127.0.0.1:8000 。在 localhost 8000 端口上运行的服务将接收请求,并将响应返回给 nginx,而 nginx 将响应返回给客户端。

当您在端口 8000 上运行 node.js 服务器时,nginx 会将请求转发到 node.js。编写 node.js 逻辑并处理请求。就是这样,您的 nodejs 服务器在 nginx 服务器后面运行。

如果您想运行除 nodejs 之外的任何其他服务,只需在不同的端口上运行另一个服务(例如 Django,flask,php),然后在 nginx 中对其进行配置。