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

Van*_*ing 964 nginx concept node.js

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

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

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

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

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

Joa*_*lva 1270

Nginx作为前端服务器工作,在这种情况下代理请求到node.js服务器.因此,您需要为节点设置nginx配置文件.

这就是我在Ubuntu框中所做的:

yourdomain.com/etc/nginx/sites-available/以下位置创建文件:

vim /etc/nginx/sites-available/yourdomain.com
Run Code Online (Sandbox Code Playgroud)

你应该有这样的东西:

# 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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

如果你想要nginx(> = 1.3.13)来处理websocket请求,请在以下location /部分添加以下行:

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
Run Code Online (Sandbox Code Playgroud)

完成此设置后,您必须启用上面配置文件中定义的站点:

cd /etc/nginx/sites-enabled/ 
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com
Run Code Online (Sandbox Code Playgroud)

创建您的节点服务器应用程序/var/www/yourdomain/app.js并运行它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/');
Run Code Online (Sandbox Code Playgroud)

测试语法错误:

nginx -t
Run Code Online (Sandbox Code Playgroud)

重启nginx:

sudo /etc/init.d/nginx restart
Run Code Online (Sandbox Code Playgroud)

最后启动节点服务器:

cd /var/www/yourdomain/ && node app.js
Run Code Online (Sandbox Code Playgroud)

现在你应该在yourdomain.com上看到"Hello World"

关于启动节点服务器的最后一点注意事项:您应该为节点守护程序使用某种监视系统.有关upstart和monit的节点上有一个很棒的教程.

  • 你有什么理由不能做`location/{proxy_pass http://127.0.0.1:3000; }`?为什么需要整个`upstream`配置位? (74认同)
  • 应该注意的是,这个(非常有用的)答案是指一种nginx,默认情况下,它带有`/ etc/nginx`里面的`sites-enabled`和`sites-available`目录.如果您的版本没有这两个目录,则可能只有一个`conf.d`目录.在这种情况下,遵循这些说明将没有任何效果,除非你修改文件`nginx.conf`中的`include`语句指向`sites-enabled`而不是默认的`conf.d`.希望有道理.一旦你在`nginx.conf`中看到所说的`include`语句,它应该变得自我解释了. (71认同)
  • @Robin Winslow,以防您想为服务器添加更多服务器以实现负载平衡. (32认同)
  • +1,对常见问题非常简单明了的答案; 非常适合想要使用node和nginx设置虚拟主机的用户.我认为你唯一遗漏的是定性答案为什么nginx-in-of-node最适合服务多个vhosts(asker的第二个问题). (19认同)
  • 感谢帖子,nginx会缓存上面服务器的nod​​e.js响应,或者每次都重新运行它们. (10认同)

250*_*50R 161

您还可以使用nginx设置多个域,转发到多个node.js进程.

例如,要实现这些:

在/ etc/nginx的/启用的站点 - /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/;
    }
}
Run Code Online (Sandbox Code Playgroud)

在/ 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/;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用你的proxy_pass方法,但由于某种原因``http:// example.com`会自动`302`到`http:// www.example.com`.这是为什么? (5认同)

0x8*_*00D 55

您还可以在一个服务器配置中为应用程序添加不同的URL:

/ 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/;
    }
}
Run Code Online (Sandbox Code Playgroud)

重启nginx:

sudo service nginx restart
Run Code Online (Sandbox Code Playgroud)

启动应用程序

节点app1.js

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/');
Run Code Online (Sandbox Code Playgroud)

节点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/');
Run Code Online (Sandbox Code Playgroud)

  • 开源社区版本是免费的,但它们的版本具有其他非免费功能.https://www.nginx.com/products/feature-matrix/ (3认同)
  • @MauroAguilar如果您在一台服务器上需要2个node.js应用程序,则可以使用建议的方式(使用不同的端口)为它们提供服务.在我的例子中,它是两个不同的测试应用程序 (2认同)
  • @MauroAguilar,你可以单独运行它们,如果它可以是一个项目的一部分并且具有相同的目的,那么没有任何好处.但是,如果您需要在一台服务器上运行具有不同目的和不同配置的2个不同项目,那么您可以使用此配置. (2认同)

sko*_*yov 32

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

因此,可以轻松安装新的应用程序,我也可以在不同位置的同一台服务器上运行其他内容.

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

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

当您需要将应用程序从localhost移动到Internet时,Node会变得棘手.

Node部署没有通用的方法.

谷歌可以找到关于这个主题的大量文章,但我很难为我需要的设置找到合适的解决方案.

基本上,我有一个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/;
  }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,您可以注意到我将在端口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


小智 11

具有Nginx配置的Node.js.

$ sudo nano /etc/nginx/sites-available/subdomain.your_domain.com
Run Code Online (Sandbox Code Playgroud)

添加以下配置,以便当我们来自"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;
  }
}
Run Code Online (Sandbox Code Playgroud)


Hug*_*ota 9

回答你的问题2:

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

但是要知道,如果你有多个核心,你应该调整node.js来使用它们.

  • 如果资源是您最重要的问题(不太可能),请遵循此建议.(a)和(b)之间存在不同的妥协.如果您希望站点更加独立,例如站点重启或维护,数据库连接,代码库,库依赖关系,服务器之间的移动站点等,则选项(a)可能更好. (2认同)

svn*_*vnm 7

我在Github中创建了一个存储库,您可以克隆,vagrant-node-nginx-boilerplate

基本的Node.js应用的/var/www/nodeappIS

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/');
Run Code Online (Sandbox Code Playgroud)

和nginx配置/etc/nginx/sites-available/

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;
        }
}
Run Code Online (Sandbox Code Playgroud)


Vkr*_*ddy 7

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

  • 满足请求

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

     server{
      server_name mydomain.example sub.mydomain.example;
    
      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;
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

服务器请求

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

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

当请求 URL 为 mydomain.example/dothisNginx 时,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中配置它。


cod*_*nja 5

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

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


Ren*_*han 5

我们可以通过Nginx充当反向代理轻松地设置Nodejs应用程序。
以下配置假定NodeJS应用程序在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
     }
   } 
Run Code Online (Sandbox Code Playgroud)

在以上设置中,您的Nodejs应用将

  • 获取HTTP_HOST标头,您可以在其中应用特定于域的逻辑来提供响应。'
  • 您的应用程序必须由pm2之类的流程经理或主管来管理,以处理情况/重用套接字或资源等。

  • 设置错误报告服务以获取生产错误,例如哨兵或侧

注意:您可以设置用于处理域特定请求路由的逻辑,为expressjs应用程序创建中间件