了解NGINX配置文件

时间:2020-02-23 14:41:06  来源:igfitidea点击:

了解NGINX配置文件的结构以使您的服务器获得最佳性能非常重要。
此外,通过在NGINX配置中的正确上下文中应用指令,将使您能够消除重复的代码并更好地管理基础架构。

因此,为了帮助您理解NGINX配置文件的结构,本文将重点介绍NGINX配置文件的详细结构。

什么是Nginx上下文?

让我们开始检查NGINX配置文件的位置。
核心配置文件(nginx.conf)可以在/etc/nginx中找到。
该位置将根据NGINX的安装过程而有所不同。

在文本编辑器中打开核心NGINX配置文件。
首先,您会注意到配置是用花括号{和}包围的树状结构组织的。
用括号括起来的这些位置称为用于放置配置指令的上下文。
此外,配置指令及其参数以分号结尾。

在NGINX中,上下文可以嵌套在其他上下文中,从而创建层次结构。
在以下示例中,HTTP上下文声明了HTTP协议的设置。
虚拟主机设置在服务器上下文中声明,并包含在http上下文中。
服务器上下文中包含用于存储URL设置的位置上下文。

# Global context
 ...
 ...
 # http context
http{
   ...
   ...
   # Server context
   server {
            listen 80;
            server_name example.com;
            ...
            ...
            # Location context
            location/{            
                        root /var/www/html;            
                        try_files $uri $uri/=404;        
                        ...
                        ...
           }
  }
  # Server context
  server {
           ...
           ...
           # Location context
           location/{ 
                       ...
                       ...
           }
  }
  ...
  ...
}

NGINX配置文件–主要上下文

主要上下文用于全局设置NGINX的设置,并且是唯一不被花括号包围的上下文。
通常,主上下文位于核心NGINX配置文件的开头。
主上下文的指令不能在任何其他上下文中继承,因此不能被覆盖。

user nginx;
worker_processes auto;
pid /run/nginx.pid;
...
...

NGINX配置文件–事件上下文

事件上下文用于设置连接处理的全局选项。
事件上下文包含在主上下文中,并且只能有一个这样的上下文。
您可以在此上下文中放置的指令是设置连接处理方法,连接数以及其他一些指令。

# main context

events {
      # events context
    	worker_connections 768;	
    	multi_accept on;
}
...
...

NGINX配置文件– HTTP上下文

HTTP上下文包含用于处理HTTP和HTTPS流量的指令。
HTTP上下文是主上下文的子级,在为您的域声明了虚拟主机设置的每个服务器上下文中,绝对需要HTTP上下文。

user nginx;
worker_processes auto;
pid /run/nginx.pid;
...
...
events {
      # events context
      worker_connections 768;	
      multi_accept on;
    	...
    	...
}
http {
     sendfile on;	
     tcp_nopush on;	
     tcp_nodelay on;	
     keepalive_timeout 65;
     ...
     ...
}

NGINX配置文件–服务器上下文

NGINX虚拟主机设置在服务器上下文中定义,而服务器上下文又包含在HTTP上下文中。
HTTP上下文中可以有多个服务器上下文。
服务器上下文中的指令控制与特定域或者IP地址关联的资源请求的处理。

user nginx;
worker_processes auto;
pid /run/nginx.pid;
...
...
events {
       # events context
       worker_connections 768;	
    	 multi_accept on;
    	 ...
    	 ...
 }
http {
     sendfile on;	
     tcp_nopush on;	
     tcp_nodelay on;	
     keepalive_timeout 65;
     ...
     ...

     server {
              listen 80;
              server_name domain1.com;
              root /var/www/html/wordpress;
              ...
   
     }
     server {
              listen 80;
              server_name domain2.com;
              root /var/www/html/drupal;
              ...
   
     }
}

NGINX配置文件–位置上下文

位置上下文用于定义指令以处理客户端请求。
当对资源的请求到达NGINX时,它将尝试将URI与位置之一进行匹配并进行相应的处理。

可以在服务器块内定义多个位置上下文。
此外,位置上下文也可以嵌套在另一个位置上下文中。

http {
     ...
     ...

     server {
              listen 80;
              server_name domain1.com;
              root /var/www/html/wordpress;
              ...
              location /some_url {  
              # configuration for processing URIs starting with /some_url
              }
              location /another_url {  
              # configuration for processing URIs starting with /another_url
              }    
     }
     server {
              listen 80;
              server_name domain2.com;
              root /var/www/html/drupal;
              ...
              location /some_url {  
              # configuration for processing URIs starting with /some_url  
              }
              location /some_other_url {  
              # configuration for processing URIs starting with /some_other_url
              }  
   
     }
}

上游环境

允许上游上下文定义NGINX可以代理请求的后端服务器池。
上下文使NGINX能够在代理请求时执行负载平衡。
上游上下文在HTTP上下文内部和任何服务器上下文外部定义。

一旦定义了上游服务器,就可以在服务器上下文中使用相同的名称,以将请求传递到后端服务器池。

http{
   ...
   ...
   upstream backend_servers {
                              server host1.example.com;
                              server host2.example.com;
                              server host3.example.com;
   }

server {
           listen 80;
           server_name example.com;
           location/{
                         proxy_pass https://backend_servers;
           }
}
}

邮件内容

NGINX可以将IMAP,POP3和SMTP协议代理到上游邮件服务器之一或者托管邮件帐户的外部邮件服务。
为此,NGINX使用邮件上下文,该上下文允许在代理邮件连接的所有方面使用配置指令。

邮件上下文是在主上下文中定义的,即与HTTP上下文处于同一级别。

# main context
mail {
     server_name mail.example.com;
     auth_http   localhost:9000/cgi-bin/nginxauth.cgi;
     proxy_pass_error_message on;
     ...
}
http {

}
...
...

NGINX配置文件–如果上下文

if-context允许有条件地执行其中定义的指令。
上下文与任何其他编程语言中的if语句相同。
由于此处讨论的某些限制,应尽可能避免if上下文。

http {
      server {
                   location /some_url {
                   if (test_condition) {
                        # do some stuff here
                 }

       }
  }
}

Limit_except上下文

limit_except上下文允许阻止使用除明确允许的所有HTTP方法之外的所有HTTP方法。
在位置上下文中,您可以限制某些HTTP方法的使用,例如禁止客户端使用limit_except上下文发送POST请求。

只需在limit_except上下文中定义两个元素,第一个是允许的方法,第二个是受限制影响的受众。

...
...
location /wp-admin/{ 
  limit_except GET { 
    allow 127.0.0.1; 
    deny all; 
  } 
}
...
...

上面的limit_except示例允许所有访问者在/wp-admin位置使用GET标头。
如果其他HTTP标头仅来自本地地址,则允许使用其他HTTP标头。

NGINX配置文件的其他上下文

除了到目前为止我们已经讨论过的上下文,NGINX中几乎没有其他可用的上下文,下面将进行描述。
这些上下文取决于可选模块,很少使用。

  • split_clients:split_client上下文用于将客户端请求分为两个或者多个类别。
    此上下文在http上下文内部定义,主要用于A/B测试。

  • geo:geo上下文用于对客户端IP地址进行分类。
    它根据连接的IP地址映射变量的值。

  • charset_map:charset_map上下文用于将特定的字符集添加到" Content-Type"响应头字段。
    另外,使用上下文可以将数据从一种字符集转换为另一种字符集,但有一些限制。

  • map:map上下文创建变量,其值取决于其他变量的值,并在http上下文中定义。

  • perl/perl_set:perl上下文用于在Perl中实现位置和变量处理程序,并将Perl调用插入SSI。
    此外,使用perl_set上下文可以为特定变量安装Perl处理程序。

  • 类型:类型上下文用于映射具有正确文件扩展名的MIME类型。
    类型上下文可以出现在http,服务器或者位置上下文中。
    默认的MIME类型通过NGINX核心配置文件nginx.conf加载。