|
一、研究Nginx前的準(zhǔn)備工作 1.Nginx特點(diǎn):更快、高擴(kuò)展性、高可靠性、低內(nèi)存消耗、單機(jī)支持10萬以上的并發(fā)連接、熱部署、最自由的BSD許可協(xié)議 2.退出nginx nginx -s stop nginx -s quit
3.日志回滾:nginx -s reopen 二、Nginx的配置 A.運(yùn)行中的Nginx進(jìn)程間的關(guān)系 一般情況下,worker進(jìn)程的數(shù)量與服務(wù)器上的CPU數(shù)量相等
B.Nginx服務(wù)的基本配置 1.用于調(diào)試進(jìn)程和定位問題的配置項(xiàng) daemon on | off;:是否以守護(hù)進(jìn)程方式運(yùn)行Nginx,默認(rèn)on master_process on | off;:是否以master/worker方式工作,默認(rèn)on error_log pathfile level;:error日志的設(shè)置 debug_points [stop|abort]:幫助用戶跟蹤調(diào)試nginx,一般不用 debug_connection [IP | CIDR]:僅對(duì)指定的客戶端輸出debug級(jí)別的日志,對(duì)定位高并發(fā)請(qǐng)求下發(fā)生的問題有用,需要configure時(shí)加入?yún)?shù)--with-debug worker_rlimit_core size;:限制coredump核心轉(zhuǎn)儲(chǔ)文件的大小 working_directory path;:指定coredump文件生成的目錄
2.正常運(yùn)行的配置項(xiàng) evn VAR|VAR=VALUE:讓用戶直接設(shè)置操作系統(tǒng)上的環(huán)境變量 include pathfile;:嵌入其他配置文件 pid path/file;pid文件的路徑 user username [groupname];:Nginx worker進(jìn)程運(yùn)行的用戶及用戶組 worker_rlimit_nofile limit;:指定Nginx worker進(jìn)程可以打開的最大句柄描述符個(gè)數(shù) worker_rlimit_sigpending limit;:限制信號(hào)隊(duì)列
3.優(yōu)化性能的配置 worker_processes number;:定義worker進(jìn)程的個(gè)數(shù) worder_cpu_affinity cpumask [cpumask...];:綁定worker進(jìn)程到指定的CPU內(nèi)核 ssl_engine device;:SSL硬件加速 timer_resolution t;:系統(tǒng)調(diào)用gettimeofday的執(zhí)行頻率 worker_priority nice;:worker進(jìn)程優(yōu)先級(jí)設(shè)置
4.事件類配置項(xiàng) accept_mutex [on | off];:是否打開accept鎖,可以讓多個(gè)worker進(jìn)程輪流地、序列化地與新的客戶端建立TCP連接 lock_file path/file;:lock文件的路徑 accept_mutex_delay ms;:使用accept鎖后到真正建立連接之間的延遲時(shí)間 multi_accept on | off;:批量建立新連接 use [kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];:選擇事件模型 worker_connections number;:每個(gè)worker的最大連接數(shù)
C.用HTTP核心模塊配置一個(gè)靜態(tài)Web服務(wù)器 1.虛擬主機(jī)與請(qǐng)求的分發(fā) listen address:port[default|default_server|[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|bind|ipv6only=[on|off]|ssl]];:監(jiān)聽端口,配置在server塊 server_name name[...];:主機(jī)名稱,配置在server塊 server_names_hash_bucket_size size;:設(shè)置每個(gè)散列表占用的內(nèi)存大小,nginx使用散列表來存儲(chǔ)server_name server_names_hash_max_size size;:影響散列表的沖突率,越大消耗的內(nèi)存越多,但散列key的沖突則會(huì)降低,檢索速度也快 server_name_in_redirect on|off;:重定向主機(jī)名稱的處理 location [=|~|~*|^~|@]/uri/{...}:根據(jù)請(qǐng)求的URI來匹配進(jìn)入location{}塊中的配置來處理用戶請(qǐng)求,配置在server塊
2.文件路徑的定義 root path;:以root方式設(shè)置資源路徑 alias path;:別名,將uri映射到真實(shí)的磁盤文件上,只能在location塊中 index file ...;:訪問首頁 error_page code[code...][=|=answer-code]uri|@named_location:根據(jù)HTTP返回碼重定向頁面 recursive_error_pages [on|off];:是否允許遞歸使用error_page try_files path1[path2]uri;:嘗試按照順序訪問每一個(gè)path
3.內(nèi)存及磁盤資源的分配 client_body_in_file_only on|clean|off;:HTTP包體只存儲(chǔ)到磁盤文件中 client_body_in_single_buffer on|off;:HTTP包體盡量寫入到一個(gè)內(nèi)存buffer中 client_header_buffer_size size;:存儲(chǔ)HTTP頭部的內(nèi)存buffer大小 large_client_header_buffers number size;:定義了Nginx接收一個(gè)超大HTTP頭部請(qǐng)求的buffer個(gè)數(shù)和每個(gè)buffer的大小 client_body_buffer_size size;:存儲(chǔ)HTTP包體的內(nèi)存buffer大小 client_body_temp_path dir-path[level1[level2[level3]]];:HTTP包體的臨時(shí)存放目錄 connection_pool_size size;:Nginx對(duì)于每個(gè)建立成功的TCP連接會(huì)預(yù)先分配一個(gè)內(nèi)存池,這個(gè)配置將指定個(gè)內(nèi)存池的初始大小,用于減少內(nèi)核對(duì)于小塊內(nèi)存的分配次數(shù) request_pool_size size;:Nginx會(huì)為每個(gè)請(qǐng)求分配一個(gè)內(nèi)存池,配置將指定這個(gè)內(nèi)存池的初始大小
4.網(wǎng)絡(luò)連接的設(shè)置 client_header_timeout time:讀取HTTP頭部的超時(shí)時(shí)間 client_body_timeout time:讀取HTTP包體的超時(shí)時(shí)間 send_timeout time;:發(fā)送響應(yīng)的超時(shí)時(shí)間 reset_timeout_connection on|off;:連接超時(shí)后將通過向客戶端發(fā)送RST包來直接重置連接,這個(gè)選項(xiàng)打開后,Nginx將直接向用戶發(fā)送RST重置包,不再等待用戶應(yīng)答,直接釋放緩存 lingering_close off|on|always;:控制Nginx關(guān)閉用戶連接的方式 lingering_time time;:對(duì)上傳大文件很有用,當(dāng)超過時(shí)間后,不管是否仍在上傳,都會(huì)關(guān)閉連接 ligering_timeout time;:在lingering_close生效后,在關(guān)閉連接前,會(huì)檢測是否有用戶發(fā)送的數(shù)據(jù)到達(dá)服務(wù)器,如果超過時(shí)間后還沒有數(shù)據(jù)可讀,就直接關(guān)閉連接 keepalive_disable [msie6|safari|none]...:對(duì)某些瀏覽器禁用keepalive功能 keepalive_timeout time time:keepalive超時(shí)時(shí)間 keepalive_requests n;:一個(gè)keepalive長連接上允許承載的請(qǐng)求最大數(shù) tcp_nodelay on|off;:確定對(duì)keepalive連接是否使用TCP_NODELAY選項(xiàng) tcp_nopush on|off;:在打開sendfile選項(xiàng)時(shí),確定是否開啟FreeBSD系統(tǒng)上的TCP_NOPUSH或Linux系統(tǒng)上的TCP_CORK功能
5.MIME類型的設(shè)置 type{...};:MIME type與文件擴(kuò)展的映射 default_type MIME-type;:默認(rèn)MIME type types_hash_bucket_size size;:設(shè)置散列表占用的內(nèi)存大小 types_hash_max_size size;:影響散列表的沖突率
6.對(duì)客戶端請(qǐng)求的限制 limit_except method...{...}:按HTTP方法名限制用戶請(qǐng)求 client_max_body_size size;:HTTP請(qǐng)求包體的最大值 limit_rate speed;:對(duì)客戶端請(qǐng)求限制每秒傳輸?shù)淖止?jié)數(shù) limit_rate_after time;:表示nginx向客戶端發(fā)磅的響應(yīng)長度超過limit_rate_after后才開始限速
7.文件操作的優(yōu)化 sendfile on|off;:啟用sendfile系統(tǒng)調(diào)用來發(fā)送文件 aio on|off;:表示是否在FreeBSD或Linux系統(tǒng)上啟用內(nèi)核級(jí)別的異步I/O功能,與sendfile是互斥的 directio size|off;:在FreeBSD和Linux系統(tǒng)上使用O_DIRECT選項(xiàng)去讀取文件,與sendfile互斥 directio_alignment size;:與directio配合,指定directio方式讀取文件時(shí)的對(duì)齊方式 open_file_cache max=N[inactive=time]|off;:打開文件緩存 open_file_cache_errors on|off;:是否緩存打開文件錯(cuò)誤的信息 open_file_cache_min_uses number;:不被淘汰的最小訪問次數(shù),與open_file_cache的inactive配合使用,如果超過了,則不會(huì)被淘汰出緩存 open_file_cache_valid time;:檢驗(yàn)緩存中元素有效性的頻率
8.對(duì)客戶端請(qǐng)求的特殊處理 ignore_invalid_headers on|off;:忽略不合法的HTTP頭部 underscores_in_headers on|off;:HTTP頭部是否允許下劃線 if_modified_since [off|exact|before];:對(duì)If-Modified-Since頭部的處理策略 log_not_found on|off;:文件未找到時(shí)是否記錄到error日志 merge_slashes on|off;:是否合并相鄰的/ resolver address...;:廢黜DNS名字解析服務(wù)器的地址 resolver_timeout time;:DNS解析超時(shí)時(shí)間 server_tokens on|off;:返回錯(cuò)誤頁面時(shí)是否在Server中注明Nginx版本
D.用HTTP proxy module配置一個(gè)反向代理服務(wù)器 1.負(fù)載均衡的基本配置 upstream name {...}:定義了一個(gè)上游服務(wù)器的集群,便于反向代理中的proxy_pass使用,配置在http塊 server name [weight=number,max_fails=number,fail_timeout=time,down,backup]:指定一臺(tái)上游服務(wù)器的名字,可以是域名、ip地址端口、UNIX句柄等,配置在upstream塊中 ip_hash;:根據(jù)客戶IP地址將請(qǐng)求始終落在固定的一臺(tái)上游服務(wù)器中,與weight配置不可同時(shí)使用
2.反向代理的基本配置 proxy_pass URL;:將當(dāng)前請(qǐng)求反向代理到URL參數(shù)指定的服務(wù)器上,URL可使用是域名、ip地址端口、UNIX句柄或upstream塊,配置在location、if塊中 proxy_set_header Host $host;:轉(zhuǎn)發(fā)請(qǐng)求中的Host頭,默認(rèn)proxy_pass不轉(zhuǎn)發(fā) proxy_method method;:轉(zhuǎn)發(fā)時(shí)的協(xié)議方法名 proxy_hide_header the_header;:可以指定哪些HTTP頭部字段不能被轉(zhuǎn)發(fā) proxy_pass_header the_header;:與proxy_hide_header相反 proxy_pass_request_body on|off;:確定是否向上游服務(wù)器發(fā)送HTTP包體部分 proxy_pass_request_headers on|off;:確定是否轉(zhuǎn)發(fā)HTTP頭部 proxy_redirect [default|off|redirect replacement];:當(dāng)上游服務(wù)器返回重定向或刷新請(qǐng)求時(shí),可以重設(shè)HTTP頭部的location或refresh字段 proxy_next_upstream [ errpo,timeout,invalid_header,http500,http_502,http503,http_504,http_404,off]:當(dāng)一臺(tái)上游服務(wù)器轉(zhuǎn)發(fā)請(qǐng)求出現(xiàn)錯(cuò)誤時(shí),繼續(xù)換一臺(tái)處理這個(gè)請(qǐng)求
三、開發(fā)一個(gè)簡單的HTTP模塊 1.整型的封裝:ngx_int_t、ngx_uint_t 2.字符串:ngx_str_t 3.鏈表容器:ngx_list_t 4.key/value對(duì):ngx_table_elt_t 5.緩沖區(qū):ngx_buf_t 6.與ngx_buf_t配合使用的鏈接結(jié)構(gòu):ngx_chain_t 四、配置、error日志和請(qǐng)求上下文 五、訪問第三方服務(wù) 1.upstream可以保證在與第三方服務(wù)器交互時(shí)(包括三次握手建立TCP連接、發(fā)送請(qǐng)求、接收響應(yīng)、四次握手關(guān)閉TCP連接等)不會(huì)阻塞Nginx進(jìn)程處理其他請(qǐng)求 2.subrequest是分解復(fù)雜請(qǐng)求的一種設(shè)計(jì)模式,最終也是基于upstream實(shí)現(xiàn)的 3.當(dāng)我們希望把第三方服務(wù)的內(nèi)容幾乎原封不動(dòng)地返回給用戶時(shí),一般使用upstream方式,可以非常高效地透傳HTTP;如果訪問第三方服務(wù)只是為了獲取某些信息,再依據(jù)這些信息來構(gòu)造 響應(yīng)并傳送給客戶,應(yīng)該使用subrequest方式 六、開發(fā)一個(gè)簡單的HTTP過濾模塊 七、Nginx提供的高級(jí)數(shù)據(jù)結(jié)構(gòu) 八、Nginx基礎(chǔ)架構(gòu) 九、事件模塊 十、HTTP框架的初始化 十一、HTTP框架的執(zhí)行流程 十二、upstream機(jī)制的設(shè)計(jì)與實(shí)現(xiàn) 十三、郵件代理模塊 十四、進(jìn)程間的通信機(jī)制 十五、變量 十六、slab共享內(nèi)存
|