我已经在服务器上设置了Node.js和Nginx。 现在,我想使用它,但是在开始之前,有两个问题:
Node.js服务器有两个概念,其中一个更好:
一种。 为每个需要它的网站创建一个单独的HTTP服务器。 然后在程序开始时加载所有JavaScript代码,因此代码将被解释一次。
b。 创建一个处理所有Node.js请求的单个Node.js服务器。 这将读取请求的文件并评估其内容。 因此,每个请求都将解释文件,但是服务器逻辑要简单得多。
我不清楚如何正确使用Node.js。
您还可以使用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/;
}
}
我通过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
您还可以使用node.js将静态文件生成到nginx服务的目录中。 当然,站点的某些动态部分可以由节点提供服务,而某些部分可以由nginx(静态)提供服务。
nginx提供其中一些服务可以提高您的性能。
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;
}
}
我在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;
}
}
您还可以在一个服务器配置中为应用程序使用不同的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/');
我们可以通过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应用程序创建中间件
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中对其进行配置。
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的很棒的教程 。
如果要管理并运行每个微服务手段,则可以使用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.
最好,正如您所说的那样
回答您的问题2:
我之所以使用选项b
仅仅是因为它消耗更少的资源。 使用选项“ a”,每个客户端将导致服务器占用大量内存,并加载您需要的所有文件(即使我喜欢php,这也是它的问题之一)。 使用选项“ b”,您可以加载库(可重用代码)并在所有客户端请求中共享它们。
但是要注意,如果您有多个内核,则应调整node.js以使用所有内核。