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

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

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

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

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

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


#1楼

您还可以使用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/;
    }
}

#2楼

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


#3楼

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

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


#4楼

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

#5楼

我在Github中建立了一个仓库,您可以克隆它, 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;
        }
}

#6楼

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

启动应用程序。

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

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

#7楼

我们可以通过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之类的流程经理或主管来管理,以处理情况/重用套接字或资源等。

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

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


#8楼

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 。 在本地主机8000端口上运行的服务将接收请求,并将响应返回给nginx,而nginx将响应返回给客户端。

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

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


#9楼

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”

关于启动节点服务器的最后一点说明:您应该对节点守护程序使用某种监视系统。 有一个关于upstart和monit的很棒的教程


#10楼

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

最好,正如您所说的那样


#11楼

回答您的问题2:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要部署一个Node.js和Vue.js的前后端项目,你需要按照以下步骤进行操作: 1. 首先,在购买完服务器后,使用secureCRT等工具与服务器建立连接。 2. 进行Node.js的配置。你可以通过下载Node.js的源码,并解压到指定位置。可以从Node.js的官网获取压缩档源代码,选择你需要的版本。例如,你可以使用以下命令来下载和解压Node.js源码: ``` wget https://nodejs.org/dist/v16.7.0/node-v16.7.0-linux-x64.tar.gz tar -zxvf node-v16.7.0-linux-x64.tar.gz mv node-v16.7.0-linux-x64 node ``` 确保你已经成功安装了Node.js,可以使用以下命令来验证安装: ``` cd node/bin && ls ./node -v ``` 如果能够正确显示Node.js的版本号,则表示你已成功安装Node.js。 3. 全局配置。在配置Node.js之后,你还需要进行一些全局配置。例如,你可以安装淘宝镜像cnpm,这样可以加快包的下载速度。 4. 安装和配置MongoDB。如果你的项目需要使用MongoDB数据库,你还需要安装和配置MongoDB。你可以根据需求选择适合你的版本和安装方式。 5. 上传Node.js服务器项目。将你的Node.js项目上传到服务器上,确保项目的目录结构和依赖项都正确。 6. 部署Vue.js项目。同样,将你的Vue.js项目部署到服务器上。可以使用相关工具将Vue.js项目打包成静态文件,并将这些文件部署到服务器上。 7. 配置Nginx代理。为了使Node.js和Vue.js项目能够正常运行,你需要配置Nginx代理。通过配置Nginx,可以将客户端的请求转发到Node.js和Vue.js的相应端口上。 以上是部署Node.js和Vue.js前后端项目的一般步骤。具体的配置和部署方式可能会因具体的项目需求而略有不同。请根据你的项目情况进行相应的调整和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值