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

node.js Node.js

阿飞西里

2020-03-13

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

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

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

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

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

第1504篇《Node.js + Nginx-现在怎么办?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

7个回答
飞云逆天 2020.03.13

如果要管理每个微服务手段并运行它,则可以使用pm2运行nodejs。节点将在端口中运行,只需在nginx(/etc/nginx/sites-enabled/domain.com)中配置该端口

server{
    listen 80;
    server_name domain.com www.domain.com;

  location / {
     return 403;
  }
    location /url {
        proxy_pass http://localhost:51967/info;
    }
}

使用ping检查localhost是否正在运行。

Create one single Node.js server which handles all Node.js requests. This reads the requested files and evals their contents. So the files are interpreted on each request, but the server logic is much simpler.

这是最好的,而且正如您所说的那样容易

神奇阿良Jim 2020.03.13

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它将返回myjs.js文件/my/static/files/path中的 文件。在将nginx配置为提供静态文件时,它会自行处理请求。

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

当请求url为 mydomain.com/dothisnginx时,会将请求转发到 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中对其进行配置。

小卤蛋猴子猪猪 2020.03.13

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

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

Tom卡卡西 2020.03.13

Nginx配置的Node.js。

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

添加以下配置,以便当我们来自“ subdomain.your_domain.com”时,Nginx充当代理重定向到服务器的端口3000流量

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;
  }
}
神奇Davaid 2020.03.13

我通过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/;
  }
}

From this example you can notice that I mount my Pet Project Node application running on port 3000 to http://myhost/demo/pet-project.

First Nginx checks if whether the requested resource is a static file available at /opt/demo/pet-project/public/ and if so it serves it as is that is highly efficient, so we do not need to have a redundant layer like Connect static middleware.

Then all other requests are overwritten and proxied to Pet Project Node application, so the Node application does not need to know where it is actually mounted and thus can be moved anywhere purely by configuration.

proxy_redirect is a must to handle Location header properly. This is extremely important if you use res.redirect() in your Node application.

You can easily replicate this setup for multiple Node applications running on different ports and add more location handlers for other purposes.

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

HarryStafan 2020.03.13

您还可以使用Nginx设置多个域,并将其转发到多个node.js进程。

例如,实现这些目标:

这些端口(4000和5000)应用于侦听您的应用程序代码中的应用程序请求。

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

在/ 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/;
    }
}
HarryGil 2020.03.13

回答您的问题2:

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

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

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android