省略 nginx 配置中的重复

省略 nginx 配置中的重复

我有一个非常简单的nginx,所以我的本地服务可以很好地从外部访问。

这是配置

user httpdusr everyone;
#####################
worker_processes  1;

events {
  worker_connections  1024;
}

http {
  server {
    listen 80;
    include /opt/etc/nginx/mime.types;

    location / {
      try_files $uri$args $uri$args/ index.html;
      root /share/CE_CACHEDEV1_DATA/Web/fitness/;
    }

    auth_basic "Restricted";
    auth_basic_user_file /share/Web/.htpasswd
  }

  server {
    listen 80;
    server_name service1.domain.com;

    location / {
      proxy_pass http://localhost:9091;
    }
  }

  server {
    listen 80;
    server_name service2.domain.com;

    location / {
      proxy_pass http://localhost:8080;
    }
  }

  server {
    listen 80;
    server_name service3.domain.com;

    location / {
      proxy_pass http://192.168.1.1;
    }
    proxy_set_header Host $host;
  }

  server {
    listen 80;
    server_name service4.domain.com;

    location / {
      proxy_pass http://localhost:32400;
    }
  }

  server {
    listen 80;
    server_name service5.domain.com;

    location / {
      proxy_pass http://localhost:5601;
    }

    auth_basic "Restricted";
    auth_basic_user_file /share/Web/.htpasswd;
  }

}

我不是 NGINX 专家,这是我在几个教程中总结出来的。但是,正如你所见,服务的数量在增长,重复性也越来越大。作为一名开发人员……这让我内心很痛苦 :-)

我知道这是可能的,但我不知道如何获得像这样的共同部分:

common() {
  listen 80;
  server_name <param1>;

  location / {
    proxy_pass <param2>;
  }
}

然后像使用它一样

common(service1.domain.com, http://localhost:9091)

谢谢!

答案1

您可以使用 Nginx包括函数,但不能使用参数。除了一些自己开发的模板系统之外,我不知道还有什么方法可以实现你想要的。我不会费心。

长手写的 Nginx 配置文件很好,而且易于维护。一旦达到数千行,管理起来就会更加困难,但对于您的规模来说,这通常不是问题。

对于组织而言,最好每个域都有一个文件,其中包含与 http / https、子域等所需的服务器块数量相同的服务器块。主 Nginx 文件包含它们。您可以在配置文件之间包含完全相同的代码,如下所示。

/etc/nginx/nginx.conf

include /etc/nginx/enabled-sites/*;

/etc/nginx/enabled-sites/site1.conf

server {
  location / {
    // etc        
  }

  include /etc/nginx/fragments/security-headers;
}

/etc/nginx/fragments/安全标头

# Security headers
add_header Strict-Transport-Security "max-age=2592000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header Content-Security-Policy "default-src 'self' www.google-analytics.com ajax.googleapis.com www.google.com google.com gstatic.com www.gstatic.com connect.facebook.net facebook.com;";
add_header X-XSS-Protection "1; mode=block";
add_header Referrer-Policy "origin";

答案2

这里有多种选项可以解决您的问题。

一种方法是使用http://nginx.org/r/map指示:

map $host $pphost {
    hostnames;

    default http://127.0.0.1:29159;

    service1.example.org http://127.0.0.1:9091;
    service2.example.org http://127.0.0.1:8080;        
}
server {
    listen 80;
    server_name service1.example.org service2.example.org …;

    location / {
        proxy_pass $pphost;
    }
}
server {
    listen 29159;
    return 200 $http_host\n$request_uri\n200\tOK;
    # this is simply used as the defailt fallback,                                                                                                                                                                            
    # to avoid having proxy_pass within an extra if
}

另一种方法是使用http://nginx.org/r/include指令,连同处理服务器配置各种变化的脚本,用您喜欢的语言编写。

请注意,虽然你不能使用http://nginx.org/r/set在任何上下文中 — 它需要serverlocationif— 您可以include在任意上下文中使用。至于map,它实际上只能在上下文中全局定义http(例如,与 where goes 处于同一级别server),因此,这是配置您的首选项的完美方式。

相关内容