NGinx最佳做法


46

您在使用NGinx时会使用哪些最佳做法?


请注意,这不适用于Magento设置。仍在调查原因,但我认为这与查询字符串有关。
霍德(Jauder Ho)

当您在名为“ wordpress”的子目录中使用wordpress时,location / wordpress必须有用。当我们在Web根目录“ /”中使用wordpress怎么办?
rahul286

Answers:


21

如何组合HTTP和HTTPS块。

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

这是对另一个问题的回答。看这里



15

通常,使用“ if”是一种不好的做法(根据nginx的作者)。如果可能,最好使用error_page指令的try_file代替“ if(-f ...)”

将tip和maintenence.html文件结合在一起,并将tip和try_files结合在一起,我们得到:

位置 / {
    try_files /maintenance.html $ uri $ uri / @wordpress;
}

维护结束时,只需从$ root中输入mv maintenance.html即可。


16
这不理想,因为/maintenance.html将用作200响应。您可能希望搜索引擎认识到维护页面不是您的实际网站。您可能希望返回503(服务暂时不可用)。我能弄清楚如何做到这一点的唯一方法是使用if (-f ...) { return 503; }and error_page 503 /maintenance.html。你怎么看?
亚伦·吉布拉特


8

map在切换根目录以匹配子域时,使用指令代替正则表达式通常更有效:

server {

    server_name mysite.tld ~^.+\.mysite\.tld$;

    map $host $files {
        default            common;
        mysite.tld         common;
        www.mysite.tld     common;
        admin.mysite.tld   admin;
        system.mysite.tld  system;
        *.mysite.tld       users;
    }

    root /var/www/mysite/$files;

}

5
您确实知道可以执行server_name mysite.tld * .mysite.tld
未知2009年

8

empty_gif模块也非常有用,特别是如果您需要Web服务器的监视器响应(使用nagios / monit / etc):

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 

1
您可以为此提供一个真实的例子吗?我仍然不完全了解它的用处。
Pixel开发人员

1
@ Pixel Developer,它对速度只有真正的帮助。Nginx将gif的数据保留在内存中,因此它不必从磁盘加载。
未知

5
access_log off;为这些场所通常的做法是
SaveTheRbtz

6

我们使用本食谱来使用Chef设置Nginx,该食谱包含用于处理nginx配置的脚本(类似于Debian进行Apache2的方式),以及一些具有默认默认设置的示例模板。


5

这是返回维护页面的好方法。所有请求都将被重写,并返回正确的http代码。(503服务不可用)

error_page 503 /maintenance.html;

location /
{
    if (-f $document_root/maintenance.html)
    {
        return 503;
    }

    try_files $uri /index.php?$args;
}

location = /maintenance.html
{
    rewrite ^ /maintenance.html break;
}

1
实际上,我不同意-我在serverfault.com/questions/18994/nginx-best-practices/…中添加了评论。基本上,您想返回503错误,否则漫游器和索引器会认为您的维护页面是您实际站点的一部分... if如果正确使用该声明,则没有任何错误-如果您说ifs ,文档就是安全的只是在做return xxx;
亚伦·吉布拉特

另外,有location = /maintenance.html { break; }必要吗?
亚伦·吉布拉特

4

从nginx 0.7.12及更高版本开始,server_name中可以使用“”来捕获没有“ Host”头的请求。

您可以将以下内容用作未定义虚拟主机的包罗万象。

server {
  server_name _ "";
}

您的示例仅适用于具有未定义虚拟主机的请求,还是适用于具有未知(错误)虚拟主机的请求?
Benoit

@Benoit它适用于任何未定义的内容。
未知

从Nginx 0.7开始不支持“ server_name _ *”吗?
rahul286

1
请注意,这仅部分正确。“”将捕获MISSING主机头,但是不会捕获与任何不匹配的主机头的请求。如果要使用所有服务器块,请参阅listen指令下的default_server标志。
Martin Fjordvald 2011年


3

我不知道这是否是最佳实践,但绝对可以通过巧妙的方法在nginx中获得嵌套条件。这是Nginx Wiki的示例

location /xxxx/ {
  set $test "";

  if ($request_method = POST) {
    set $test  P;
  }

  if ($http_cookie ~* "CCCC=.+(?:;|$)" ) {
    set $test  "${test}C";
  }

  if ($test = PC) {
    #rewrite rule goes here.
  } 
}

3
我将其归为“丑陋但偶尔必要的做法”类别-当然不值得鼓励。
womble

2

如果您需要在http和https之间上下文切换同一服务器块所处理的子域,则可以使用变量来实现。可能不是最有效的处理方式,但是它可以起作用:

server {
  server mysite.tld ~^.+\.mysite\.tld$;

  set $req_ssl = 0;

  map $host $files {
      default            common;
      mysite.tld         common;
      www.mysite.tld     common;
      admin.mysite.tld   admin;
      system.mysite.tld  system;
      *.mysite.tld       users;
  }

  root /var/www/mysite/$files;

  if ( $files = "admin" ){
    set $req_ssl 1;
  }

  if ( $files = "common" ){
    set $req_ssl 2;
  }

  if ( $scheme = http )
  {
    set $req_ssl $req_ssl.1;
  }

  if ( $scheme = https )
  {
    set $req_ssl $req_ssl.2;
  }

  if ($req_ssl = 1.1){
    rewrite ^ https://$host$uri;
  }

  if ($req_ssl = 2.2){
    rewrite ^ http://$host$uri;
  }

}

2

我总是尝试root在服务器块的顶部使用指令,这样我就可以利用$document_root变量,并且永远不会(但永远不会)root在位置块内包含指令。

Nginx Wiki上的陷阱页面提供了一些有关最佳做法的重要技巧。


1

如果将nginx用作代理,则调整超时设置对于确保在完成应用程序之前没有nginx断开连接非常重要,尤其是在处理高流量应用程序时:

proxy_connect_timeout
proxy_send_timeout

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.