用HTTP核心模塊配置一個(gè)靜態(tài)Web服務(wù)器
靜態(tài)Web服務(wù)器的主要功能由ngx_http_core_module模塊實(shí)現(xiàn),當(dāng)然冗茸,一個(gè)完整的靜態(tài)Web服務(wù)器還有許多功能是由其他HTTP模塊實(shí)現(xiàn)席镀。
http {
gzip on;
upstream {
}
server {
listen localhost:80;
localtion /webstatic {
if {
}
root /opt/webresource;
}
}
}
所有的HTTP配置項(xiàng)都必須直屬于http塊匹中、location塊愉昆、upstream塊或if塊等职员。
1 虛擬主機(jī)與請(qǐng)求的分發(fā)
在nginx.conf中可以按照server_name并通過(guò)server塊來(lái)定義虛擬主機(jī),每個(gè)server塊就是一個(gè)虛擬主機(jī)跛溉,它只處理與之對(duì)應(yīng)主機(jī)域名請(qǐng)求焊切。這樣,一臺(tái)服務(wù)器上的Nginx就能以不同的方式處理訪問不同主機(jī)域名的HTTP請(qǐng)求了芳室。
(1) 監(jiān)聽端口
語(yǔ)法 :listen address:port [default_server | [backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on|off] | ssl ]];
默認(rèn) :listen 80;
配置塊 :server;
listen參數(shù)決定Nginx服務(wù)器如何監(jiān)聽端口专肪。在ip地址和端口后,還可以添加其他參數(shù)堪侯,例如:
listen 443 default_server ssl;
listen 127.0.0.1 accept_filter=dataready backlog=1024;
- default_server:將所在的server塊作為整個(gè)Web服務(wù)的默認(rèn)server塊嚎尤。當(dāng)一個(gè)請(qǐng)求無(wú)法匹配配置文件中的所有主機(jī)域名時(shí),就會(huì)選擇默認(rèn)的虛擬主機(jī)伍宦。
- backlog =num:表示TCP中backlog隊(duì)列的大小芽死,默認(rèn)為-1.
- defered:設(shè)置該參數(shù)后,若用戶發(fā)起建立連接請(qǐng)求次洼,并且完成了TCP三次握手关贵,內(nèi)核也不會(huì)為了這次的連接調(diào)度worker進(jìn)程來(lái)處理,只有用戶真的發(fā)送請(qǐng)求數(shù)據(jù)時(shí)卖毁,內(nèi)核才會(huì)喚醒worker進(jìn)程處理這個(gè)連接揖曾。這個(gè)參數(shù)適用于大并發(fā)的情況,它減輕了worker進(jìn)程的負(fù)擔(dān)亥啦。
- accept_filter:設(shè)置過(guò)濾器
- bind:綁定端口/地址對(duì)炭剪。
- ssl:在當(dāng)前監(jiān)聽的端口上建立的連接必須基于SSL協(xié)議。
(2) 主機(jī)名稱
語(yǔ)法 :server_name name [...];
默認(rèn) :server_name "";
配置塊 :server;
在開始處理一個(gè)HTTP請(qǐng)求時(shí)翔脱,Nginx會(huì)取出header頭中的Host奴拦,與每個(gè)server中的server_name進(jìn)行匹配,以決定到底由哪一個(gè)server塊來(lái)處理這個(gè)請(qǐng)求碍侦。有可能一個(gè)Host與多個(gè)server_name都匹配粱坤,這時(shí)就會(huì)根據(jù)匹配優(yōu)先級(jí)來(lái)選擇實(shí)際處理的server塊。
優(yōu)先級(jí)如下:
首先選擇所有字符串完全匹配的server_name瓷产,如www.test.com
其次選擇通配符在前面的server_name站玄,如*.test.com
再次選擇通配符在后面的server_name,如www.test.*
最后選擇使用正則表達(dá)式才匹配的server_name濒旦,如~^.test.com$
如果Host與所有的server_name都不匹配株旷,將會(huì)按下列順序選擇處理的server塊:
優(yōu)先選擇在listen配置項(xiàng)后加入[default_server]的server塊
找到匹配listen端口的第一個(gè)server塊
(3) server_names_hash_bucket_size
語(yǔ)法 :server_names_hash_bucket_size size;
默認(rèn) :server_names_hash_bucket_size 32|64|128;
配置塊 :http、server、location;
為了提高快速尋找到響應(yīng)server_name的能力晾剖,Nginx適應(yīng)散列表來(lái)存儲(chǔ)server_name锉矢。server_names_hash_bucket_size設(shè)置了每個(gè)散列桶占用的內(nèi)存大小。
(4) server_names_hash_max_size
語(yǔ)法 :server_names_hash_max_size size;
默認(rèn) :server_names_hash_max_size 512;
配置塊 :http齿尽、server沽损、location;
server_names_hash_max_size會(huì)影響散列表的沖突率。
(5) 重定向主機(jī)名稱的處理
語(yǔ)法 :server_name_in_redirect on | off;
默認(rèn) :server_name_in_redirect on ;
配置塊 :http循头、server或者location;
配合server_name使用绵估,打開時(shí),表示在重定向請(qǐng)求時(shí)會(huì)使用server_name里配置的第一個(gè)主機(jī)名代替原先請(qǐng)求中的Host頭部卡骂;關(guān)閉時(shí)国裳,維持原請(qǐng)求本身的Host頭部。
(6) location
語(yǔ)法 :location [=|~|~*|^~|@] /uri/{...}
配置塊 :server;
匹配規(guī)則:
- =表示把URI作為字符串全跨,以便與參數(shù)中的uri做完全匹配
- ~表示匹配URI時(shí)是字母大小寫敏感的
- ~*表示匹配URI時(shí)忽略字母大小寫問題
- ^~表示匹配URI時(shí)只需要其前半部分與uri參數(shù)匹配即可
- @表示僅用于Nginx服務(wù)內(nèi)部請(qǐng)求之間的重定向
location = / {
# 只有當(dāng)用戶請(qǐng)求是/ 時(shí)缝左,才會(huì)使用該location下的配置
}
location ^~ /images/ {
# 以/images/開頭的請(qǐng)求都會(huì)匹配上
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配以.gif .jpg .jpeg結(jié)尾的請(qǐng)求
}
location / {
# 可以匹配所有請(qǐng)求
}
2 文件路徑的定義
(1) 以root方式設(shè)置資源路徑
語(yǔ)法 :root path;
默認(rèn) :root html;
配置塊 :http、server浓若、location渺杉、if;
location /download/ {
root /opt/web/html/;
}
請(qǐng)求URI是download/index/test.html,web服務(wù)器將會(huì)返回/opt/web/html/download/index/test.html
(2) 以alias方式設(shè)置資源路徑
語(yǔ)法 :alias path;
配置塊 :location;
與root的不用點(diǎn)在于location后的uri參數(shù)挪钓。下面兩個(gè)配置是等價(jià)的:
location /conf {
alias /usr/local/nginx/conf;
}
location /conf {
root /usr/local/nginx/;
}
(3) 訪問首頁(yè)
語(yǔ)法 :index file ...;
默認(rèn) :index index.html;
配置塊 :http少办、server、location;
location / {
root path;
index /index.html /index.php
}
(4) 根據(jù)HTTP返回碼重定向頁(yè)面
語(yǔ)法 :error_page code[code...] [=|=answer-code] uri|@named_location;
配置塊 :http诵原、server、location挽放、if;
error_page 404 /404.html;
error_page 502 503 504 /50x.html;
error_page 403 http://example.com/forbidden.html;
error_page 404 = @fetch;
雖然重定向了URI绍赛,但返回的HTTP錯(cuò)誤碼還是與原來(lái)的相同〖瑁可以通過(guò)“=”來(lái)更改返回的錯(cuò)誤碼吗蚌,例如:
error_page 404 =200 /empty.gif;
error_page 404 =403 /forbidden.gif;
也可以不指定確切的返回錯(cuò)誤碼,而是由重定向后實(shí)際處理的真實(shí)結(jié)果來(lái)決定纯出,這時(shí)蚯妇,只要把“=”后面的錯(cuò)誤碼去掉即可,例如:
error_page 404 = /empty.gif;
如果不想修改URI暂筝,只是像讓這樣的請(qǐng)求重定向到另一個(gè)location中進(jìn)行處理箩言,那么可以這樣設(shè)置:
location / {
error_page 404 @fallback;
}
location @fallback {
proxy_pass http://backend;
}
(5) 是否允許遞歸使用error_page
語(yǔ)法 :recursive_error_pages [on | off];
默認(rèn) :recursive_error_pages off;
配置塊 :http、server焕襟、location;
(6) try_files
語(yǔ)法 :try_files path1 [path2] uri;
配置塊 :server陨收、location;
嘗試按照順序訪問每一個(gè)path,如果可以有效讀取,就直接向用戶返回這個(gè)path對(duì)應(yīng)的文件务漩,結(jié)束請(qǐng)求拄衰,否則繼續(xù)向下訪問。如果所有的path都找不到有效的文件饵骨,就重定向到最后的參數(shù)uri上翘悉。
3 內(nèi)存及磁盤資源的分配
(1) HTTP包體只存儲(chǔ)到磁盤文件中
語(yǔ)法 :client_body_in_file_only on | clean | off;
默認(rèn) :client_body_in_file_only off;
配置塊 :http、server居触、location;
配置為非off時(shí)妖混,用戶請(qǐng)求中的HTTP包體一律存儲(chǔ)到磁盤文件中。當(dāng)請(qǐng)求結(jié)束時(shí)饼煞,如果配置為on源葫,則這個(gè)文件不會(huì)被刪除;如果配置為clean砖瞧,則會(huì)刪除該文件息堂。
(2) HTTP包體盡量寫入到一個(gè)內(nèi)存buffer中
語(yǔ)法 :client_body_in_single_buffer on | off;
默認(rèn) :client_body_in_single_buffer off;
配置塊 :http、server块促、location;
用戶請(qǐng)求中的HTTP包體一律存儲(chǔ)到內(nèi)存buffer中荣堰。如果包體大小超過(guò)了client_body_buffer_size 設(shè)置的值,包體還是會(huì)寫入到磁盤文件中竭翠。
(3) 存儲(chǔ)HTTP頭部的內(nèi)存buffer大小
語(yǔ)法 :client_header_buffer_size size;
默認(rèn) :client_header_buffer_size 1k;
配置塊 :http振坚、server;
定義了正常情況下Nginx接收用戶請(qǐng)求中HTTP header部分時(shí)分配的內(nèi)存buffer大小。有時(shí)斋扰,請(qǐng)求中的HTTP header部分可能超過(guò)這個(gè)大小渡八,這時(shí)large_client_header_buffers 定義的buffer將會(huì)生效。
(4) 存儲(chǔ)超大HTTP頭部的內(nèi)存buffer大小
語(yǔ)法 :large_client_header_buffers number size;
默認(rèn) :large_client_header_buffers 4 8k;
配置塊 :http传货、server;
定義了Nginx接收一個(gè)超大HTTP頭部請(qǐng)求的buffer個(gè)數(shù)和每個(gè)buffer的大小屎鳍。
(5) 存儲(chǔ)HTTP包體的內(nèi)存buffer大小
語(yǔ)法 :client_body_buffer_size size;
默認(rèn) :client_body_buffer_size 8k/16k;
配置塊 :http、server问裕、location;
(6) HTTP包體的臨時(shí)存放目錄
語(yǔ)法 :client_body_temp_path dir-path[level[level[level]]];
默認(rèn) :client_body_temp_path client_body_temp;
配置塊 :http逮壁、server、location;
(7) connection_pool_size
語(yǔ)法 :connection_pool_size size;
默認(rèn) :connection_pool_size 256;
配置塊 :http粮宛、server;
Nginx對(duì)于每個(gè)建立成功的TCP連接都會(huì)預(yù)先分配一個(gè)內(nèi)存池窥淆,上面的size配置項(xiàng)將制定這個(gè)內(nèi)存池的初始大小,用于減少內(nèi)核對(duì)于小塊內(nèi)存的分配次數(shù)巍杈。需慎重設(shè)置忧饭,因?yàn)楦蟮膕ize會(huì)使服務(wù)器的內(nèi)存消耗的更多,而更小的size會(huì)引發(fā)更多的內(nèi)存分配次數(shù)秉氧。
(8) request_pool_size
語(yǔ)法 :connection_pool_size size;
默認(rèn) :connection_pool_size 4k;
配置塊 :http眷昆、server;
4 網(wǎng)絡(luò)連接的設(shè)置
(1) 讀取HTTP頭部的超時(shí)時(shí)間
語(yǔ)法 :client_header_timeout time;
默認(rèn) :client_header_timeout 60;
配置塊 :http、server、location;
客戶端與服務(wù)器建立連接后將開始接收HTTP頭部亚斋,在這個(gè)過(guò)程中作媚,如果超過(guò)一定的時(shí)間間隔還沒有讀取到客戶端發(fā)來(lái)的字節(jié),則認(rèn)為超時(shí)帅刊,并向客戶端返回"Request timed out"響應(yīng)纸泡。
(2) 讀取HTTP包體的超時(shí)時(shí)間
語(yǔ)法 :client_body_timeout time;
默認(rèn) :client_body_timeout 60;
配置塊 :http、server赖瞒、location;
與配置client_header_timeout 類似女揭,只不過(guò)這個(gè)超時(shí)時(shí)間只在讀取HTTP包體時(shí)才有效。
(3) 發(fā)送響應(yīng)的超時(shí)時(shí)間
語(yǔ)法 :send_timeout time;
默認(rèn) :send_timeout 60;
配置塊 :http栏饮、server吧兔、location;
(4) reset_timeout_connection
語(yǔ)法 :reset_timeout_connection on | off;
默認(rèn) :reset_timeout_connection off;
配置塊 :http、server袍嬉、location;
(5) lingering_close
語(yǔ)法 :lingering_close off | on | always;
默認(rèn) :lingering_close on ;
配置塊 :http境蔼、server、location;
(6) lingering_time
語(yǔ)法 :lingering_time time;
默認(rèn) :lingering_time 30s;
配置塊 :http伺通、server箍土、location;
(7) lingering_timeout
語(yǔ)法 :lingering_timeout time;
默認(rèn) :lingering_timeout 5s;
配置塊 :http、server罐监、location;
(8) 對(duì)某些瀏覽器禁用keepalive功能
語(yǔ)法 :keepalive_disable [msie6 | safari | none];
默認(rèn) :keepalive_disable msie6 safari ;
配置塊 :http吴藻、server、location;
(9) keepalive超時(shí)時(shí)間
語(yǔ)法 :keepalive_timeout time;
默認(rèn) :keepalive_timeout 75;
配置塊 :http弓柱、server沟堡、location;
(10) 一個(gè)keepalive長(zhǎng)連接上允許承載的請(qǐng)求最大數(shù)
語(yǔ)法 :keepalive_requests n;
默認(rèn) :keepalive_requests 100;
配置塊 :http、serve矢空、locationr;
(11) tcp_nodelay
語(yǔ)法 :tcp_nodelay on | off;
默認(rèn) :tcp_nodelay on ;
配置塊 :http弦叶、server、location;
(12) tcp_nopush
語(yǔ)法 :tcp_nopush on | off;
默認(rèn) :tcp_nopush off;
配置塊 :http妇多、server、location;
打開后燕侠,將會(huì)在發(fā)送響應(yīng)時(shí)把整個(gè)響應(yīng)包頭放到一個(gè)TCP包中發(fā)送者祖。
5 MIME類型的設(shè)置
(1) MIME type與文件擴(kuò)展的映射
語(yǔ)法 :types {...};
配置塊 :http、server绢彤、location;
(2) 默認(rèn)MIME type
語(yǔ)法 :default_type MIME_type;
默認(rèn) :default_type text/plain;
配置塊 :http七问、server、location;
(3) types_hash_bucket_size
語(yǔ)法 :types_hash_bucket_size size;
默認(rèn) :types_hash_bucket_size 32|64|128;
配置塊 :http茫舶、server械巡、location;
(4) types_hash_max_size
語(yǔ)法 :types_hash_max_size size;
默認(rèn) :types_hash_max_size 1024;
配置塊 :http、server、location;
6 對(duì)客戶端請(qǐng)求的限制
(1) 按HTTP方法名限制用戶請(qǐng)求
語(yǔ)法 :limit_except method ...{...};
配置塊 :location;
Nginx通過(guò)limit_except后面指定的方法類型名來(lái)限制用戶請(qǐng)求讥耗。方法名可取值:GET有勾、HEAD、POST古程、PUT蔼卡、DELETE、MKCOL挣磨、COPY雇逞、MOVE、OPTIONS等茁裙,例如:
limit_except GET {
allow 192.168.1.0/32;
deny all;
}
(2) HTTP請(qǐng)求包體的最大值
語(yǔ)法 :client_max_body_size size;
默認(rèn) :client_max_body_size 1m;
配置塊 :http塘砸、server、location;
瀏覽器在發(fā)送含有較大HTTP包體的請(qǐng)求時(shí)晤锥,其頭部會(huì)有一個(gè)Content-Length字段掉蔬,client_max_body_size 是用來(lái)限制Content-Length所示值的大小的。
(3) 對(duì)請(qǐng)求的限速
語(yǔ)法 :limit_rate speed;
默認(rèn) :limit_rate 0;
配置塊 :http查近、server眉踱、location、if;
此配置是對(duì)客戶端請(qǐng)求限制每秒傳輸?shù)淖止?jié)數(shù)霜威。默認(rèn)參數(shù)為0谈喳,表示不限速。
(4) limit_rate_after
語(yǔ)法 :limit_rate_after time;
默認(rèn) :limit_rate_after 1m;
配置塊 :http戈泼、server婿禽、location、if;
7 文件操作的優(yōu)化
(1) sendfile系統(tǒng)調(diào)用
語(yǔ)法 :sendfile on| off;
默認(rèn) :sendfile off;
配置塊 :http大猛、server扭倾、location;
(2) AIO系統(tǒng)調(diào)用
語(yǔ)法 :aio on| off;
默認(rèn) :laio off;
配置塊 :http、server挽绩、location;
(3) directio
語(yǔ)法 :directio size | off;
默認(rèn) :directio off;
配置塊 :http膛壹、server、location;
(4) directio_alignment
語(yǔ)法 :directio_alignment size;
默認(rèn) :directio_alignment 512;
配置塊 :http唉堪、server模聋、location;
(5) 打開文件緩存
語(yǔ)法 :open_file_cache max=N[inactive=time] | off;
默認(rèn) :open_file_cache off;
配置塊 :http、server唠亚、location;
(6) 是否緩存打開文件的錯(cuò)誤信息
語(yǔ)法 :open_file_cache_errors on | off;
默認(rèn) :open_file_cache_errors off;
配置塊 :http链方、server、location;
(7) 不被淘汰的最小訪問次數(shù)
語(yǔ)法 :open_file_cache_min_uses number;
默認(rèn) :open_file_cache_min_uses 1;
配置塊 :http灶搜、server祟蚀、location;
(8) 檢查緩存中元素有效性的頻率
語(yǔ)法 :open_file_cache_valid time;
默認(rèn) :open_file_cache_valid 60s;
配置塊 :http工窍、server、location;
8 對(duì)客戶端請(qǐng)求的特殊處理
(1) 忽略不合法的HTTP頭部
語(yǔ)法 :ignore_invalid_headers on| off;
默認(rèn) :ignore_invalid_headers on;
配置塊 :http前酿、server;
(2) HTTP頭部是否允許下劃線
語(yǔ)法 :underscores_in_headers on| off;
默認(rèn) :underscores_in_headers off;
配置塊 :http患雏、server;
默認(rèn)關(guān)閉,便是HTTP頭部的名稱中不允許帶下劃線“_”薪者。
(3) 對(duì)if_modified_since頭部的處理策略
語(yǔ)法 :if_modified_since [off | exact | before];
默認(rèn) :if_modified_since exact ;
配置塊 :http纵苛、server、location;
(4) 文件未找到時(shí)是否記錄到error日志
語(yǔ)法 :log_not_found on | off;
默認(rèn) :log_not_found on ;
配置塊 :http言津、server攻人、location;
(5) merge_slashes
語(yǔ)法 :merge_slashes on| off;
默認(rèn) :merge_slashes on ;
配置塊 :http、server悬槽、location;
是否合并相鄰的“/”怀吻,例如,//test///a.txt初婆,在配置為on時(shí)蓬坡,會(huì)將其匹配為/test/a.txt
(6) DNS解析地址
語(yǔ)法 :resolver address...;
配置塊 :http、server磅叛、location;
(7) DNS解析的超時(shí)時(shí)間
語(yǔ)法 :resolver_timeout time;
默認(rèn) :resolver_timeout 30s;
配置塊 :http屑咳、server、location;
(8) 返回錯(cuò)誤頁(yè)面時(shí)是否在server中注明Nginx版本
語(yǔ)法 :server_tokens on| off;
默認(rèn) :server_tokens on;
配置塊 :http弊琴、server兆龙、location;