NGinx最佳实践

你在使用NGinx时使用了哪些最佳实践?

    如何结合HTTP和HTTPS块。

    server { listen 80; listen 443 default ssl; # other directives } 

    这被张贴为一个不同的问题的答案。 看到这里 。

    到目前为止, 我见过的最好的提示是从作者的陷阱页面: https : //www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/

    一般来说,使用“if”是不好的做法(根据nginx的作者)。 如果可能的话,最好使用error_page指令的try_file来代替“if(-f …)”

    结合提示与maintenence.html文件,并提示与try_files我们得到:

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

    维护结束后,只需从$ root维护mv maintenance.html。

    configurationnginx以使用更强大的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

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

     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; } 

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

     location /token { empty_gif; } location /favicon.ico { empty_gif; } location /img/1px.gif { empty_gif; } 

    我们与Chef一起设置了Nginx,使用这个包含处理nginxconfiguration脚本的食谱 ,类似于Debian的Apache2,还有一些样例模板,它们都是默认的。

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

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

    您可以将以下内容用作未定义的虚拟主机的全部内容。

     server { server_name _ ""; } 

    我之前也发布了关于如何正确处理nginx的gzip压缩的问题,因为旧的浏览器可能只有一个gzip语句。 HTH。

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

    我不知道这是否是一种最佳做法,但肯定是一个巧妙的手段,以获得嵌套在nginx中的条件。 这里有一个来自nginx维基的例子 。

     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. } } 

    如果您需要在http和https之间为由同一个服务器块处理的子域进行上下文切换,则可以使用variables来执行此操作。 可能不是最有效的方式做事,但它的工作原理:

     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; } } 

    我总是尝试使用服务器块顶部的root指令,这样我就可以利用$document_rootvariables,永远不会在root块中包含root指令。

    Nginx wiki的陷阱页面提供了一些关于最佳实践的很棒的提示。

    如果您使用nginx作为代理,调整超时设置可能很重要,以确保在应用程序完成之前您不需要连接nginx,特别是在处理高stream量的应用程序时:

     proxy_connect_timeout proxy_send_timeout