Nginx
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,并在一個BSD-like 協議下發行。由俄羅斯的程序設計師Igor Sysoev所開發,其特點是占有內存少,并發能力強,事實上nginx的并發能力確實在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
Nginx的程序架構;master/worker
master/worker模型:一個master進程可生成一個或多個worker進程;每個worker基于時間驅動機制可以并行響應多個請求 master:負責啟動服務,分析配置文件,父進程啟動子進程和worker進程,平滑升級 worker:真正響應用戶請求進程;http服務,http代理,fastcgi代理,... 緩存相關的進程 cache loader:緩存加載器,載入緩存對象 cache manger:緩存管理器,管理緩存對象 事件驅動:epoll(Linux),kqueue(FreeBSD), /dev/poll(Solaris) 消息通知:select,poll, rt signals 支持sendfile, sendfile64: 支持AIO,mmap
Nginx的特性
1) 模塊化設計、較好擴展性;早期不支持模塊的動態裝卸載 2) 高可靠性:基于master/worker模式 3) 支持熱部署(平滑遷移):不停機更新配置文件、更換日志、更新服務器程序版本; 4) 內存消耗低:10000個keep-alive連接模式下的非活動連接僅消耗2.5M內存; 5) 支持event-driven事件驅動模型, aio異步驅動機制, mmap內存映射 6) 異步,事件驅動,非阻塞 并發請求處理:通過kevent/epoll/select 文件IO:高級 IO sendfile:支持數據加載完以后,直接在內核級封裝響應報文,響應給客戶端。 異步 mmap:內存映射:數據從磁盤空間映射進內存空間來,并把內存直接對應的拿給進程來訪問。
Nginx的基本功用
1) 靜態的web資源服務器; 2) http/https協議的反向代理;tcp/udp協議的反代 3) pop3, smpt,imap4等郵件協議的反向代理; 4) 能緩存打開的文件(元數據:文件的描述符等等信息) 5) 結合FastCGI/uwSGI/SCGI等協議反代動態資源請求,既能反代,還能緩存 6) 高度模塊化(非DSO機制):高度模塊化,但其模塊早期不支持DSO機制;近期版本支持動態裝載和卸載; 模塊分類: 核心模塊:core module:核心公用模塊 標準模塊: Standard HTTP modules:標準(核心)HTTP模塊;自動編譯進程序不止一個 Optional HTTP modules:可選的http協議相關的模塊 Mail modules:郵件模塊 Stream modules:可以基于tcp協議負載用戶的各類請求 3rd party modules:第三方模塊,Nginx沒有自帶,在編譯時需手動指明加載方式加載
nginx的安裝配置:
官方的預制包: http://nginx.org/packages/centos/7/x86_64/RPMS/ 編譯安裝: ]# 下載源碼包 ]# yum install -y make ]# yum install -y gcc ]# yum -y groupinstall "Development Tools" "Server Platfrom Development" ]# yum install pcre-devel openssl-devel zlib-devel -y 手動解決最重要的依賴關系包 ]# useradd -r nginx 增加一個系統用戶 ]# tar -xf nginx-1.10.0.tar.gz ]# cd nginx-1.10.0/ nginx-1.10.0]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/va/log/nginx.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio ]# make && make install ]# vim /etc/profile.d/nginx.sh export PATH=/usr/local/nginx/sbin:$PATH ]# . /etc/profile.d/nginx.sh ]# nginx -t 檢測錯誤 ]# nginx -h 可查看命令使用幫助 啟動服務,檢測端口是否已經啟用 ]# /usr/local/nginx/sbin/nginx 啟動服務 ]# ss -tnlp 查看80端口是否已經啟用,注意,如果httpd服務已經啟用了話 這里會啟動失敗
Nginx配置文件
配置指令有類型 1) 全局指令:放置于mainblock中,即文檔根 main配置段類別:正常運行必備的配置;優化性能相關的配置;用于調試、定位問題的配置; 2) 模塊指令:由模塊引入,其也必須放置于相應的Directive blocks中;block之間可能存在嵌套關系。用{}嵌套 event 配置段:事件驅動模塊段,面向用戶并發連接請求響應組織配置機制 http 配置段:web模塊相關配置 mail 配置段:郵件模塊相關配置;編譯安裝時候默認無此模塊
nginx主配置文件的組成部分
主配置文件:nginx.conf 在主配置文件中加入include語句,可以將主配置文件切割成段例如include conf.d/*.conf ===> /etc/nginx/conf.d/*.conf fastcgi, uwsgi,scgi等協議相關的配置文件 mime.types:支持的mime類型
主配置文件的配置指令:
(1) 指令必須以分號結尾;directive value [value2 ...]; (2) 支持使用配置變量; 內建變量:由Nginx模塊引入,可直接引用; 自定義變量:由用戶使用set命令定義;set variable_name value; 引用變量:$variable_name
主配置文件結構:
main block:主配置段,也即全局配置段;有以下分類 正常運行必備的配置 1、USERNAME [GROUPNAME];指定用于運行worker進程的用戶和組:例如user nginx nginx; 2、pid /PATH/TO/PID_FILE;指定nginx進程的pid文件路徑;pid /var/run/nginx.pid; 3、include file | mask;指明包含進來的其它配置文件片段; 4、load_module file;指明要裝載的動態模塊; 性能優化相關的配置: 1、worker_processes number | auto;worker進程的數量;通常應該為當前主機的cpu的物理核心數減一,"auto"實現自動設定 2、worker_cpu_affinity cpumask cpumask ...;CPU綁定;加上CPU掩碼,"auto"實現自動設定與物理核心cpu數相同 實例:worker_cpu_affinity 00000001 00000010 00000100;worker_cpu_affinity auto 3、worker_priority number;指定worker進程的nice值,設定worker進程優先級;[-20,20] 4、worker_rlimit_nofile number;worker進程所能夠打開的文件數量上限; 5、worker_rlimit_sigpending number;指定每個用戶能夠發往worker進程的信號的數量; 調試、定位問題的配置: 1、daemon on|off;是否以守護進程方式運行nignx; 2、master_process on|off;是否以master/worker模型運行nginx;默認為on; 3、error_log /PATH/TO/ERROR_LOG level;錯誤日志文件及其級別;調試需要可以設定為debug;但debug在編譯時使用了"--with-debug"選項 事件驅動event相關的配置: 1、worker_connections number;每個worker進程所能夠打開的最大并發連接數數量;默認為1024;上限是:worker_proceses * worker_connections 2、use method;指明并發連接請求的處理方法;建議讓nginx自動選擇;默認為use epoll; 3、accept_mutex on | off;各worker接收用戶的請求的負載均衡鎖(互斥鎖),處理新的連接請求的方法; on意味著由各worker輪流處理新請求,Off意味著每個新請求的到達都會通知所有的worker進程;建議設置為on
nginx:http協議相關的配置:http的所有配置需要在http{ } 配置段進行定義。大部分配置指令由ngx_http_core _ module模塊引入
主機或套接字相關指令
1、server {}:每一個server定義一個虛擬主機;server可以出現一次或多次 server{ listenPORT; server_name NAME; root /PATH/TO/DOCUMENTROOT; } server{ listenPORT; server_name NAME; root /PATH/TO/DOCUMENTROOT; alias location [OPERATOR] /url/{ ... } } ... 注意: 1) 基于port:listen指令監聽在不同的端口; 2) 基于hostname:server_name指令指向不同的主機名; 3) 如果有多個server需要用到共同配置的話,要把配置放在server之外,http只能進行定義,即多個server的公共配置 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:設置默認虛擬主機;用于基于IP地址,或使用了任意不能對應于任何一個server的name時所返回站點; ssl:用于限制只能通過ssl連接提供服務; http2:支持httpversion 2第二版http協議; spdy:SPDYprotocol(speedy),在編譯了spdy模塊的情況下,用于支持SPDY協議; backlog=number:假如linten端口上的隊列已滿,指明排隊后的隊列長度 rcvbuf=size:接收緩沖的大小 sndbuf=size:發送緩沖的大小 3、 server_name NAME [...];:指明主機名稱 指明虛擬主機的主機名稱;后可跟多個由空白字符分隔的字符串;名稱還可以使用通配符和正則表達式(~引導整個正則表達式); 支持*通配任意長度的任意字符;server_name *.magedu.com 支持~起始的字符做正則表達式模式匹配;server_name ~^www\d+\.magedu\.com$ 匹配機制: (1) 首先是字符串精確匹配;例如:www.xxx.com (2) 左側*通配符;例如:*.xxx.com (3) 右側*通配符;例如:www.xxx.* (4) 正則表達式;例如:~^.*\.xxx\.com$ (5) default_server 4、tcp_nodelay on | off;在keepalived模式下的連接是否啟用TCP_NODELAY選項;一般為off 提高帶寬利用率,將發往同一主機很小的TCP報文合并成一個;實際生產上對于用戶請求即使浪費帶寬也不能合并請求 5、sendfile on | off;是否啟用sendfile功能; 靜態文件直接在內核中封裝響應,而不是從內核空間到用戶空間再發往內核空間 6、 tcp_nopush on|off;是否啟用TCP_NOPUSH(FREEBSE)或TCP_CORK(Linux)選項;僅在sendfile為on時有用; 嘗試將多個報文首部壓縮成一個發送,默認off,不啟用該功能
定義路徑相關的配置:
1、root path;設置web資源路徑映射;用于指明用戶請求的url所對應的本地文件系統上的文檔所在目錄路徑; 可用的配置段位置:http, server, location, if in location; 2、location;在一個server中location配置段可存在多個,用于實現從uri到文件系統的路徑映射;ngnix會根據用戶請求的URI來檢查定義的所有location,并找出一個最佳匹配,而后應用其配置; 使用格式: 1) location @name { ... } 2) location[ = | ~ | ~* | ^~ ] uri { ... } 匹配優先級:=, ^~, ~/~*,不帶符號; =:對URI做精確匹配;例如, http://www.magedu.com/, http://www.magedu.com/index.html location = / { ... } ~:對URI做正則表達式模式匹配,區分字符大小寫; ~*:對URI做正則表達式模式匹配,不區分字符大小寫; ^~:對URI的左半部分做匹配檢查,不區分字符大小寫; 不帶符號:匹配起始于此uri的所有的url; 示例 server { ... server_name www.xuding.com; root/data/www; location /admin/ { ... } } 3、alias path;定義路徑別名,文檔映射的另一種機制;僅能用于location上下文; 注意:location中使用root指令和alias指令的意義不同; (a) root,給定的路徑對應于location中的/uri/左側的/; (b) alias,給定的路徑對應于location中的/uri/右側的/; 4、index file ...;設置默認主頁(ngx_http_index_module模塊引入) 默認資源;http, server, location; 可以帶上變量,如$geo更具不同IP地區來設置不同的語言主頁 5、error_page code ... [=[response]] uri;:自定義錯誤頁面,根據http的狀態碼重定向錯誤頁面; 實例: 1)指明錯誤頁面 error_page 404 /404.html error_page 500 502 503 504 /50x.html location = /50x.html { root /html/; } 2) 以指定的響應狀態碼進行響應 error_page 404 =200 /404.html 6、try_files file ... uri;以指定的順序檢查文件的存在性響應 try_files file ... =code; 嘗試查找第1至第N-1個文件,第一個即為返回給請求者的資源;若1至N-1文件都不存在,則跳轉至最一個uri(必須不能匹配至當前location,而應該匹配至其它location,否則會導致死循環);
定義客戶端請求的相關配置
1、keepalive_timeout timeout [header_timeout]; 設定保持連接的超時時長,0表示禁止長連接;默認為75s; 2、keepalive_requests number; 在一次長連接上所允許請求的資源的最大數量,默認為100; 3、keepalive_disable none | browser ...; 對哪種瀏覽器禁用長連接;默認none,也可以指明具體瀏覽器名稱 4、send_timeout time; 向客戶端發送響應報文的超時時長,此處,是指兩次寫操作之間的間隔時長;默認為60s; 5、client_body_buffer_size size; 用于接收客戶端請求報文的body部分的緩沖區大??;默認為16k;超出此大小時,其將被暫存到磁盤上的由client_body_temp_path指令所定義的位置; 6、client_body_temp_path path [level1 [level2 [level3]]]; 設定用于存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量; 格式為16進制的數字,如下; client_body_temp_path path /var/tmp/client_body 1 2 2
對客戶端進行限制的相關配置:
1、limit_rate rate; 限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制; 2、limit_except method ... { ... } 限制對指定的請求方法之外的其它方法的使用客戶端; limit_except GET { allow 192.168.1.0/32; deny all; }
文件操作優化的配置
1、aio on | off | threads[=pool]; 是否啟用異步IO模式 2、directio size | off; 直接IO;不在內存中緩沖,直接從硬盤加載使用(當大于指定size);在Linux主機啟用O_DIRECT標記,此處意味文件大于等于給定的大小時使用,例如directio 4m; 3、 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_users指令所指定的緩存項是為非活動緩存項,因此直接刪除。 4、open_file_cache_valid time; 每隔多久檢查一次緩存中緩存項的有效性;默認為60s; 5、open_file_cache_min_uses number; 在open_file_cache指令的inactive參數指定的時長內,至少應該被命中多少次方可被歸類為活動項; 6、open_file_cache_errors on | off; 是否緩存查找時發生錯誤的文件一類的信息;意為;是否緩存查找時找不到其路徑的文件,或沒有權限沒有權限訪問的文件相關信息;
ngx _ http _ access _ module模塊:實現基于ip的訪問控制功能
應用于http, server, location, limit_except配置段 1、allow address | CIDR | unix: | all; 允許指定的ip訪問 2、deny address | CIDR | unix: | all; 拒絕指定的ip訪問
ngx _ http _ auth _ basic _ module模塊調用配置(basic認證)
1、auth_basic string |off;:使用httpbasic認證協議對用戶進行認證; string為所給定字符,其作用在于認證時顯示的提示所信息 2、 auth_basic_user_file FILE ;:實現用戶認證的賬號文件; 認證文件格式(需手動創建): name1:password1 name2:password2:comment 注意:密碼需要加密,加密方式可以為encryptedwith the crypt() function; md5加密; 密碼可以用htpasswd創建:htpasswd-c -m /etc/nginx/.ngxhtpasswd tom(創建第二個用戶時需要將-c去掉) 示例: location /admin/ { alias /webapps/app1/data/; auth_basic "Admin Area"; auth_basic_user_file /etc/nginx/.ngxpasswd; }
ngx _ http _ stub _ status _ module模塊調用配置:用于輸出nginx的基本狀態信息;
1、stub_status;調用查看nginx狀態指令 配置示例: location /basic_status { stub_status; } 通過指定的uri輸出stub status;其具體輸出結果如下: Active connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106 輸出結果注釋; Active connections: 活動狀態的連接數; accepts:已經接受的客戶端請求的總數; handled:已經處理完成的客戶端請求的總數; requests:客戶端發來的總的請求數; Reading:處于讀取客戶端請求報文首部的連接的連接數; Writing:處于向客戶端發送響應報文過程中的連接數; Waiting:處于等待客戶端發出請求的空閑連接數;
ngx _ http _ log _ module模塊調用配置(訪問日志)
1、 log_format name string ...;:定義日志格式及其名稱; 日志格式一般通過調用內置變量來定義; string:通過nginx所支持的變量(每個模塊會引入自變量)來支持的;即可以使用nginx核心模塊及其它模塊內嵌的變量; 2、access_log:訪問日志 access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]]; access_log off; 訪問日志文件路徑,格式名稱以及緩存大小和刷寫時間間隔;建議定義緩沖以提升性能; buffer=size flush=time 3、open_log_file_cache max=N [inactive=time] [min_uses=N] [valid=time]; open_log_file_cache off;緩存各日志文件相關的元數據信息; 指令參數注釋; max:緩存的最大文件描述符數量; min_users:在inactive指定的時長內訪問大于等于此值方可被當作活動項; inactive:非活動時長; valid:驗正緩存中各緩存項是否為活動項的時間間隔;
ngx _ http _ referer _ module模塊調用配置(基于請求報文中的Referer首部的值做訪問控制)
1、valid_referers none | blocked | server_names | string ...;定義referer首部的合法可用值; 指令參數注釋 none:請求報文首部沒有referer首部; blocked:請求報文的referer首部沒有值; server_names:參數,其可以有值作為主機名或主機名模式; arbitrary_string:直接字符串,但可使用*作通配符; regular expression:被指定的正則表達式模式匹配到的字符串;要使用~打頭,例如 ~.*\.magedu\.com; 配置示例: valid_referers none block server_names *.magedu.com *.mageedu.com magedu.* mageedu.* ~\.magedu\.; if($invalid_referer) { return 403; }
ngx _ http _ rewrite _ module模塊:http請求重寫,將用戶請求的URI基于regex所描述的模式進行檢查,而后完成替換;
1、rewrite regex replacement [flag] 將用戶請求的URI基于regex所描述的模式進行檢查,匹配到時將其替換為replacement指定的新的URI; 注意:如果在同一級配置塊中存在多個rewrite規則,那么會自下而下逐個檢查;被某條件規則替換完成后,會重新一輪的替換檢查,因此,隱含有循環機制;[flag]所表示的標志位用于控制此循環機制; 如果replacement是以http://或https://開頭,則替換結果會直接以重向返回給客戶端; 301:永久重定向; regex:正則表達式,用于匹配用戶請求的url; replacement:重寫(重定向、替換)成為的結果; [flag]: last:重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后對新的URI啟動新一輪重寫檢查;提前重啟新一輪循環; break:重寫完成后停止對當前URI在當前location中后續的其它重寫操作,而后直接跳轉至重寫規則配置塊之后的其它配置;結束循環; redirect:重寫完成后以臨時重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發起請求;不能以http://或https://開頭; permanent:重寫完成后以永久重定向方式直接返回重寫后生成的新URI給客戶端,由客戶端重新發起請求; 示例: server{ ... rewrite^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... } 注意: 1)last和break請求處理是在服務器內部完成,客戶端僅請求一次。redirect和permanent需要客戶端再次請求 2)URL重寫時所用的正則表達式需要使用PCRE格式。PCRE正則表達式元字符: 字符匹配:.,[ ], [^] 次數匹配:*,+, ?, {m}, {m,}, {m,n} 位置錨定:^,$ 或者:| 分組:(),后向引用, $1, $2, ... 2、return;立即停止對請求的uri的處理,并返回指定的狀態碼; return code [text]; return code URL; return URL; 3、 rewrite_log 重寫日志 rewrite_log on | off;:是否將重寫日志記入errorlog中,默認為關閉; 錯誤日志調試方法:錯誤日志debug,并開啟rewrite_log; 4、 if (condition) { ... };引入一個新的配置上下文 ;條件滿足時,執行配置塊中的配置指令;server, location; condition可以為以下格式: 比較操作符: == != ~:模式匹配,區分字符大小寫; ~*:模式匹配,不區分字符大小寫; !~:模式不匹配,區分字符大小寫; !~*:模式不匹配,不區分字符大小寫; 文件及目錄存在性判斷: -f,!-f:是否存在且為普通文件; -d,!-d: 是否存在且為目錄; -e,!-e:是否存在; -x,!-x:是否存在且可執行; 實例: 1) cookie首部檢測匹配 if($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; } 2) 請求報文的請求方法是POST,返回405 if($request_method = POST) { return 405; } 3) 限速(如會員認為不是slow不做限速) if($slow) { limit_rate 10k; } 4) 非法引用,返回403。注:也可以對非法引用到其他網頁 if($invalid_referer) { return 403; } 5、set;設定變量值,或者自定義變量 set $variable value;變量賦值
ngx _ http _ gzip _ module模塊:gip壓縮
1、gzip on | off; 啟用或禁用gzip壓縮響應報文; 2、gzip_comp_level level; 壓縮比,1-9,默認為1; 3、 gzip_disable regex ...; regex是為用于匹配客戶端響應器類型的正則表達式;表示對何種瀏覽器禁止使用壓縮功能; 4、 gzip_min_length length; 觸發壓縮功能的響應報文的最小長度; 5、gzip_buffers number size; 支持實現壓縮功能時為其配置的緩沖區數量及每個緩存區的大?。? 6、gzip_proxied off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; ginx作為代理服務器接收到從被代理服務器發送的響應報文后,在何種條件下啟用壓縮功能的; off:對代理的請求不啟用 no-cache, no-store,private:表示從被代理服務器收到的響應報文首部的Cache-Control的值為此三者中任何一個,則啟用壓縮功能; 7、gzip_types mime-type ...; 壓縮過濾器,僅對此處設定的MIME類型的內容啟用壓縮功能;
ngx _ http _ ssl_module模塊:
1、 ssl on | off; 開啟或關閉ssl 2、ssl_certificate file; 當前虛擬主機使用PEM格式的證書文件路徑; 3、ssl_certificate_key file; 當前虛擬主機上與其證書對應的私鑰文件; 4、ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 指明支持的ssl協議版本,[SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]默認為后三個 5、ssl_session_timeout time; 客戶端一側的連接可以復用ssl session cache中緩存 的ssl參數的有效時長; 6、ssl_session_cache off | none | [builtin[:size]] [shared:name:size]; 指明ssl會話緩存機制;off | none | [builtin[:size]] [shared:name:size],默認使用shared off:禁止緩存,關閉緩存,不支持緩存功能 none:禁止緩存,不響應緩存 builtin[:size]:使用OpenSSL內建的緩存,此緩存為每worker進程私有; [shared:name:size]:在各worker之間使用一個共享的緩存;name:獨有名稱;size:緩存空間大小,默認1M,可以調到10M; 注意: 1)https定義時候也是定義在http{ }配置段,其監聽配置定義:listen 443 ssl。不是以監聽在443端口作為限定。用于限制只能通過ssl連接提供服務。 2)若不在listen處定義,也可以在server{ }中定義ssl on; 來啟用https服務 配置示例: server { listen 443 ssl; server_name www.magedu.com; root /vhosts/ssl/htdocs; ssl on; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; ssl_session_cache shared:sslcache:20m; }
原創文章,作者:M20-1馬星,如若轉載,請注明出處:http://www.www58058.com/58138