亚洲区国产区激情区无码区,国产成人mv视频在线观看,国产A毛片AAAAAA,亚洲精品国产首次亮相在线

Nginx 指令和上下文

默認(rèn)情況下,nginx 配置文件可以位于:

/etc/nginx/nginx.conf
/usr/local/etc/nginx/nginx.conf 
/usr/local/nginx/conf/nginx.conf  

配置文件的位置會(huì)根據(jù) Nginx 的安裝過程而有所不同。

該文件具有以下內(nèi)容:

Directive

Nginx 中的配置選項(xiàng)稱為指令。該選項(xiàng)有名稱和參數(shù),必須以分號(hào) (;) 結(jié)尾,否則 Nginx 將無法加載配置并產(chǎn)生錯(cuò)誤。

例子:

gzip on;  

Context

當(dāng)我們?cè)谖谋揪庉嬈髦写蜷_核心 Nginx 配置文件時(shí),首先我們會(huì)注意到配置被組織成樹狀結(jié)構(gòu),并被花括號(hào)包圍,即“{”和“}”。這些被大括號(hào)包圍的位置稱為放置配置指令的上下文。此外,配置指令及其參數(shù)以分號(hào)結(jié)尾。

這是我們可以聲明指令的部分。它類似于編程語言中的作用域。

上下文可以嵌套在其他上下文中,從而創(chuàng)建上下文層次結(jié)構(gòu)。

例子:

worker_processes 2; # 全局上下文中的指令  
http {              # http 上下文  
    gzip on;        # http 上下文中的指令  
  
  server {          # 服務(wù)器上下文  
    listen 80;      # 服務(wù)器上下文中的指令  
  }  
}

用# 填充的行是注釋,Nginx 不會(huì)解釋。

指令類型

由于不同指令的繼承模型不同,因此在多個(gè)上下文中使用同一個(gè)指令時(shí)要注意。共有三種類型的指令,每種類型都有其繼承模型。

普通的

每個(gè)上下文有一個(gè)值。我們只能在上下文中定義它一次。子上下文可以覆蓋父指令,但此覆蓋僅在給定的子上下文中有效。

gzip on;  
gzip off; # 在同一個(gè)上下文中有兩個(gè)普通指令是非法的   
  
server {  
  location /downloads {  
    gzip off;  
  }  
  
  location /assets {  
    # gzip 在這里有效  
  }  
}  

Array

在同一上下文中添加多條指令會(huì)增加值而不是完全覆蓋它們。在子上下文中定義指令將覆蓋給定子上下文中父級(jí)的所有值。

error_log /var/log/nginx/error.log;  
error_log /var/log/nginx/error_notive.log notice;  
error_log /var/log/nginx/error_debug.log debug;  
  
server {  
  location /downloads {  
    # 這將覆蓋父級(jí)所有指令  
    error_log /var/log/nginx/error_downloads.log;  
  }  
} 

行動(dòng)指令A(yù)ction Directive

動(dòng)作是用于改變事物的指令。它們的繼承行為將取決于模塊。

例如:在 rewrite 指令的情況下,每個(gè)匹配的指令都會(huì)被執(zhí)行。

server {  
  rewrite ^ /foobar;  
  
  location /foobar {  
    rewrite ^ /foo;  
    rewrite ^ /bar;  
  }  
}  

如果我們嘗試訪問/sample

  • 執(zhí)行服務(wù)器重寫,重寫從 /sample /foobar。
  • 然后匹配位置 /foobar
  • location 里第一個(gè)重寫被執(zhí)行,從重寫 /foob??ar 到 /foo。
  • location 里第二個(gè)重寫被執(zhí)行,從重寫 /foo 到 /bar。

讓我們看看return指令提供的不同行為:

server {  
  location / {  
    return 200;  
    return 404;  
  }  
}

從上面的情況來看,200 狀態(tài)立即返回。

上下文類型

讓我們看一個(gè)例子。

# 全局上下文  
 ...  
 ...  
 # http 上下文  
http{  
     ...  
     ...  
     # 服務(wù)器上下文  
     server {  
              listen 80;  
              server_name example.com;  
              ...  
              ...  
              # Location 上下文  
              location / {              
                          root /var/www/html;              
                          try_files $uri $uri/ =404;          
                          ...  
                          ...  
             }  
    }  
    # 服務(wù)器上下文  
    server {  
             ...  
             ...  
             # Location 上下文  
             location / {   
                         ...  
                         ...  
             }  
    }  
    ...  
    ...  
}  

從上面的例子中,我們可以看到 HTTP 上下文聲明了 HTTP 協(xié)議的設(shè)置。虛擬主機(jī)設(shè)置在服務(wù)器上下文中聲明,包含在 http 上下文中。用于存儲(chǔ) URL 設(shè)置的 location 上下文包含在服務(wù)器上下文中。

主要上下文

最一般的上下文是主上下文。它也稱為全局上下文。主上下文全局設(shè)置 Nginx 的設(shè)置,并且是唯一未被花括號(hào)包圍的上下文。

主上下文位于核心 Nginx 配置文件的開頭。此上下文的指令不能在任何其他上下文中繼承,因此不能被覆蓋。

主上下文用于配置在基本級(jí)別上影響整個(gè)應(yīng)用程序的詳細(xì)信息。在主上下文中配置的一些常見詳細(xì)信息是運(yùn)行工作進(jìn)程的用戶和組、工作進(jìn)程總數(shù)以及保存主進(jìn)程 ID 的文件??梢栽谥魃舷挛募?jí)別設(shè)置整個(gè)應(yīng)用程序的默認(rèn)錯(cuò)誤文件。

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

事件上下文

事件上下文為連接處理設(shè)置全局選項(xiàng)。事件上下文包含在主上下文中。Nginx 配置中只能定義一個(gè)事件上下文。

Nginx 使用基于事件的連接處理模型,因此在此上下文中定義的指令決定了工作進(jìn)程應(yīng)如何處理連接。

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

HTTP 上下文

HTTP 上下文用于保存處理 HTTP 或 HTTPS 流量的指令。

HTTP 上下文是事件上下文的兄弟,因此它們必須并排列出,而不是嵌套。他們都是主要上下文的孩子。

較低的上下文處理請(qǐng)求,此級(jí)別的指令控制每個(gè)虛擬服務(wù)器的定義默認(rèn)值。

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

服務(wù)器上下文

服務(wù)器上下文在 http 上下文中聲明。服務(wù)器上下文用于定義 Nginx 虛擬主機(jī)設(shè)置。HTTP 上下文中可以有多個(gè)服務(wù)器上下文。服務(wù)器上下文中的指令處理對(duì)與特定域名或 IP 地址關(guān)聯(lián)的資源的請(qǐng)求的處理。

此上下文中的指令可以覆蓋許多可能在 http 上下文中定義的指令,包括文檔位置、日志記錄、壓縮等。 除了從 http 上下文中獲取的指令之外,我們還可以配置文件以嘗試響應(yīng)請(qǐng)求、發(fā)出重定向和重寫,并設(shè)置任意變量。

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

location上下文

location上下文定義指令來處理客戶端的請(qǐng)求。當(dāng)任何對(duì)資源的請(qǐng)求到達(dá) Nginx 時(shí),它會(huì)嘗試將 URI(統(tǒng)一資源標(biāo)識(shí)符)與其中一個(gè)location匹配并相應(yīng)地處理它。

可以在服務(wù)器塊內(nèi)定義多個(gè)location上下文。此外,一個(gè)location上下文也可以嵌套在另一個(gè)location上下文中。

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

upstream上下文

upstream 上下文用于配置和定義上游服務(wù)器。允許此上下文定義后端服務(wù)器池,Nginx 可以代理請(qǐng)求時(shí)使用的后端服務(wù)器。這個(gè)上下文通常是我們正在配置的各種類型的代理。

upstream 上下文使 Nginx 能夠在代理請(qǐng)求的同時(shí)執(zhí)行負(fù)載平衡。此上下文在 HTTP 上下文內(nèi)部和任何服務(wù)器上下文外部定義。

upstream 上下文在服務(wù)器或 location 塊中按名稱引用。然后將某種類型的請(qǐng)求傳遞給定義好的服務(wù)器池。然后 upstream 將使用算法(默認(rèn)為輪詢)來確定需要使用哪個(gè)特定服務(wù)器來處理請(qǐng)求。

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 http://backend_servers;  
             }  
  }  
}  

郵件上下文

盡管 Nginx 最常用作 Web 或反向代理服務(wù)器,但它也可以用作高性能郵件代理服務(wù)器。用于此類指令的上下文稱為郵件上下文。郵件上下文定義在主上下文或全局上下文內(nèi)或 http 上下文外。

郵件上下文的主要目的是為在服務(wù)器上配置郵件代理解決方案提供一個(gè)區(qū)域。Nginx 可以將身份驗(yàn)證請(qǐng)求重定向到外部身份驗(yàn)證服務(wù)器。然后,它可以提供對(duì) POP3、SMTP 和 IMAP 郵件服務(wù)器的訪問,以提供實(shí)際郵件數(shù)據(jù)。

通常,郵件上下文如下所示:

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

if 上下文

if 上下文用于允許有條件地執(zhí)行其中定義的指令。if 上下文就像任何其他編程語言的“if 語句”。如果給定條件返回 true,則 if 上下文將執(zhí)行包含的指令。

由于某些限制,應(yīng)盡可能避免使用 if 上下文。

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

limit_except 上下文

limit_except 上下文用于防止在 location 上下文中使用除我們明確允許的方法之外的所有 HTTP 方法。例如,如果某些客戶端應(yīng)該有權(quán)訪問POST 內(nèi)容并且每個(gè)人都應(yīng)該有能力閱讀內(nèi)容,那么我們可以為此使用limit_except上下文。

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

雜項(xiàng)上下文

除了上述上下文之外,Nginx 中可用的上下文很少,如下所述。這些上下文依賴于可選模塊并且很少使用。

  • split_clients: split_client 上下文將客戶端的請(qǐng)求拆分為兩個(gè)或多個(gè)類別。該上下文定義在 HTTP 上下文中,主要用于 A/B 測試。
  • geo: geo 上下文對(duì)客戶端 IP 地址進(jìn)行分類。它用于根據(jù)連接的 IP 地址映射變量的值。
  • charset_map:此上下文用于將特定字符集添加到“Content-Type”響應(yīng)頭字段。此外,使用上下文,可以將數(shù)據(jù)從一個(gè)字符集轉(zhuǎn)換為另一個(gè)字符集,但有一些限制。
  • map: map上下文用于創(chuàng)建變量,其值依賴于其他變量的值,并在http上下文中定義。
  • perl/perl_set:用于在 Perl 中實(shí)現(xiàn)位置和變量處理程序,并將 Perl 調(diào)用插入 SSI。此外,在 perl_set 上下文的幫助下,我們可以為特定變量安裝 Perl 處理程序。
  • 類型:類型上下文用正確的文件擴(kuò)展名映射 MIME 類型。此上下文可能出現(xiàn)在 http 上下文、服務(wù)器上下文或位置上下文中。