我已经在服务器上设置了 Node.js 和 Nginx。现在,我想使用它,但是在开始之前,有两个问题:
Node.js 服务器有两个概念,其中一个更好:
一种。为每个需要它的网站创建一个单独的 HTTP 服务器。然后在程序开始时加载所有 JavaScript 代码,因此该代码将被解释一次。
b。创建一个处理所有 Node.js 请求的单个 Node.js 服务器。这将读取请求的文件并评估其内容。因此,每个请求都会解释文件,但是服务器逻辑要简单得多。
我还不清楚如何正确使用 Node.js。
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;
}
}
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 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
sudo /etc/init.d/nginx restart
cd /var/www/yourdomain/ && node app.js
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/;
}
}
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/;
}
}
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/;
}
}
sudo service nginx restart
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/');
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 代理独立的 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
$ sudo nano /etc/nginx/sites-available/subdomain.your_domain.com
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;
}
}
回答您的问题 2:
我之所以使用选项b
仅仅是因为它消耗更少的资源。使用选项 “a”,每个客户端都将导致服务器占用大量内存,并加载您需要的所有文件(即使我喜欢 php,这也是它的问题之一)。使用选项 “b”,您可以加载您的库(可重用代码)并在所有客户端请求中共享它们。
但是要注意,如果您有多个内核,则应调整 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/');
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;
}
}
您还可以使用 node.js 将静态文件生成到 nginx 服务的目录中。当然,站点的某些动态部分可以由节点提供服务,而某些部分可以由 nginx(静态)提供服务。
nginx 提供其中一些服务可以提高您的性能。
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
}
}
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 。在 localhost 8000 端口上运行的服务将接收请求,并将响应返回给 nginx,而 nginx 将响应返回给客户端。
当您在端口 8000 上运行 node.js 服务器时,nginx 会将请求转发到 node.js。编写 node.js 逻辑并处理请求。就是这样,您的 nodejs 服务器在 nginx 服务器后面运行。
如果您想运行除 nodejs 之外的任何其他服务,只需在不同的端口上运行另一个服务(例如 Django,flask,php),然后在 nginx 中对其进行配置。