Answers:
到目前为止,我见过的最好的技巧来自作者的陷阱页面:https : //www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
通常,使用“ 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即可。
if (-f ...) { return 503; }
and error_page 503 /maintenance.html
。你怎么看?
配置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
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;
}
该empty_gif
模块也非常有用,特别是如果您需要Web服务器的监视器响应(使用nagios / monit / etc):
location /token {
empty_gif;
}
location /favicon.ico {
empty_gif;
}
location /img/1px.gif {
empty_gif;
}
access_log off;
为这些场所通常的做法是
这是返回维护页面的好方法。所有请求都将被重写,并返回正确的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;
}
if
如果正确使用该声明,则没有任何错误-如果您说if
s ,文档就是安全的只是在做return xxx;
。
location = /maintenance.html { break; }
必要吗?
从nginx 0.7.12及更高版本开始,server_name中可以使用“”来捕获没有“ Host”头的请求。
您可以将以下内容用作未定义虚拟主机的包罗万象。
server {
server_name _ "";
}
不久前,我还发布了有关如何使用Nginx正确处理gzip压缩的信息,因为较旧的浏览器可能只包含一个通用的gzip语句就存在问题。HTH。
http://tumblelog.jauderho.com/post/27655495/gzip-compression-with-nginx
我不知道这是否是最佳实践,但绝对可以通过巧妙的方法在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.
}
}
如果您需要在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;
}
}
如果将nginx用作代理,则调整超时设置对于确保在完成应用程序之前没有nginx断开连接非常重要,尤其是在处理高流量应用程序时:
proxy_connect_timeout
proxy_send_timeout