Node.js + Nginx-지금 무엇?


1003

내 서버에 Node.js와 Nginx를 설정했습니다. 이제 사용하고 싶지만 시작하기 전에 두 가지 질문이 있습니다.

  1. 그들은 어떻게 협력해야합니까? 요청을 어떻게 처리해야합니까?
  2. Node.js 서버에는 두 가지 개념이 있습니다.

    ㅏ. 필요한 각 웹 사이트마다 별도의 HTTP 서버를 작성하십시오. 그런 다음 프로그램 시작시 모든 JavaScript 코드를로드하므로 코드가 한 번 해석됩니다.

    비. 모든 Node.js 요청을 처리하는 하나의 단일 Node.js 서버를 작성하십시오. 요청 된 파일을 읽고 내용을 바꿉니다. 따라서 파일은 각 요청마다 해석되지만 서버 논리는 훨씬 간단합니다.

Node.js를 올바르게 사용하는 방법은 명확하지 않습니다.

답변:


1306

Nginx는 프런트 엔드 서버로 작동하며이 경우 요청을 node.js 서버로 프록시합니다. 따라서 노드에 대해 nginx 구성 파일을 설정해야합니다.

이것이 우분투 상자에서 수행 한 것입니다.

에 파일 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)가 웹 소켓 요청도 처리하도록하려면 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-front-of-node가 여러 가상 호스트를 제공하는 데 가장 좋은 이유에 대한 정답입니다 (아커의 두 번째 질문).
Paul d' Aoust

34
로드 밸런싱을 위해 서버에 서버를 더 추가하려는 경우 @Robin Winslow.
Joao Da Silva

76
이 (매우 도움이) 대답은 기본적으로 함께 제공, nginx를 하나 개의 맛을 말한다 주목해야한다 sites-enabledsites-available내부 디렉토리 /etc/nginx. 버전에이 두 디렉토리가없는 경우 단일 conf.d디렉토리 가있을 수 있습니다 . 이 경우, 이러한 지시 사항을 수행해도 기본값 이 아닌 include파일 내부의 명령문 을 수정하지 않으면 효과가 없습니다 . 이해가 되길 바랍니다. 일단 당신이 내부에 언급 된 진술을 본다면 그것은 자기 설명이되어야한다 . nginx.confsites-enabledconf.dincludenginx.conf
meetamit

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. 왜 그런 겁니까?
Kristian

Cloudflare 또는 이와 유사한 제품이 있습니까? 위의 구성은 전혀 리디렉션되지 않아야합니다.
ozzieisaacs 2016 년

1
@Kristian proxy_set_header Host $hostHTTP 302 리디렉션을 피 하려면 추가해야합니다 .
Ivan Shatsky

@IvanShatsky-여러 개의 하위 도메인으로 여러 포트를 구성하고 다른 도메인에서 다른 포트가 실행되지 않도록하는 방법에 대한 도움을 줄 수 있습니까? nginx v 1.14.1
151291

59

하나의 서버 구성에서 앱에 대해 다른 URL을 가질 수도 있습니다.

에서 의 / etc / nginx를 / 사이트 사용 / 사용자 도메인 :

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

내 무지에 대해 죄송합니다. 이런 식으로 봉사하는 목적, 이점은 무엇입니까? 사용 사례 나 사례가 있습니까? 미리 감사드립니다.
Mauro Aguilar

2
@MauroAguilar 하나의 서버에 2 개의 node.js 앱이 필요한 경우 제안 된 방법으로 (다른 포트 사용) 서비스를 제공 할 수 있습니다. 제 경우에는 두 가지 테스트 앱이었습니다.
0x8BADF00D

좋아, 그러나 두 개의 앱을 실행하는 것과 하나의 앱을 실행하는 것의 차이점은 무엇입니까? 같은 목적으로 사용하면 어떤 이점이 있습니까?
Mauro Aguilar

2
@MauroAguilar, 당신은 하나의 프로젝트로 실행할 수 있으며 하나의 프로젝트의 일부가 될 수 있고 동일한 목적을 가지고 있다면 아무런 이점이 없습니다. 그러나 하나의 서버에서 다른 목적과 다른 구성으로 2 개의 다른 프로젝트를 실행해야하는 경우이 구성을 사용하면 이점이 있습니다.
0x8BADF00D

35

Nginx를 통해 독립 Node Express 응용 프로그램을 프록시합니다.

따라서 새로운 응용 프로그램을 쉽게 마운트 할 수 있으며 다른 위치의 동일한 서버에서 다른 작업을 실행할 수도 있습니다.

Nginx 구성 예제를 사용한 설정에 대한 자세한 내용은 다음과 같습니다.

Nginx를 사용하여 하위 폴더에있는 하나의 웹 서버에 여러 노드 애플리케이션 배포

응용 프로그램을 로컬 호스트에서 인터넷으로 이동해야 할 때 노드가 까다로워집니다.

노드 배포에는 일반적인 방법이 없습니다.

Google은이 주제에 관한 많은 기사를 찾을 수 있지만 필요한 설정에 적합한 솔루션을 찾기 위해 고심하고있었습니다.

기본적으로 웹 서버 가 있으며 응용 프로그램 코드에 구성 종속성을 도입하지 않고 노드 응용 프로그램을 하위 폴더 (예 : http : // myhost / demo / pet-project / )에 마운트하려고 합니다.

동시에 블로그와 같은 다른 것들이 동일한 웹 서버에서 실행되기를 원합니다.

간단한 소리 같습니까? 분명히 아닙니다.

웹 노드 애플리케이션의 많은 예제에서 포트 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에 마운트하는 것을 알 수 있습니다 .

First Nginx는 요청 된 리소스가 / opt / demo / pet-project / public / 에서 사용할 수있는 정적 파일인지 확인 하고, 그렇다면 효율적으로 제공되므로 Connect와 같은 중복 레이어가 필요하지 않습니다. 정적 미들웨어.

그런 다음 다른 모든 요청을 덮어 쓰고 Pet Project Node 응용 프로그램으로 프록시 처리 하므로 Node 응용 프로그램은 실제로 마운트 된 위치를 알 필요가 없으므로 구성을 통해 순수하게 어디든지 이동할 수 있습니다.

proxy_redirect 는 Location 헤더를 올바르게 처리해야합니다. Node 응용 프로그램에서 res.redirect () 를 사용하는 경우 매우 중요합니다 .

다른 포트에서 실행중인 여러 노드 응용 프로그램에 대해이 설정을 쉽게 복제하고 다른 용도로 더 많은 위치 처리기를 추가 할 수 있습니다.

보낸 사람 : 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훨씬 적은 리소스를 소비하기 때문에 단순히 옵션을 사용 합니다. 옵션 'a'를 사용하면 모든 클라이언트가 서버에서 많은 메모리를 소비하여 필요한 모든 파일을로드합니다 (php를 좋아 하더라도이 문제 중 하나입니다). 옵션 'b'를 사용하면 라이브러리 (재사용 가능한 코드)를로드하고 모든 클라이언트 요청간에 공유 할 수 있습니다.

그러나 코어가 여러 개인 경우 모든 코어를 사용하도록 node.js를 조정해야합니다.


2
리소스가 가장 중요한 문제인 경우에는이 조언을 따르십시오. (a)와 (b)는 서로 다른 절충안이 있습니다. 사이트 다시 시작 또는 유지 관리, DB 연결, 코드 기반, 라이브러리 종속성, 서버 간 사이트 이동 등과 같이 사이트를보다 독립적으로 유지하려면 옵션 (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반환 합니다. 정적 파일을 제공하도록 nginx를 구성하면 요청 자체를 처리합니다.myjs.js/my/static/files/path

요청을 다른 서버로 전달

요청 URL이 mydomain.com/dothisnginx이면 요청을 http://127.0.0.1:8000으로 전달합니다 . localhost 8000 포트에서 실행중인 서비스는 요청을 수신하고 응답을 nginx에 리턴하고 nginx는 응답을 클라이언트에 리턴합니다.

포트 8000에서 node.js 서버를 실행하면 nginx는 요청을 node.js로 전달합니다. node.js 논리를 작성하고 요청을 처리하십시오. 그것이 바로 nginx 서버 뒤에서 nodejs 서버를 실행하는 것입니다.

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-PassThrough)

모든 웹 응용 프로그램이 안전한 환경을 사용하거나 사용해야하기 때문에 SSL이 아닌 예제를 제공 할 필요는 없습니다.

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

이제 백엔드 웹 서버를 다루겠습니다. /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;
}

이제 /etc/nginx/sites-available/example.com-https.conf에서이 SSL 및 proxy_protocol 사용 구성을 사용하여 가상 호스트를 구성 해 보겠습니다 .

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 웹 서버 샘플 : 첫 번째 서버 :

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를 사용하고 있는지 확인하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.