it-swarm.cn

NGinx最佳做法

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

46
The Pixel Developer

到目前为止我见过的最佳技巧来自作者的陷阱页面: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls /

21
Roger

如何组合HTTP和HTTPS块。

server {
    listen 80;
    listen 443 default ssl;

    # other directives
}

这是对另一个问题的回答。 请参阅此处

21
Jauder Ho

通常,使用“ 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即可。

15
Slava K

配置nginx以使用更强的SSL密码。默认情况下,启用SSLv2(如果可能,应将其禁用)。

ssl_ciphers DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA:RC4-MD5;

http://tumblelog.jauderho.com/post/121851623/nginx-and-stronger-ssl

11
Jauder Ho

在切换根目录以匹配子域时,使用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;

}
8
Phillip B Oldham

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

location /token {
    empty_gif;
}

location /favicon.ico {
    empty_gif;
}

location /img/1px.gif {
    empty_gif;
} 
8
Phillip B Oldham

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

6
jtimberman

这是返回维护页面的好方法。所有请求都将被重写,并返回正确的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;
}
5
The Pixel Developer

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

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

server {
  server_name _ "";
}
4
Unknown

不久前,我还发布了有关如何使用Nginx正确处理gzip压缩的信息,因为较旧的浏览器可能只包含一个通用的gzip语句就存在问题。 HTH。

http://tumblelog.jauderho.com/post/27655495/gzip-compression-with-nginx

3
Jauder Ho

我不知道这是否是最佳实践,但绝对可以通过巧妙的方法在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
sajal

如果您需要在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
Phillip B Oldham

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

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

2

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

proxy_connect_timeout
proxy_send_timeout
1
wjimenez5271
0
KPWINC