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 與套接字相關的配置
.1、server
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; }
.2、listen
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; 指令指向不同的主機名
.3、server_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
.4、tcp_nodelay
tcp_nodelay on | off;
在keepalived模式下的連接是否啟用TCP_NODELAY選項
當為off時,延遲發送,合並多個請求後再發送,湊齊多個請求後在發送給後臺處理,但是這個情況可能會導致客戶端等待,會比較慢,所以一般是不延遲發送
默認on時,不延遲發送
可用於:http,server, location
.5、sendfile
sendfile on | off;
是否啟用sendfile功能,在內核中封裝報文直接發送,速度更快,默認Off
.6、server_tokens
server_tokens on | off | build | string
是否在響應報文的Server首部顯示nginx版本,默認是on,建議設置為off
2.3 定義路徑相關的配置
.7、root
.設置web資源的路徑映射;用於指明請求的URL所對應的文檔的目錄路徑,可用於http, server,location, if in location
server { ... root /data/www/vhost1; }
.8、location
location [ = | ~ | ~* | ^~ ] uri{ ... }
=:對URI做精確匹配;
^~:對URI的最左邊部分做匹配檢查,不區分字符大小寫
~:對URI做正則表達式模式匹配,區分字符大小寫
~*:對URI做正則表達式模式匹配,不區分字符大小寫
不帶符號:匹配起始於此uri的所有的uri
匹配優先級從高到低:=, ^~, ~/~*, 不帶符號
location @name { ... }
location是重點,可以定義復雜的邏輯關系,或者實現身份驗證,重定向等, 後面跟URL,根據URL做相應的控制,匹配到相應的url後做什麽操作, 這個相當於條件判斷
在一個server中location配置段可存在多個,用於實現從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
.9、alias
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
區分alias和root例子:
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/右側的/
.10、index
index file ...;
指定默認網頁資源,註意:ngx_http_index_module模塊
.11、error_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代碼,防止客戶端訪問該網頁發生錯誤代碼的時候被劫持
.12、try_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 定義客戶端請求的相關配置
.13、keepalive_timeout
keepalive_timeout timeout [header_timeout];
設定保持連接超時時長,0表示禁止長連接,默認為75s,可以調整短點。
.14、keepalive_requests
keepalive_requests number;
在一次長連接上所允許請求的資源的最大數量,默認為100
.15、keepalive_disable
keepalive_disable none | browser ...
對哪種瀏覽器禁用長連接
.16、send_timeout
send_timeout time;
向客戶端發送響應報文的超時時長,此處是指兩次寫操作之間的間隔時長,而非整個響應過程的傳輸時長
.17、client_body_buffer_size
client_body_buffer_size size;
用於接收每個客戶端請求報文的body部分的緩沖區大小;默認為16k;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置。註意,這裏是接收,不是下發數據,上傳文件到該網站,才看得到效果
.18、client_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級目錄占1位16進制,即2^4=16個目錄0-f
2 2級目錄占2位16進制,即2^8=256個目錄00-ff
2 3級目錄占2位16進制,即2^8=256個目錄00-ff
2.5 對客戶端進行限制的相關配置
.19、limit_rate
limit_rate rate;
限制響應給客戶端的傳輸速率,單位是bytes/second,默認值0表示無限制
.20、limit_except
limit_except method ... { ... },僅用於location
限制客戶端使用除了指定的請求方法之外的其它方法
method:GET, HEAD, POST, PUT, DELETE,MKCOL, COPY, MOVE,OPTIONS, PROPFIND,PROPPATCH, LOCK, UNLOCK, PATCH
location { limit_except GET { allow 192.168.1.0/24; deny all; } }
除了GET和HEAD 之外其它方法僅允許192.168.1.0/24網段主機使用
2.6 文件操作優化的配置
.21、aio
aio on | off | threads[=pool];是否啟用aio功能,默認是on
.22、directio
directio size | off;一般是異步
是否同步(直接)寫磁盤,而非寫緩存,在Linux主機啟用O_DIRECT標記,則文件大於等於給定大小時使用,例如directio 4m
.23、open_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_uses為3,表示在10分鐘內訪問低於3次表示非活動的,該文件就不會被緩存,會被清空
.24、open_file_cache_errors
open_file_cache_errors on | off;
是否緩存查找時發生錯誤的文件一類的信息,默認值為off
.25、open_file_cache_min_uses
open_file_cache_min_uses number;
open_file_cache指令的inactive參數指定的時長內,至少被命中此處指定的次數方可被歸類為活動項,默認值為1
.26、open_file_cache_valid
open_file_cache_valid time;
緩存項有效性的檢查頻率,默認值為60s
本文出自 “陽光運維” 博客,請務必保留此出處http://ghbsunny.blog.51cto.com/7759574/1977227
Nginx 之 http配置段介紹