协慌网

登录 贡献 社区

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

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

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

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

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

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

答案

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 / section 中添加以下行:

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 的节点上有一个很棒的教程

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

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

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