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

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

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

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

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


#1楼

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

例如,实现这些目标:

  • domain1.com->到在本地运行的Node.js进程http://127.0.0.1:4000
  • domain2.com->到在本地运行的Node.js进程http://127.0.0.1:5000

这些端口(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:

  • yourdomain.com/app1/*->到本地运行的Node.js进程http://127.0.0.1:3000
  • yourdomain.com/app2/*->到本地运行的Node.js进程http://127.0.0.1:4000

/ 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 domainslocation /{ 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 optionslocation / {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以使用所有内核。

Node.js + Nginx-现在怎么办?相关推荐

  1. NGINX配置基于Node.js服务的负载均衡服务器

    NGINX配置基于Node.js服务的负载均衡服务器 本部署指南说明了如何使用NGINX开源和NGINX Plus在Node.js应用程序服务器池之间平衡HTTP和HTTPS通信.本指南中的详细说明适 ...

  2. apache、node.js、nginx、tomcat的关系

    是一类东西,又不是一类东西. 首先他们都能创建 Web 服务器,但是他们关注的点不一样. Tomcat 最好跟 Java 配合,Apache 通常跟 PHP 配合,但也不排除能跟 Node.js 配合 ...

  3. 日记--node.js 和nginx对比环境变量立刻生效https://www.cnblogs.com/zht-blog/p/4033951.html

    Nginx的性能比Node.js的HTTP模块要好很多 但Nginx考量的是面向客户端, 后端业务方面依然是受具体业务影响,而Node.js则可以利用异步I/O来实现业务并行,以提升效率 Nginx没 ...

  4. 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul

    本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...

  5. nginx and node.js配合使用 helloworld

    nginx是最好的反向代理服务器. node.js是... 好吧 ,不介绍了,猛击这里 现在小介绍下怎么用nginx和node.js配合使用. 先写个helloworld.js var http = ...

  6. Node.js服务器启用Gzip压缩

    Gzip是什么 复制大神们的解释吧: GZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNIX系统的文件压缩.我们在Linux中经常会用到后缀为.gz的文件,它们就是GZ ...

  7. 在Ubuntu 14.04上设置生产环境可用的Node.js

    在Ubuntu 14.04上设置生产环境可用的Node.js 提供:ZStack社区 前言 Node.js是一个开源的JavaScript运行时环境,开发者可以用它方便的构建服务器端应用和网络应用.N ...

  8. Node.js + Express + Springboot实现前后端分离架构

    2019独角兽企业重金招聘Python工程师标准>>> 架构说明 前后端分离架构,很多团队都是通过"代理转发"浏览器发往后端的rest请求来解决跨域问题,可以用n ...

  9. 五个最佳案例带你解读Node.js的前后之道

    2019独角兽企业重金招聘Python工程师标准>>> Node.js 是什么? Node.js采用C++语言编写而成,浏览器内核V8做为执行引擎:Node不是JS应用.而是一个Ja ...

  10. [转]为什么我要用 Node.js? 案例逐一介绍

    原文地址:http://blog.jobbole.com/53736/ 介绍 JavaScript 高涨的人气带来了很多变化,以至于如今使用其进行网络开发的形式也变得截然不同了.就如同在浏览器中一样, ...

最新文章

  1. 广州的11个辖区_广州“受欢迎”的2个区,相距仅20公里,若“合并”将超黄埔区...
  2. 如何在SAP WebClient UI里使用HANA Live report
  3. cad怎么向下位移_CAD制图初学入门教程:阵列功能的使用技巧
  4. 大数据预测实战-随机森林预测实战(四)-模型调参
  5. (转) IOS8 设置TableView Separatorinset 分割线从边框顶端开始
  6. Linux ssh 允许 root用户 登录
  7. (8)Xwork容器概览
  8. 参数是html代码,一些html标签的参数messup html/php代码
  9. webservic接收byte[]请求
  10. LOJ#2343. 「JOI 2016 Final」集邮比赛 2
  11. 文本文档变成java文件_java 程序文本文档形式的编写,编译,及运行
  12. vfp 打开服务器文件,VFP下客户机访问任意映射服务器的方法
  13. java excel 批注_Java 添加、读取和删除 Excel 批注
  14. 怎么在html5中加三角形,css中怎么设置三角形?
  15. (NO.00005)iOS实现炸弹人游戏(一):游戏的整体规划设计
  16. 目前住院病人主要由护士护理,这样做不仅需要大量护士,而且由于不能随时观察危重病人的病情变化,还可能会延误抢救时机。某医院打算开发一个以计算机为中心的监护系统,试写出问题定义并且分析开发这个系统的可行性
  17. [论文阅读] LCC-NLM(局部颜色校正, 非线性mask)
  18. java ajax serialize,jQuery使用serialize(),serializeArray()方法取得表单数据
  19. c 语言字体怎么改,Notepad++设置字体语言格式方法介绍
  20. rm -rf xxx遇到device or resource busy

热门文章

  1. 关于WSE_CLIPSIBLINGS
  2. android studio gradle版本太低问题解决方案
  3. iOS架构-静态库.framework之资源文件打包bundle(6)
  4. (0070)iOS开发之AVFoundation枚举属性注解
  5. day3----str常用操作方法
  6. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
  7. Xcode 中关于#的小知识
  8. 算法:ACM二分图匹配 HDU2063
  9. 管理软件预警通知(Notification)功能的实现案例分析
  10. C# “不支持给定路径的格式”异常处理