Nginx 最小配置

安全的服务器是只配置所需内容的服务器。

理想情况下,应基于最小配置构建服务器,不要配置多余的选项。

使用最小的配置也有助于调试。如果错误在最小配置中,可以通过增加或减少配置来排查错误。


下面是运行 nginx 所需的最低配置:

# /etc/nginx/nginx.conf  
  
events {}         # event context have to be defined to consider config valid  
  
http {  
 server {  
    listen 80;  
    server_name  cainiaoplus.com;
  
    return 200 "Hello";  
  }  
}  

root, location 和 try_files 指令

root 指令

root 指令用于设置请求的根目录,允许 nginx 将传入的请求映射到文件系统。

server {  
  listen 80;  
  server_name cainiaoplus.com;
  root /var/www/cainiaoplus.com;
} 

它允许nginx根据请求返回服务器内容:

cainiaoplus.com/index.html     # returns /var/www/cainiaoplus.com/index.html
cainiaoplus.com/foo/index.html # returns /var/www/cainiaoplus.com/foo/index.html  
 

Location 指令

location 指令用于根据请求的 URI(统一资源标识符)设置配置。

语法是:

location [modifier] path  

例子:

location /foo {  
  # ...  
}  

当没有给出修饰符时,路径被视为前缀,之后可以跟任何东西。上面的例子将匹配:

/foo  
/fooo  
/foo123  
/foo/bar/index.html  
... 

我们还可以在给定的上下文中使用多个位置指令:

server {  
  listen 80;  
  server_name cainiaoplus.com;
  root /var/www/cainiaoplus.com;
  
  location / {  
    return 200 "root";  
  }  
  
  location /foo {  
    return 200 "foo";  
  }  
}  

cainiaoplus.com/       # => "root"
cainiaoplus.com/foo    # => "foo"
cainiaoplus.com/foo123 # => "foo"
cainiaoplus.com/bar    # => "root"

Nginx 还提供了一些可以与location指令结合使用的修饰符。

修饰符已分配优先级:

=           - 完全匹配  
^~          - 优先匹配  
~ && ~*     - 正则表达式匹配  
no modifier - 前缀匹配  

首先,nginx 将检查是否有任何完全匹配。如果它不存在,它将寻找优先的。如果此匹配也失败,则将按出现顺序测试正则表达式匹配。如果都失败了,将使用最后一个前缀匹配。

location /match {  
  return 200 'Prefix match: will match everything that starting with /match';  
}  
  
location ~* /match[0-9] {  
  return 200 'Case insensitive regex match';  
}  
  
location ~ /MATCH[0-9] {  
  return 200 'Case sensitive regex match';  
}  
  
location ^~ /match0 {  
  return 200 'Preferential match';  
}  
  
location = /match {  
  return 200 'Exact match';  
} 
 
/match # =>  '完全匹配'  
/match0 # =>  '优先匹配'  
/match1 # =>  '不区分大小写的正则表达式匹配'  
/MATCH1 # =>  '区分大小写的正则表达式匹配'  
/match-abc # =>  '前缀匹配:匹配以 /match 开头的所有内容' 

try_files 指令

该指令尝试不同的路径,并将返回找到的任何一个。

try_files $uri index.html =404;  

所以 /foo.html 将尝试按以下顺序返回文件:

  • $uri (/foo.html);
  • index.html
  • If none is found:404

如果我们在服务器上下文中定义 try_files,然后定义一个查找所有请求的blocation,我们的 try_files 将不会被执行。发生这种情况是因为服务器上下文中的 try_files 定义了伪 location,这是可能的最不具体的 location。因此,定义 location / 将比伪 location 更具体。

server {  
  try_files $uri /index.html =404;  
  
  location / {  
  }  
}  

因此,我们应该避免在服务器上下文中使用 try_files:

server {  
  location / {  
    try_files $uri /index.html =404;  
  }  
}