Nginx 之 http配置段介紹

1  概述


本文將介紹nginx裏http配置段的相關配置,主要介紹ngx_http_core_module這個模塊的相關功能和命令。由於主配置文件的http配置段裏有 include /etc/nginx/conf.d/*.conf; 這個配置,因此可以單獨在路徑/etc/nginx/conf.d/下面單獨編寫配置文件


2  HTTP配置段


2.1  http協議相關的配置結構

http {
    ...
    ...各server的公共配置
    server {每個server用於定義一個虛擬主機 
        ... 
        }
    server {
        ...
        server_name 虛擬主機名
        root 主目錄
    alias 路徑別名
        location [OPERATOR] URL { 指定URL的特性 
        ... 
                if CONDITION {
                    ...
                    }
                }
        }
}


2.2  與套接字相關的配置


.1server

server { ... }

 ngnix裏,實際是沒有virtualhost的概念,都是主機,監聽端口號,要放在server裏,不能所有的機器只用一個監聽端口配置。要分別配置監聽端口

配置一個虛擬主機

server {
listen  address[:PORT]|PORT;
server_name  SERVER_NAME;
root  /PATH/TO/DOCUMENT_ROOT;
}

 注意:listen  address[:PORT]|PORT;是兩種寫法

寫法一:listen  172.18.50.73:8080

寫法二:listen  8080

例子

server {
listen 17
2.18.50.73:8088;
    server_name www.sunny.com;
    root /usr/share/nginx/html/diysrv;
}

.2listen 

listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE

listen address[:port] [default_server][ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]

default_server設定爲默認虛擬主機

ssl限制僅能夠通過ssl連接提供服務

backlog=number 超過併發連接數後,新請求進入後援隊列的長度

rcvbuf=size接收緩衝區大小

sndbuf=size 發送緩衝區大小

虛擬主機的創建,三個方法

(1) 基於port

listen PORT; 指令監聽在不同的端口

(2) 基於ip的虛擬主機

listen IP:PORT; IP 地址不同

(3) 基於hostname

server_name  fqdn; 指令指向不同的主機名

例子如下

注意:基於ip 和FQDN要把默認主站點的server配置去除,否則主頁面會出錯

#基於ip
server {
listen 80;
server_name 172.18.50.199;
root /usr/share/nginx/html/baseip;
}
#基於FQDN
server {
listen 80;
server_name www.tracy.com;
location / {
root /usr/share/nginx/html/basefqdn;
index index.html;
}
}
#基於端口
server {
listen 9090;
server_name www.sunny.com;
root /usr/share/nginx/html/baseport;
}

.3server_name

server_name name...;

.虛擬主機的主機名稱後可跟多個由空白字符分隔的字符串

.支持*通配任意長度的任意字符

dns先解析成名字,才和以下的配置做對比生效

server_name  *.magedu.com   www.magedu.*

.支持~起始的字符做正則表達式模式匹配,性能原因慎用

server_name  ~^www\d+\.magedu\.com$

以上語句\d 表示[0-9],命令表示匹配www開頭的,www[0-9].magedu.com結尾的

.匹配優先級機制從高到低:

(1) 首先是字符串精確匹配如:www.magedu.com

(2) 左側*通配符如:*.magedu.com

(3) 右側*通配符如:www.magedu.*

(4) 正則表達式如:~^.*\.magedu\.com$

(5) default_server

.4tcp_nodelay

tcp_nodelay  on | off;

keepalived模式下的連接是否啓用TCP_NODELAY選項

當爲off時,延遲發送,合併多個請求後再發送,湊齊多個請求後在發送給後臺處理,但是這個情況可能會導致客戶端等待,會比較慢,所以一般是不延遲發送

默認on時,不延遲發送

可用於:http,server, location

.5sendfile

sendfile  on | off;

是否啓用sendfile功能,在內核中封裝報文直接發送,速度更快,默認Off

.6server_tokens 

 server_tokens  on | off | build | string

是否在響應報文的Server首部顯示nginx版本,默認是on,建議設置爲off


2.3  定義路徑相關的配置


.7root

.設置web資源的路徑映射;用於指明請求的URL所對應的文檔的目錄路徑,可用於http, server,location, if in location

server {
...
root  /data/www/vhost1;
}

.8location

location [ = | ~ | ~* | ^~ ]  uri{ ... }

=:對URI做精確匹配;

^~:對URI的最左邊部分做匹配檢查,不區分字符大小寫

~:對URI做正則表達式模式匹配,區分字符大小寫

~*:對URI做正則表達式模式匹配,不區分字符大小寫

不帶符號:匹配起始於此uri的所有的uri

匹配優先級從高到低:=, ^~, /*, 不帶符號

location @name { ... }

location是重點,可以定義複雜的邏輯關係,或者實現身份驗證,重定向等, 後面跟URL,根據URL做相應的控制,匹配到相應的url後做什麼操作, 這個相當於條件判斷

在一個serverlocation配置段可存在多個,用於實現從uri到文件系統的路徑映射;ngnix會根據用戶請求的URI來檢查定義的所有location,並找出一個最佳匹配,而後應用其配置

.示例一:

server {
server_name  www.sunny.com;
location  /images/  {
root  /data/imgs/;
}
}

測試: 當訪問http:// www.sunny.com/images/aa.jpg將會被轉到訪問/data/imgs/images/aa.jpg

.9alias

alias  path;

路徑別名,文檔映射的另一種機制;僅能用於location上下文

例子

server {
    listen 8080; 
    server_name www.sunny.com;
    root /usr/share/nginx/html/diysrv;
    location  /images {
    alias /app/test;
    }   
}

表示當訪問http://www.sunny.com:8080/images/將都會被轉換到路徑/app/test下的對應資源

如訪問http://www.sunny.com:8080/images/相當於是訪問了/app/test/index.html

如訪問http://www.sunny.com:8080/images/aa相當於是訪問了/app/test/aa

區分aliasroot例子:

location /bbs/ {         
alias  /web/forum/;
}

 當訪問http://172.18.50.73/bbs相當於訪問該機器下的/web/forum/index.html資源

location /bbs/ {

root /web/forum/;

} --> /web/forum/bbs/index.html

 當訪問http://172.18.50.73/bbs相當於訪問該機器下的/web/forum/bbs/index.html資源

.注意:location中使用root指令和alias指令的意義不同

(a) root,給定的路徑對應於location中的/uri/左側的/

(b) alias,給定的路徑對應於location中的/uri/右側的/

.10index

index  file ...;

指定默認網頁資源,注意:ngx_http_index_module模塊

.11error_page  

error_page  code ... [=[response]]  uri;

模塊:ngx_http_core_module

定義錯誤頁,以指定的響應狀態碼進行響應

可用位置:http,server, location, if in location

error_page 404 /404.html
error_page  404 =200 /404.html

例子

例一,用alias

    error_page 404  /404.html;
    location  /404.html {
       alias  /app/error_pages/404.html;
}

#表示當訪問網站出現404報錯的時候,就跳轉到/app/error_pages/404.html這個頁面

例二,用root

    error_page 404  /404.html;
    location  /404.html {
       alias  /app/error_pages/;
}

#表示當訪問網站出現404報錯的時候,就跳轉到/app/error_pages/404.html這個頁面

例三

error_page 404=200  /404.html;
    location /404.html {
       alias /app/error_pages/404.html;
   }

#注意等號的位置,404後面有空格,然後跟=200,等號和200之間沒有空格,錯誤頁面返回200的代碼,而不返回404代碼,防止客戶端訪問該網頁發生錯誤代碼的時候被劫持

.12try_files

try_files  file ... uri;

try_files  file ... =code;

按順序檢查文件是否存在,返回第一個找到的文件或文件夾(結尾加斜線表示爲文件夾),如果所有的文件或文件夾都找不到,會進行一個內部重定向到最後一個參數。只有最後一個參數可以引起一個內部重定向,之前的參數只設置內部URI的指向。最後一個參數是回退URI且必須存在,否則會出現內部500錯誤

例子

location  /images/  { try_files  $uri   /images/default.gif; }

默認先找$uri這個資源,如果沒有,就訪問/images/default.gif

注意這裏的$uri是變量,假設家目錄是/usr/share/nginx/html,那麼上例表示訪問http://172.18.50.73/images時嘗試訪問/usr/share/nginx/html/images/index.html/usr/share/nginx/html/ default.gif的資源

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

表示依次先找 $uri  $uri /index.html$uri.html,如果都不存在,就返回報錯代碼是404報錯


2.4  定義客戶端請求的相關配置


.13keepalive_timeout

keepalive_timeout   timeout  [header_timeout];

設定保持連接超時時長,0表示禁止長連接,默認爲75s,可以調整短點。

.14keepalive_requests

keepalive_requests  number;

在一次長連接上所允許請求的資源的最大數量,默認爲100

.15keepalive_disable

keepalive_disable   none | browser ...

對哪種瀏覽器禁用長連接

.16send_timeout

send_timeout   time;

向客戶端發送響應報文的超時時長,此處是指兩次寫操作之間的間隔時長,而非整個響應過程的傳輸時長 

.17client_body_buffer_size 

client_body_buffer_size  size;

用於接收每個客戶端請求報文的body部分的緩衝區大小;默認爲16k;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置。注意,這裏是接收,不是下發數據,上傳文件到該網站,纔看得到效果

.18client_body_temp_path 

client_body_temp_path  path [level1 [level2 [level3]]];

設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量

這裏指定的路徑下存放文件,目錄名爲16進制的數字,是經過hash運算後,利用hash的值的最後幾位數,依次分層,如三層目錄進行存放文件

例子

client_body_temp_path   /var/tmp/client_body  1 2 2

1 1級目錄佔116進制,即2^4=16個目錄0-f

2 2級目錄佔216進制,即2^8=256個目錄00-ff

2 3級目錄佔216進制,即2^8=256個目錄00-ff


2.5  對客戶端進行限制的相關配置


.19limit_rate

limit_rate   rate;

限制響應給客戶端的傳輸速率,單位是bytes/second,默認值0表示無限制

.20limit_except  

limit_except  method ... { ... },僅用於location

限制客戶端使用除了指定的請求方法之外的其它方法

method:GET, HEAD, POST, PUT, DELETEMKCOL, COPY, MOVE,OPTIONS, PROPFIND,PROPPATCH, LOCK, UNLOCK, PATCH

location {
limit_except   GET {
allow 192.168.1.0/24;
deny all;
} 
}

除了GETHEAD 之外其它方法僅允許192.168.1.0/24網段主機使用


2.6  文件操作優化的配置


.21aio 

aio   on | off | threads[=pool];是否啓用aio功能,默認是on

.22directio 

directio  size | off;一般是異步

是否同步(直接)寫磁盤,而非寫緩存,在Linux主機啓用O_DIRECT標記,則文件大於等於給定大小時使用,例如directio  4m

.23open_file_cache

open_file_cache  off;

open_file_cache  max=N  [inactive=time];

nginx可以緩存以下三種信息:緩存的是元數據,不是數據本身

(1) 文件元數據:文件的描述符、文件大小和最近一次的修改時間

(2) 打開的目錄結構

(3) 沒有找到的或者沒有權限訪問的文件的相關信息

max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實現管理

inactive=time:緩存項的非活動時長,在此處指定的時長內未被命中的或命中的次數少於open_file_cache_min_uses指令所指定的次數的緩存項即爲非活動項,將被刪除

inactive=time 10分鐘;open_file_cache_min_uses3,表示在10分鐘內訪問低於3次表示非活動的,該文件就不會被緩存,會被清空

.24open_file_cache_errors 

open_file_cache_errors on | off;

是否緩存查找時發生錯誤的文件一類的信息,默認值爲off

.25open_file_cache_min_uses

open_file_cache_min_uses  number;

open_file_cache指令的inactive參數指定的時長內,至少被命中此處指定的次數方可被歸類爲活動項,默認值爲1

.26open_file_cache_valid

open_file_cache_valid  time;

緩存項有效性的檢查頻率,默認值爲60s




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章