天天看點

nginx中http子產品介紹

作者:傳說中的黃瓜

Nginx是一個高性能的Web伺服器,其配置具有高度的靈活性和可定制性。其中,HTTP子產品是Nginx配置的核心,可以用于定義HTTP請求的行為和響應。在本文中,我們将介紹Nginx HTTP子產品配置項的常見用法。

配置文法

HTTP子產品配置由多個指令組成,每個指令包含一個指令名稱、參數和一個塊配置。其基本文法如下:

指令名稱 參數 {
    塊配置
}
           

其中,指令名稱和參數之間可以用空格或制表符分隔,塊配置用花括号括起來。

常見配置項

server

server指令用于定義虛拟主機。可以使用多個server塊配置多個虛拟主機,每個虛拟主機可以有不同的域名或IP位址和端口号。其基本文法如下:

server {
    listen       80;
    server_name  example.com www.example.com;
    location / {
        root   /var/www/html;
        index  index.html index.htm;
    }
}
           

其中,listen指令用于定義監聽端口,server_name指令用于定義虛拟主機的域名,location塊用于定義請求處理的規則。

location

location指令用于定義請求處理的規則。可以使用多個location塊配置不同的請求處理規則,每個規則可以比對URI的不同部分,進而定義不同的處理方式。其基本文法如下:

location / {
    root   /var/www/html;
    index  index.html index.htm;
}
           

其中,/表示要比對的URI部分,root指令用于定義檔案資源的根目錄,index指令用于定義預設的索引檔案。

proxy_pass

proxy_pass指令用于将請求代理到另一個伺服器。可以使用該指令實作反向代理、負載均衡等功能。其基本文法如下:

location / {
    proxy_pass http://localhost:8080;
}
           

其中,http://localhost:8080表示代理的目标伺服器位址和端口号。

try_files

try_files指令用于嘗試通路不同的檔案,直到找到一個可以通路的檔案為止。可以使用該指令實作自定義的URL重寫和錯誤處理。其基本文法如下:

location / {
    try_files $uri $uri/ /index.php;
}
           

其中,$uri表示要嘗試通路的URI,/index.php表示預設的錯誤處理頁面。

rewrite

rewrite指令用于重寫URI,可以使用該指令實作自定義的URL重寫和轉發。其基本文法如下:

rewrite ^/blog/(.*)$ /news/$1 last;
           

其中,^/blog/(.*)$表示要比對的URI正規表達式,/news/$1表示重寫後的URI,last表示停止

在nginx中,http子產品是其中一個最常用的子產品。它提供了一些配置項來控制HTTP協定的處理方式,包括伺服器的基本設定、緩存、代理、重定向和安全等。在這篇文章中,我們将會詳細介紹一些常用的http子產品配置項。

listen

listen用于配置nginx監聽的端口和IP位址。它的文法如下:

listen address[:port] [default_server] [ssl] [http2] [spdy] [reuseport] [backlog=number] [deferred] [bind] [ipv6only=on|off] [so_keepalive=on|off|keepidle:keepintvl:keepcnt]
           

其中,address可以是一個IP位址或一個域名。如果省略了端口,則預設為80。default_server表示這是預設伺服器,當nginx無法比對到任何虛拟主機時會使用該伺服器。ssl表示啟用SSL協定。http2表示啟用HTTP/2協定。spdy表示啟用SPDY協定。reuseport表示啟用SO_REUSEPORT特性,可以提高并發性能。backlog表示用戶端連接配接隊列的長度。deferred表示啟用deferred模式。bind表示綁定到指定的位址。ipv6only表示是否僅使用IPv6。so_keepalive表示是否啟用TCP keepalive功能。

server_name

server_name用于配置虛拟主機名稱。它的文法如下:

server_name name [name ...];
           

其中,name可以是一個域名或IP位址。如果有多個名稱,則使用空格分隔。

root

root用于配置靜态檔案的根目錄。它的文法如下:

root path;
           

其中,path為檔案根目錄的路徑。

index

index用于配置預設文檔。它的文法如下:

index file [file ...];
           

其中,file可以是檔案名或相對路徑。如果有多個檔案,則使用空格分隔。

location

location用于配置請求比對規則以及相應的處理方式。它的文法如下:

location [modifier] uri {
    ...
}
           

其中,modifier可以是以下任意一個:

  • =:精确比對
  • ~:區分大小寫的正規表達式比對
  • ~*:不區分大小寫的正規表達式比對
  • ^~:如果字首比對成功,則停止尋找比對的location
  • /:通用比對

uri表示要比對的URI。如果有多個比對項,則使用大括号将它們括起來。

proxy_pass

proxy_pass用于配置代理伺服器的位址和協定。它的文法如下:

proxy_pass url;
           

其中,url為代理伺服器的位址和協定。例如,http://127.0.0.1:8080。

try_files

access_log

用于配置通路日志檔案的格式和位置。文法如下:

access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
           

其中,path 表示日志檔案的路徑和檔案名;format 表示日志檔案的格式,可以使用 $ 開頭的變量來自定義日志格式;buffer 表示緩存大小,機關為位元組,預設值為 64k;gzip 表示是否啟用 Gzip 壓縮,level 表示壓縮級别;flush 表示緩存重新整理時間,機關為秒,預設值為 1s;if 表示條件,用于指定僅在滿足條件時記錄日志。

error_log

用于配置錯誤日志檔案的格式和位置。文法如下:

error_log file [level];
           

其中,file 表示錯誤日志檔案的路徑和檔案名;level 表示錯誤日志的記錄級别,可以是 debug、info、notice、warn、error、crit、alert 或 emerg 中的一個,預設值為 error。

sendfile

用于控制是否使用 sendfile 函數來傳輸檔案。文法如下:

sendfile on | off;
           

其中,on 表示使用 sendfile 函數傳輸檔案,off 表示不使用 sendfile 函數。

tcp_nopush

用于控制是否啟用 TCP 的 NOPUSH 選項。文法如下:

tcp_nopush on | off;
           

其中,on 表示啟用 TCP 的 NOPUSH 選項,off 表示禁用。

tcp_nodelay

用于控制是否啟用 TCP 的 NODELAY 選項。文法如下:

tcp_nodelay on | off;
           

其中,on 表示啟用 TCP 的 NODELAY 選項,off 表示禁用。

keepalive_timeout

用于控制 keep-alive 連接配接的逾時時間。文法如下:

keepalive_timeout timeout;
           

其中,timeout 表示逾時時間,機關為秒,預設值為 75s。

keepalive_requests

用于控制 keep-alive 連接配接的最大請求數。文法如下:

keepalive_requests n;
           

其中,n 表示最大請求數,預設值為 100。

resolver

用于配置 DNS 解析器位址。文法如下:

resolver address ... [valid=time] [ipv6=on|off];
           

其中,address 表示 DNS 解析器的位址,可以是一個 IP 位址或者一個主機名;valid 表示 DNS 解析結果的有效期,機關為秒,預設值為 30s;ipv6 表示是否啟用 IPv6 解析,on 表示啟用,off 表示禁用。

location指令

location指令用于比對請求的URI,并指定相應的處理方式。在nginx的http、server、location配置塊中均可使用location指令。下面是location指令的文法格式:

location [ 精确比對 | 正則比對 ] uri { … }
           

其中,uri可以是一個普通的字元串,也可以是一個正規表達式。如果uri是一個字元串,則表示對請求URI進行精确比對;如果uri是一個正規表達式,則表示對請求URI進行正則比對。location指令内部可以設定一系列的指令,用于指定對比對到的請求的處理方式。例如:

location / {
    root /usr/share/nginx/html;
    index index.html;
}

location /api {
    proxy_pass http://127.0.0.1:8080;
}
           

上述配置中,第一個location指令用于精确比對根目錄(/)請求,将請求轉發到/usr/share/nginx/html目錄下的index.html檔案;第二個location指令用于正則比對以/api開頭的請求,将請求轉發到本地的8080端口上。

location指令還支援多種比對方式,如字首比對、字尾比對、正則比對等。例如:

location ^~ /images/ {
    root /data/www;
    expires 30d;
}

location ~ \.(gif|jpg|jpeg|png)$ {
    root /data/images;
    expires 30d;
}
           

上述配置中,第一個location指令使用字首比對,比對以/images/開頭的請求,将請求的資源從/data/www目錄下擷取,并設定過期時間為30天;第二個location指令使用正則比對,比對以gif、jpg、jpeg、png為字尾的請求,将請求的資源從/data/images目錄下擷取,并設定過期時間為30天。

總結

nginx http子產品是nginx的核心子產品之一,負責處理HTTP請求和響應。在nginx的http子產品中,可以通過一系列的配置項來控制nginx的行為,包括基本的配置項、子產品配置項和http子產品配置項。其中,http子產品配置項是比較重要的一類配置項,它可以控制nginx在處理HTTP請求和響應時的行為。在http子產品配置項中,比較常用的有server、location、proxy_pass等指令。熟練掌握這些指令,可以幫助我們更好地使用nginx建構高效的Web服務。

繼續閱讀