Van*_*ing 964 nginx concept node.js
我在我的服务器上设置了Node.js和Nginx.现在我想使用它,但是,在我开始之前有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的节点上有一个很棒的教程.
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)
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)
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配置,这是一个提取:
Run Code Online (Sandbox Code Playgroud)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
小智 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)
回答你的问题2:
我会使用选项b
只是因为它消耗的资源少得多.使用选项'a',每个客户端将导致服务器消耗大量内存,加载您需要的所有文件(即使我喜欢php,这是它的问题之一).使用选项'b',您可以加载库(可重用代码)并在所有客户端请求中共享它们.
但是要知道,如果你有多个核心,你应该调整node.js来使用它们.
我在Github中创建了一个存储库,您可以克隆,vagrant-node-nginx-boilerplate
基本的Node.js应用的/var/www/nodeapp
IS
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)
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/dothis
Nginx 时,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中配置它。
您还可以使用node.js将静态文件生成到nginx提供的目录中.当然,站点的某些动态部分可以由节点提供,有些则由nginx(静态)提供.
其中一些由nginx提供服务可以提高您的性能.
我们可以通过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应用程序创建中间件