首页 文章

Node.js Nginx - 现在怎么办?

提问于
浏览
884

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

  • 他们应该如何一起工作?我该如何处理这些要求?

  • Node.js服务器有2个概念,哪一个更好:

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

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

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

11 回答

  • 4

    您还可以在一个服务器配置中为应用程序添加不同的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/;
        }
    }
    

    重启nginx:

    sudo service nginx restart
    

    启动应用程序

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

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

    我们可以通过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
         }
       }
    

    在上面设置你的Nodejs应用程序,

    • 获取 HTTP_HOST 标头,您可以在其中应用特定于域的逻辑来提供响应 . “

    • 您的应用程序必须由流程管理器(如pm2或主管)管理,以处理情况/重用套接字或资源等 .

    • 设置错误报告服务以获取 生产环境 错误,如sentryrollbar

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

  • 6

    具有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;
      }
    }
    
  • 1201

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

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

  • 147

    如果要管理每个微服务方式并运行它,可以使用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.
    

    这是最好的,正如你所说的那样容易

  • 47

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

    }

    Server the request

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

    forward the request to another server

    当请求网址是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中配置它 .

  • 29

    回答你的问题2:

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

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

  • 9

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

    服务器{
    听80;
    听[::]:80;
    server_name前端;

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

    location @ pet-project {
    重写/demo/pet-project(.*)$ 1休息;

    proxy_set_header X-Real-IP $ remote_addr;
    proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
    proxy_set_header主机$ 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

  • 5

    我在Github Build 了一个你可以克隆的存储库,vagrant-node-nginx-boilerplate

    基本上 /var/www/nodeapp 的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/');
    

    /etc/nginx/sites-available/ 的nginx配置是

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

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

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

    /etc/nginx/sites-available/ 创建文件 yourdomain.com

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

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

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

    测试语法错误:

    nginx -t
    

    重启nginx:

    sudo /etc/init.d/nginx restart
    

    最后启动节点服务器:

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

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

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

  • 0

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

    例如,要实现这些:

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

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

相关问题