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


1002

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

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

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

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

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

Answers:


1306

Nginx用作前端服务器,在这种情况下,它将代理请求发送到node.js服务器。因此,您需要为节点设置一个Nginx配置文件。

这是我在Ubuntu框中完成的操作:

yourdomain.com/etc/nginx/sites-available/以下位置创建文件:

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的很棒的节点教程


11
感谢您的发布,nginx将为上面的服务器缓存node.js响应,或者每次重新运行它们。
石灰

79
有什么原因使您无法做到location / { proxy_pass http://127.0.0.1:3000; }?为什么需要整个upstream配置位?
罗宾·温斯洛

20
+1,对一个常见问题的回答非常简单明了;非常适合想要使用node和nginx设置虚拟主机的人。我认为您唯一想念的是关于为什么nginx-in-node-of-node最适合服务多个虚拟主机的定性答案(问第二个问题)。
Paul d'Aoust'3

34
@Robin Winslow,如果您想为服务器添加更多服务器以实现负载平衡。
Joao Da Silva

76
应该注意的是,这个(非常有用的)答案是指一种nginx的风格,默认情况下,它带有sites-enabledsites-available目录/etc/nginx。如果您的版本没有这两个目录,则可能只有一个conf.d目录。在这种情况下,遵循这些说明将无效,除非您修改include文件中的语句nginx.conf以指向sites-enabled而不是default conf.d。希望有道理。一旦您看到include里面的陈述,它就会变得不言自明nginx.conf
metamit 2012年

167

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

5
我正在使用您的proxy_pass方法,但由于某种原因http://example.com会自动302转到http://www.example.com。这是为什么?
克里斯蒂安2015年

您有Cloudflare或类似产品吗?上面的配置完全不应重定向。
ozzieisaacs

1
@Kristian您需要添加proxy_set_header Host $host以避免HTTP 302重定向。
伊万·沙茨基

@IvanShatsky-您可以提供任何帮助如何配置具有多个子域的多个端口并阻止其他端口在另一个域中运行吗?nginx v 1.14.1
151291 '19

59

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

3
开源社区版本是免费的,但它们具有不免费的其他功能的版本。nginx.com/products/feature-matrix
0x8BADF00D

对不起,对不起。这样服务的目的和好处是什么?您有任何示例或使用案例吗?提前致谢。
毛罗·阿吉拉尔

2
@MauroAguilar如果您在一台服务器上需要2个node.js应用程序,则可以使用建议的方式(使用不同的端口)为它们提供服务。就我而言,这是两个不同的测试应用程序。
0x8BADF00D

好的,但是运行2个应用程序和一个应用程序有什么区别?我的意思是,如果将这些用于相同目的,有什么好处?
毛罗·阿吉拉尔

2
@MauroAguilar,您可以单个运行它们,并且如果它可以属于一个项目并且具有相同的目的,则没有任何好处。但是,如果您需要在一台服务器上运行具有不同用途和不同配置的2个不同项目,则使用此配置会有所帮助。
0x8BADF00D

35

我通过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


1
:为什么和如何你应该这样做的,而不是子域skovalyov.blogspot.dk/2012/10/...
skovalyov

仅链接答案…如果您的博客消失了,您能否总结一下答案中的相关部分?
kaiser

11

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

9

回答您的问题2:

b之所以使用option 仅仅是因为它消耗更少的资源。使用选项“ a”,每个客户端将导致服务器占用大量内存,并加载您需要的所有文件(即使我喜欢php,这也是它的问题之一)。使用选项“ b”,您可以加载您的库(可重用代码)并在所有客户端请求中共享它们。

但是要注意,如果您有多个内核,则应调整node.js以使用所有内核。


2
如果资源是您最重要的问题(不太可能),请遵循此建议。(a)和(b)之间有不同的折衷。如果您希望站点更加独立,例如,站点重新启动或维护,数据库连接,代码库,库依赖关系,服务器之间的移动站点等,则选项(a)可能更好
。– robocat

8

我在Github中建立了一个存储库,您可以克隆它,vagrant-node-nginx-boilerplate

基本上,node.js应用程序/var/www/nodeapp

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/');

而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;
        }
}

5

您还可以使用node.js将静态文件生成到nginx服务的目录中。当然,站点的某些动态部分可以由节点提供服务,而某些部分可以由nginx(静态)提供服务。

nginx提供其中一些服务可以提高您的性能。


5

我们可以通过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应用程序创建中间件


1
使用pm2的另一个原因是,退出外壳程序后,您可以永久运行应用程序;如果需要重启服务器,则可以自动启动它,请参阅:pm2.keymetrics.io/docs/usage/startup
SeanQuinn781

3

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它将返回myjs.js文件/my/static/files/path夹中的 文件。当您将nginx配置为提供静态文件时,它会自行处理请求。

将请求转发到另一台服务器

当请求url为 mydomain.com/dothisnginx时,会将请求转发到 http://127.0.0.1:8000。在本地主机8000端口上运行的服务将接收请求,并将响应返回给nginx,而nginx将响应返回给客户端。

当您在端口8000上运行node.js服务器时,nginx会将请求转发到node.js。编写node.js逻辑并处理请求。就是这样,您的nodejs服务器在nginx服务器后面运行。

如果您想运行除nodejs以外的任何其他服务,只需在不同的端口上运行另一个服务(如Django,flask,php),然后在nginx中对其进行配置。


1

如果要管理每个微服务手段并运行它,则可以使用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.

最好,正如您所说的那样


1

使用Nginx和Nodejs的最好,最简单的设置是使用Nginx作为启用了proxy_protocol的HTTP和TCP负载均衡器。在这种情况下,Nginx将能够将传入的请求代理到nodejs,还可以终止与后端Nginx服务器(而不是代理服务器本身)的SSL连接。(SSL直通)

我认为,提供非SSL示例毫无意义,因为所有Web应用程序都(或应该)使用安全环境。

代理服务器的示例配置,位于/etc/nginx/nginx.conf中

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
  upstream webserver-http {
    server 192.168.1.4; #use a host port instead if using docker
    server 192.168.1.5; #use a host port instead if using docker
  }
  upstream nodejs-http {
    server 192.168.1.4:8080; #nodejs listening port
    server 192.168.1.5:8080; #nodejs listening port
  }
  server {
    server_name example.com;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header Connection "";
      add_header       X-Upstream $upstream_addr;
      proxy_redirect     off;
      proxy_connect_timeout  300;
      proxy_http_version 1.1;
      proxy_buffers 16 16k;
      proxy_buffer_size 16k;
      proxy_cache_background_update on;
      proxy_pass http://webserver-http$request_uri;
    }
  }
  server {
    server_name node.example.com;
    location / {
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header Host $http_host;
      proxy_set_header X-Forwarded-Host $server_name;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      add_header       X-Upstream $upstream_addr;
      proxy_redirect     off;
      proxy_connect_timeout  300;
      proxy_http_version 1.1;
      proxy_buffers 16 16k;
      proxy_buffer_size 16k;
      proxy_cache_background_update on;
      proxy_pass http://nodejs-http$request_uri;
    }
  }
}
stream {
  upstream webserver-https {
    server 192.168.1.4:443; #use a host port instead if using docker
    server 192.168.1.5:443; #use a host port instead if using docker
  }

  server {
    proxy_protocol on;
    tcp_nodelay on;
    listen 443;
    proxy_pass webserver-https;
  }
  log_format proxy 'Protocol: $protocol - $status $bytes_sent $bytes_received $session_time';
  access_log  /var/log/nginx/access.log proxy;
  error_log /var/log/nginx/error.log debug;
}

现在,让我们处理后端Web服务器。 /etc/nginx/nginx.conf

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
load_module /etc/nginx/modules/ngx_http_geoip2_module.so; # GeoIP2
events {
    worker_connections  1024;
}
http {
    variables_hash_bucket_size 64;
    variables_hash_max_size 2048;
    server_tokens off;
    sendfile    on;
    tcp_nopush  on;
    tcp_nodelay on;
    autoindex off;
    keepalive_timeout  30;
    types_hash_bucket_size 256;
    client_max_body_size 100m;
    server_names_hash_bucket_size 256;
    include         mime.types;
    default_type    application/octet-stream;
    index  index.php index.html index.htm;
    # GeoIP2
    log_format  main    'Proxy Protocol Address: [$proxy_protocol_addr] '
                        '"$request" $remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    # GeoIP2
    log_format  main_geo    'Original Client Address: [$realip_remote_addr]- Proxy Protocol Address: [$proxy_protocol_addr] '
                            'Proxy Protocol Server Address:$proxy_protocol_server_addr - '
                            '"$request" $remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '$geoip2_data_country_iso $geoip2_data_country_name';

    access_log  /var/log/nginx/access.log  main_geo; # GeoIP2
#===================== GEOIP2 =====================#
    geoip2 /usr/share/geoip/GeoLite2-Country.mmdb {
        $geoip2_metadata_country_build  metadata build_epoch;
        $geoip2_data_country_geonameid  country geoname_id;
        $geoip2_data_country_iso        country iso_code;
        $geoip2_data_country_name       country names en;
        $geoip2_data_country_is_eu      country is_in_european_union;
    }
    #geoip2 /usr/share/geoip/GeoLite2-City.mmdb {
    #   $geoip2_data_city_name city names en;
    #   $geoip2_data_city_geonameid city geoname_id;
    #   $geoip2_data_continent_code continent code;
    #   $geoip2_data_continent_geonameid continent geoname_id;
    #   $geoip2_data_continent_name continent names en;
    #   $geoip2_data_location_accuracyradius location accuracy_radius;
    #   $geoip2_data_location_latitude location latitude;
    #   $geoip2_data_location_longitude location longitude;
    #   $geoip2_data_location_metrocode location metro_code;
    #   $geoip2_data_location_timezone location time_zone;
    #   $geoip2_data_postal_code postal code;
    #   $geoip2_data_rcountry_geonameid registered_country geoname_id;
    #   $geoip2_data_rcountry_iso registered_country iso_code;
    #   $geoip2_data_rcountry_name registered_country names en;
    #   $geoip2_data_rcountry_is_eu registered_country is_in_european_union;
    #   $geoip2_data_region_geonameid subdivisions 0 geoname_id;
    #   $geoip2_data_region_iso subdivisions 0 iso_code;
    #   $geoip2_data_region_name subdivisions 0 names en;
   #}

#=================Basic Compression=================#
    gzip on;
    gzip_disable "msie6";
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/css text/xml text/plain application/javascript image/jpeg image/png image/gif image/x-icon image/svg+xml image/webp application/font-woff application/json application/vnd.ms-fontobject application/vnd.ms-powerpoint;
    gzip_static on;

    include /etc/nginx/sites-enabled/example.com-https.conf;
}

现在,让我们配置的虚拟主机与此SSL并启用proxy_protocol在配置/etc/nginx/sites-available/example.com-https.conf

server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name 192.168.1.4; #Your current server ip address. It will redirect to the domain name.
    listen 80;
    listen 443 ssl http2;
    listen [::]:80;
    listen [::]:443 ssl http2;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    return 301 https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name  example.com;
    listen       *:80;
    return 301   https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name www.example.com;
    listen 80;
    listen 443 http2;
    listen [::]:80;
    listen [::]:443 ssl http2 ;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    return 301 https://example.com$request_uri;
}
server {
    real_ip_header proxy_protocol;
    set_real_ip_from 192.168.1.1; #proxy server ip address
    #set_real_ip_from proxy; #proxy container hostname if you are using docker
    server_name example.com;
    listen 443 proxy_protocol ssl http2;
    listen [::]:443 proxy_protocol ssl http2;
    root /var/www/html;
    charset UTF-8;
    add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';
    add_header X-Frame-Options SAMEORIGIN;
    add_header X-Content-Type-Options nosniff;
    add_header X-XSS-Protection "1; mode=block";
    add_header Referrer-Policy no-referrer;
    ssl_prefer_server_ciphers on;
    ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
    ssl_protocols TLSv1.2 TLSv1.1 TLSv1;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;
    keepalive_timeout   70;
    ssl_buffer_size 1400;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=86400;
    resolver_timeout 10;
    ssl_certificate     /etc/nginx/certs/example.com.crt;
    ssl_certificate_key /etc/nginx/certs/example.com.key;
    ssl_trusted_certificate /etc/nginx/certs/example.com.crt;
location ~* \.(jpg|jpe?g|gif|png|ico|cur|gz|svgz|mp4|ogg|ogv|webm|htc|css|js|otf|eot|svg|ttf|woff|woff2)(\?ver=[0-9.]+)?$ {
    expires modified 1M;
    add_header Access-Control-Allow-Origin '*';
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    access_log off;
    }
    location ~ /.well-known { #For issuing LetsEncrypt Certificates
        allow all;
    }
location / {
    index index.php;
    try_files $uri $uri/ /index.php?$args;
    }
error_page  404    /404.php;

location ~ \.php$ {
    try_files       $uri =404;
    fastcgi_index   index.php;
    fastcgi_pass    unix:/tmp/php7-fpm.sock;
    #fastcgi_pass    php-container-hostname:9000; (if using docker)
    fastcgi_pass_request_headers on;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_intercept_errors on;
    fastcgi_ignore_client_abort off;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 180;
    fastcgi_read_timeout 180;
    fastcgi_request_buffering on;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_temp_file_write_size 256k;
    include fastcgi_params;
}
location = /robots.txt {
    access_log off;
    log_not_found off;
    }
location ~ /\. {
    deny  all;
    access_log off;
    log_not_found off;
    }
}

最后是2个nodejs Web服务器的示例:第一台服务器:

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello From Nodejs\n');
}).listen(8080, "192.168.1.4");
console.log('Server running at http://192.168.1.4:8080/');

第二台服务器:

var http = require('http');

http.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end('Hello From Nodejs\n');
}).listen(8080, "192.168.1.5");
console.log('Server running at http://192.168.1.5:8080/');

现在,所有内容都应该可以正常工作并实现负载平衡。

前一段时间,我写了一篇有关如何在Docker中将Nginx设置为TCP负载平衡器的文章。检查一下您是否正在使用Docker。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.