Nginx簡(jiǎn)介
Nginx(發(fā)音同engine x)是一個(gè)異步框架的 Web 服務(wù)器俩檬,也可以用作反向代理
要糊,負(fù)載平衡器
和 HTTP 緩存
纲熏。該軟件由 Igor Sysoev 創(chuàng)建,并于2004年首次公開(kāi)發(fā)布锄俄。同名公司成立于2011年局劲,以提供支持。Nginx 是一款免費(fèi)的開(kāi)源軟件奶赠,根據(jù)類(lèi) BSD 許可證的條款發(fā)布鱼填。一大部分Web服務(wù)器使用 Nginx ,通常作為負(fù)載均衡器毅戈。[1]
Nginx的特點(diǎn)
-
更快:
- 單次請(qǐng)求會(huì)得到更快的響應(yīng)
- 在高并發(fā)環(huán)境下,Nginx比其他web服務(wù)器有更快的響應(yīng)
-
高擴(kuò)展性:
- nginx是基于模塊化設(shè)計(jì),由多個(gè)耦合度極低的模塊組成,因此具有很高的擴(kuò)展性苹丸。許多高流量的網(wǎng)站都傾向于開(kāi)發(fā)符合自己業(yè)務(wù)特性的定制模塊愤惰。
-
高可靠性:
- nginx的可靠性來(lái)自于其核心框架代碼的優(yōu)秀設(shè)計(jì),模塊設(shè)計(jì)的簡(jiǎn)單性谈跛;另外羊苟,官方提供的常用模塊都非常穩(wěn)定,每個(gè)worker進(jìn)程相對(duì)獨(dú)立感憾,master進(jìn)程在一個(gè)worker進(jìn)程出錯(cuò)時(shí)可以快速拉起新的worker子進(jìn)程提供服務(wù)蜡励。
-
低內(nèi)存消耗:
- 一般情況下,10000個(gè)非活躍的HTTP
Keep-Alive
連接在Nginx中僅消耗2.5MB的內(nèi)存阻桅,這是nginx支持高并發(fā)連接的基礎(chǔ)凉倚。 - 單機(jī)支持10萬(wàn)以上的并發(fā)連接:
理論上,Nginx 支持的并發(fā)連接上限取決于內(nèi)存嫂沉,10萬(wàn)遠(yuǎn)未封頂稽寒。
- 一般情況下,10000個(gè)非活躍的HTTP
-
熱部署:
- master 進(jìn)程與 worker 進(jìn)程的分離設(shè)計(jì),使得 Nginx 能夠提供熱部署功能趟章,即在 7x24 小時(shí)不間斷服務(wù)的前提下杏糙,升級(jí) Nginx 的可執(zhí)行文件。當(dāng)然蚓土,它也支持不停止服務(wù)就更新配置項(xiàng)宏侍,更換日志文件等功能。
-
最自由的 BSD 許可協(xié)議:
- 這是 Nginx 可以快速發(fā)展的強(qiáng)大動(dòng)力蜀漆。BSD 許可協(xié)議不只是允許用戶(hù)免費(fèi)使用 Nginx 谅河,它還允許用戶(hù)在自己的項(xiàng)目中直接使用或修改 Nginx 源碼,然后發(fā)布确丢。[2]
內(nèi)置變量參數(shù)詳解
$args # 請(qǐng)求中的參數(shù)值
$query_string # 同 $args
$arg_NAME # GET請(qǐng)求中NAME的值
$is_args # 如果請(qǐng)求中有參數(shù)绷耍,值為"?",否則為空字符串
$uri # 請(qǐng)求中的當(dāng)前URI(不帶請(qǐng)求參數(shù)鲜侥,參數(shù)位于$args)褂始,可以不同于瀏覽器傳遞的$request_uri的值,它可以通過(guò)內(nèi)部重定向剃毒,或者使用index指令進(jìn)行修改病袄,$uri不包含主機(jī)名,如"/foo/bar.html"赘阀。
$document_uri # 同 $uri
$document_root # 當(dāng)前請(qǐng)求的文檔根目錄或別名
$host # 優(yōu)先級(jí):HTTP請(qǐng)求行的主機(jī)名>"HOST"請(qǐng)求頭字段>- 符合請(qǐng)求的服務(wù)器名.請(qǐng)求中的主機(jī)頭字段益缠,如果請(qǐng)求中的主機(jī)頭不可用,則為服務(wù)器處理請(qǐng)求的服務(wù)器名稱(chēng)
$hostname # 主機(jī)名
$https # 如果開(kāi)啟了SSL安全模式基公,值為"on"幅慌,否則為空字符串。
$binary_remote_addr # 客戶(hù)端地址的二進(jìn)制形式轰豆,固定長(zhǎng)度為4個(gè)字節(jié)
$body_bytes_sent # 傳輸給客戶(hù)端的字節(jié)數(shù)胰伍,響應(yīng)頭不計(jì)算在內(nèi)齿诞;這個(gè)變量和Apache的mod_log_config模塊中的"%B"參數(shù)保持兼容
$bytes_sent # 傳輸給客戶(hù)端的字節(jié)數(shù)
$connection # TCP連接的序列號(hào)
$connection_requests # TCP連接當(dāng)前的請(qǐng)求數(shù)量
$content_length # "Content-Length" 請(qǐng)求頭字段
$content_type # "Content-Type" 請(qǐng)求頭字段
$cookie_name # cookie名稱(chēng)
$limit_rate # 用于設(shè)置響應(yīng)的速度限制
$msec # 當(dāng)前的Unix時(shí)間戳
$nginx_version # nginx版本
$pid # 工作進(jìn)程的PID
$pipe # 如果請(qǐng)求來(lái)自管道通信,值為"p"骂租,否則為"."
$proxy_protocol_addr # 獲取代理訪問(wèn)服務(wù)器的客戶(hù)端地址祷杈,如果是直接訪問(wèn),該值為空字符串
$realpath_root # 當(dāng)前請(qǐng)求的文檔根目錄或別名的真實(shí)路徑渗饮,會(huì)將所有符號(hào)連接轉(zhuǎn)換為真實(shí)路徑
$remote_addr # 客戶(hù)端地址
$remote_port # 客戶(hù)端端口
$remote_user # 用于HTTP基礎(chǔ)認(rèn)證- 服務(wù)的用戶(hù)名
$request # 代表客戶(hù)端的請(qǐng)求地址
$request_body # 客戶(hù)端的請(qǐng)求主體:此變量可在l- - ocation中使用但汞,將請(qǐng)求主體通過(guò)proxy_pass,fastcgi_pass互站,uwsgi_pass和scgi_pass傳遞給下一級(jí)的代理服務(wù)器
$request_body_file # 將客戶(hù)端請(qǐng)求主體保存在臨時(shí)文件中私蕾。文件處理結(jié)束后,此文件需刪除胡桃。如果需要之一開(kāi)啟此功能踩叭,需要設(shè)置client_body_in_fi- le_only。如果將次文件傳 給后端的代理服務(wù)器翠胰,需要禁用request body容贝,即設(shè)置proxy_pass_request_body off,fastcgi_pass_request_body - off之景,uwsgi_pass_request_body off嗤疯,or scgi_pass_request_body off
$request_completion # 如果請(qǐng)求成功,值為"OK"闺兢,如果請(qǐng)求未完成或者請(qǐng)求不是一個(gè)范圍請(qǐng)求的最后一部分,則為空
$request_filename # 當(dāng)前連接請(qǐng)求的文件路徑戏罢,由root或alias指令與URI請(qǐng)求生成
$request_length # 請(qǐng)求的長(zhǎng)度 (包括請(qǐng)求的地址屋谭,http請(qǐng)求頭和請(qǐng)求主體)
$request_method # HTTP請(qǐng)求方法,通常為"GET"或"POST"-
$request_time # 處理客戶(hù)端請(qǐng)求使用的時(shí)間,單位為秒龟糕,精度毫秒桐磁; - 從讀入客戶(hù)端的第一個(gè)字節(jié)開(kāi)始,直到把最后一個(gè)字符發(fā)送給客戶(hù)端后進(jìn)行日志寫(xiě)入為止讲岁。-
$request_uri # 這個(gè)變量等于包含一些客戶(hù)端請(qǐng)求參數(shù)的原始URI我擂,它無(wú)法修改,請(qǐng)查看$uri更改或重寫(xiě)URI缓艳,不包含主機(jī)名校摩,例如:"/cnphp/- test.php?arg=freemouse"
$scheme # 請(qǐng)求使用的Web協(xié)議,"http" 或 "https"
$server_addr # 服務(wù)器端地址阶淘,需要注意的是:為了避免訪問(wèn)linux系統(tǒng)內(nèi)核衙吩,應(yīng)將ip地址提前設(shè)置在配置文件中
$server_name # 服務(wù)器名
$server_port # 服務(wù)器端口
$server_protocol # 服務(wù)器的HTTP版本,通常為 "HTTP/1.0" 或 "HTTP/1.1"
$status # HTTP響應(yīng)代碼
$time_iso8601 # 服務(wù)器時(shí)間的ISO 8610格式
$time_local # 服務(wù)器時(shí)間(LOG Format 格式)
$cookie_NAME # 客戶(hù)端請(qǐng)求Header頭中的cookie變量溪窒,前綴"$cookie_"加上cookie名稱(chēng)的變量坤塞,該變量的值即為cookie名稱(chēng)的值
$http_NAME # 匹配任意請(qǐng)求頭字段冯勉;變量名中的后半部分NAME可以替換成任意請(qǐng)求頭字段,如在配置文件中需要獲取http請(qǐng)求頭:"Accept-L- anguage"摹芙,$http_accept_language即可
$http_cookie # cookie 信息
$http_host # 請(qǐng)求地址灼狰,即瀏覽器中你輸入的地址(IP或域名)
$http_referer # url跳轉(zhuǎn)來(lái)源,用來(lái)記錄從那個(gè)頁(yè)面鏈接訪問(wèn)過(guò)來(lái)的
$http_user_agent # 用戶(hù)終端瀏覽器等信息
$http_x_forwarded_for # 獲取客戶(hù)端真實(shí) IP 地址的參數(shù)
$sent_http_NAME # 可以設(shè)置任意http響應(yīng)頭字段;變量名中的后半部分NAME可以替換成任意響應(yīng)頭字段浮禾,如需要設(shè)置響應(yīng)頭 Content-length交胚,$s- ent_http_content_length即可
$sent_http_cache_control # 發(fā)送http緩存控制
$sent_http_connection # 發(fā)送http連接
$sent_http_content_type # 發(fā)送http類(lèi)型
$sent_http_keep_alive # 發(fā)送http連接保持
$sent_http_last_modified # 發(fā)送http最后修改
$sent_http_location # 發(fā)送http位置
$sent_http_transfer_encoding- # 發(fā)送http傳輸編碼 [[3]]
Nginx 日志例子
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent $request_time "$http_referer" '
'$host DIRECT/$upstream_addr $upstream_http_content_type '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$Cookie_MEIQIA_EXTRA_TRACK_ID" "$Cookie_cpsInfo" "$Cookie_sid_account" "$Cookie_sid_user" "$Cookie_ss_user" "$Cookie_xxd_uid" "$Cookie_xxd_user" "$uid_got" "$uid_set"';
log_format 部分參數(shù)解釋
- $proxy_protocol_addr # 遠(yuǎn)程地址(如果啟用了代理協(xié)議)
- $remote_addr # 客戶(hù)端的源IP地址
- $remote_user # 用于HTTP基礎(chǔ)認(rèn)證服務(wù)的用戶(hù)名
- $time_local # 訪問(wèn)時(shí)間和時(shí)區(qū)
- $request # 請(qǐng)求的URI和HTTP協(xié)議
- $http_host # 請(qǐng)求地址,即瀏覽器中你輸入的地址(IP或域名)
- $request # 請(qǐng)求的URI和HTTP協(xié)議
- $http_host # 請(qǐng)求地址伐厌,即瀏覽器中你輸入的地址(IP或域名)
- $status # HTTP請(qǐng)求狀態(tài)
- $upstream_status # upstream狀態(tài)
- $body_bytes_sent # 發(fā)送給客戶(hù)端文件內(nèi)容大小
- $http_referer # url跳轉(zhuǎn)來(lái)源
- $http_user_agent # 用戶(hù)終端瀏覽器等信息
- $ssl_protocol # SSL協(xié)議版本
- $ssl_cipher # 交換數(shù)據(jù)中的算法
- $upstream_addr # 后臺(tái)upstream的地址承绸,即真正提供服務(wù)的主機(jī)地址
- $request_time # 整個(gè)請(qǐng)求的總時(shí)間
- $upstream_response_time # 請(qǐng)求過(guò)程中,upstream響應(yīng)時(shí)間 [3]