NGINX反向代理配置结构

时间:2021-01-24 15:25:28

标签: docker nginx ssl nginx-reverse-proxy nginx-config

NGINX 反向代理的指令是否有“适当”的结构?在查找 NGINX 反向代理示例时,我发现了两个主要区别。

  1. http 指令用于容纳所有 server 指令。带有数据的服务器列在 upstream 指令内的池中。
  2. server 指令在 main 指令中直接列出。

这是否有任何原因,或者这只是语法上的糖差异?

./nginx.conf 文件中 #1 的示例:

upstream docker-registry {
  server registry:5000;
}

http {
  server {
    listen 80;
    listen [::]:80;

    return 301 https://$host#request_uri;
  }

  server {
    listen 443 default_server;
    ssl on;
    ssl_certificate external/cert.pem;
    ssl_certificate_key external/key.pem;
    
    # set HSTS-Header because we only allow https traffic
    add_header Strict-Transport-Security "max-age=31536000;";

    proxy_set_header Host       $http_host;   # required for Docker client sake
    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
      auth_basic "Restricted"
      auth_basic_user_file    external/docker-registry.htpasswd;
      
      proxy_pass http://docker-registry; # the docker container is the domain name
    }
    
    location /v1/_ping {
      auth_basic off;
      proxy_pass http://docker-registry; 
    }
  }
}

./nginx.conf 文件中 #2 的示例:

server {
  listen 80;
  listen [::]:80;
  
  return 301 https://$host#request_uri;
}

server {
  listen 443 ssl;
  listen [::]:443 ssl;
  
  error_log  /var/log/nginx/error.log  info;
  access_log /var/log/nginx/access.log main;

  ssl_certificate     /etc/ssl/private/{SSL_CERT_FILENAME};
  ssl_certificate_key /etc/ssl/private/{SSL_CERT_KEY_FILENAME};

  location / {
    proxy_pass http://app1
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr; # could also be `$proxy_add_x_forwarded_for`
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }
}

1 个答案:

答案 0 :(得分:1)

我不太明白您的问题,但在我看来,第二个示例缺少 http {},我不认为 nginx 会在没有它的情况下启动。 除非您的 example2 文件以某种方式包含在具有 http{}

的 nginx.conf 中