在什么nginx的决定了进入轨道,什么是直接送达?(What in nginx determines

2019-10-16 23:17发布

我有一个nginx的+薄+的Rails 3.2设置。 目前,我想设置Nginx的,因此它可以直接服务于缓存的网页。

不过nginx的还是通过下面的nginx的配置文件,*。html的请求轨。 在HTML文件中存在的公共文件夹中,并nginx的确实找到他们,只是他们仍然传递到Rails的。

upstream site {
  server unix:/home/site/deploy/site/shared/pids/thin.0.sock;
}

server {
  listen 80;
  server_name www.example.com;
  rewrite ^(/.*) http://example.com$1 permanent;
}

# asset server
server {
  listen 80;
  server_name assets.example.com;
  expires max;
  add_header Cache-Control public;
  charset utf-8;
  root   /home/site/deploy/site/current/public/;
}

# frontend
server {
  listen 80;
  server_name .example.com;
  charset utf-8;

  root   /home/site/deploy/site/current/public/;
  index  index.html;

  location ~* ^.+.(jpg|jpeg|gif|png|swf|zip|rar|doc|xls|exe|pdf|ppt|txt|tar)$ {
    root /home/site/deploy/site/current/public/;
    expires max;
    break;
  }

  # serve static files
  if (-f $request_filename) {
    break;
  }

  gzip on;

  location / {
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    if (-f $request_filename) {
      break;
    }

    if (-f $document_root/cache/$host/$uri/index.html) {
      rewrite (.*) /cache/$host/$1/index.html break;
    }

    if (-f $document_root/cache/$host/$uri.html) {
      rewrite (.*) /cache/$host/$1.html break;
    }

    if (-f $document_root/cache/$host/$uri) {
      rewrite (.*) /cache/$host/$1 break;
    }

    proxy_pass http://site;
    break;
  }
}

我是新来nginx的,而这个配置文件是从以前的项目中我还没有工作的复制,所以这可能是一个非常新手问题。

Answer 1:

为了让nginx的服务,您需要使用try_files,让我分享的配置静态缓存的网页:

upstream site {
  server          unix:/home/site/deploy/site/shared/pids/thin.0.sock fail_timeout=0;
}

server {
  listen          80;
  server_name     www.example.com;
  rewrite ^(/.*)  http://example.com$1 permanent;
}

server {
  listen          80;
  server_name     example.com;
  charset         utf-8;

  root            /home/site/deploy/site/current;
  try_files       $uri/index.html $uri @thin;

  gzip on;

  location @thin {
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host $http_host;
    proxy_redirect    off;
    proxy_pass        http://site;
  }

  location ~* ^.+.(jpg|jpeg|gif|png|swf|zip|rar|doc|xls|exe|pdf|ppt|txt|tar)$ {
    root             /home/site/deploy/site/current/public/;
    expires          max;
    break;
  }
}


Answer 2:

这里是一个更一般的理论答案(SO编辑拒绝了我的编辑在上面的答案解释。):

Nginx已经一个ngx_static模块,默认是开启的。 该模块在内容阶段的结束运行。 它将提供静态文件,如果在该位置块中没有其他内容命令可以在请求工作。 它也只会如果URI不以斜线结束工作。

因此,为静态文件,一个需要确认的URI是内容阶段结束时有效的路径名,并没有其他的内容相命令 ,可以在同一位置区域内投放的东西。

在我的情况,我想访问缓存页面,我可以用try_files改写URI。 try_files工作在一个阶段只是内容阶段 ,这将检查文件是否存在之前。 如果存在其中之一,那么URI改变到该文件。 然后在内容阶段,它会提供服务。

如果我想要什么服务静态文件,如果存在的话,或者如果它不提供动态内容? 通常动态内容服务将防止静态文件送达。 在这种情况下,可以使用不同的位置的块。 如果在没有找到静态文件try_files ,我们跳转到另一个位置的块(在本例中@thin ,所有的动态内容提供服务。但是,如果静态文件存在,我们停留在原来的位置块,当我们输入的内容相,由于服务命令中没有其他内容,静态文件送达。



文章来源: What in nginx determines what goes to rails and what is served directly?