如何写一个DRY,模块化nginx conf(反向代理)与命名的位置

我使用nginx主要是作为一个反向加速代理在几个gunicon / mod_wsgi应用程序,当然还有服务器静态文件。

我发现很快我的nginx confs变得不可能维护; 问题是我有一些类似(甚至相同)的模式,但我无法设法使它变得干净。

我遇到的最大的问题之一就是我喜欢使用命名的位置来分组一组confs,例如。

location @django_modwsgi { include proxy.conf; proxy_pass http://127.0.0.1:8080; } location @django_gunicorn { include proxy.conf; # this could also be included directly in the server {} block? proxy_pass http://gunicorn_builder; } 

NB。 问题是没有 gunicorn和wsgi。 这只是一个例子。 另一个是:

 location @namedlocation_1 { some cache settings; some cache_key settings; ignore some headers; expires; proxy_pass } location @namedlocation_2 { other cache settings; other cache_key settings; ignore some headers; expires; proxy_pass } 

但要调用命名的位置我发现的唯一方法是:

 location /somelocation { try_files $uri @named_location; } 

这已经不对了,我希望nginx去寻找静态文件,我希望它直接进入命名的位置! 有没有办法直接“打电话”命名的位置?

另一种我以为我可以去干的方法是include很多…

 location /somelocation { include django_unicorn.conf; } 

但这是做这件事的好方法吗? 对于非常通用的设置(例如代理服务器),这听起来不错,但是要打开不同的文件来获得完整的configuration文件是不太可读的。

此外,在某些情况下,我可以将几个位置用正则expression式分组,但是我喜欢只在逻辑上相关时才这样做,而不仅仅是将常用设置放在同一个块中。

问题

有没有一个“官方”的最佳做法来写出良好的DRY nginxconfiguration?

我很想find一个模式,如:

 location / { common confs try_files $uri @name_location } 

**但是我怎么写不同地点的具体情况呢? **

我可以简单地添加几个位置与conf的不常见的部分和常见的@named_location吗?

 location /1/ { some cache expire settings; NOTHING ELSE; } location /2/ { some other cache expire settings; NOTHING ELSE; } location / { common settings try_files } location @named_location { other common settings for this named location only proxy_pass } 

当我有不同的url指向相同的资源,我可以简单地做一个重写?

 location /1/ { rewrite ^ /3/ last; } location /2/ { rewrite ^ /4/ last; } location / { common settings try_files } location @named_location { other common settings for this named location only proxy_pass } 

还是应该将这些分组到一个位置?

 location / { rewrite ^/1/$ /3/ last; rewrite ^/2/$ /4/ last; common settings try_files } location @named_location { other common settings for this named location only proxy_pass } 

有关

我在邮件列表中找不到太多东西,在wiki中就更less了。

请注意,这与NGinx最佳实践的问题是/不一样,这是一个非常普遍的问题。

另一个更相关: 如何干这个Nginx的configuration?

我已经使用nginx地图function解决了类似的问题。

首先创build一个域名到后台地图:

 map $http_host $backend { myhost1.tld 192.168.1.100; myhost2.tld 192.168.1.101; default upstream_pool1; } 

然后使用地图中的位置

 location / { common settings proxy_pass $backend; } 

您可以使用任何其他variables而不是$ http_host请参阅本手册: http ://nginx.org/en/docs/http/ngx_http_map_module.html

有没有办法直接“打电话”命名的位置?

至less还有一个方法:

 location /somelocation { error_page 418 = @named_location; return 418; } 

一些指令可以应用于“服务器”和“位置”上下文,使其干燥:

 # The variables below are evaluated on each request, # allowing to DRY configs of locations. proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header X-Real-IP $remote_addr; location /special { proxy_send_timeout 10m; proxy_read_timeout 10m; proxy_pass http://pool; } location / { proxy_pass http://pool; }