1、Nginx概述
javascript
1.Nginx簡介php
解決基於進程模型產生的C10k問題,請求時即便無狀態鏈接如web服務都沒法達到併發響應量級一萬現狀。2006年俄羅斯編寫。全稱爲engine X,縮減合併稱爲nginx。 官方站點:http://nginx.org/。 2013年發出企業版Nginx Pluscss
二次發行版:tengine, OpenResty… …html
2.Nginx的特性java
1) 模塊化設計、較好擴展性;早期不支持模塊的動態裝卸載node
2) 高可靠性:基於master/worker模式nginx
master:負責啓動服務,分析配置文件,父子啓動子進程和worker進程web
worker:真正響應用戶請求進程正則表達式
3) 支持熱部署(平滑遷移):不停機更新配置文件、更換日誌、更新服務器程序版本;算法
4) 內存消耗低:10000個keep-alive鏈接模式下的非活動鏈接僅消耗2.5M內存;
5) 支持event-driven事件驅動模型, aio一步驅動機制, mmap內存映射;
3.Nginx基本功能
1) 靜態資源的web服務器;
2) http協議的反向代理服務器;
3) pop3, smpt,imap4等郵件協議的反向代理;
4) 能緩存打開的文件(元數據:文件的描述符等等信息)
5) 支持FastCGI(php-fpm), uWSGI(Python WebFramwork)等協議機制,實現代理後端應用程序交互
6) 高度模塊化(非DSO機制)
模塊類型:
core module |
核心公用模塊 |
Standard HTTP modules |
標準(核心)HTTP模塊;自動編譯進程序不止一個 |
Optional HTTP modules |
可選HTTP模塊 |
Mail modules |
郵件模塊 |
3rd party modules |
第三方模塊,在編譯時需手動指明加載方式加載 |
7) 支持過濾器,例如zip,SSI
8) 支持SSL加密機制;
9) web服務相關的功能:虛擬主機(server)、keepalive、訪問日誌(支持基於日誌緩衝提升其性能)、urlrewirte、路徑別名、基於IP及用戶的訪問控制、支持速率限制及併發數限制;
……
4.Nginx的基本架構:master/worker
master/worker模型:一個master進程可生成一個或多個worker進程;每一個worker基於時間驅動機制能夠並行響應多個請求
master:加載配置文件、管理worker進程、平滑升級,...
worker:http服務,http代理,fastcgi代理,...
事件驅動:epoll(Linux),kqueue(FreeBSD), /dev/poll(Solaris)
消息通知:select,poll, rt signals
支持sendfile, sendfile64
支持AIO,mmap
2、Nginx編譯安裝配置
1.編譯安裝nginx
(1)編譯環境準備
[root@localhost~]# yum install -y make
[root@localhost~]# yum install -y gcc
[root@localhost~]# yum -y groupinstall "開發工具""服務器平臺開發"
[root@localhost~]# yum install -y pcre-devel openssl-develzlib-devel
[root@localhost~]# useradd -r nginx
(2)解壓安裝
[root@localhost~]# tar xf nginx-1.8.0.tar.gz
[root@localhostnginx-1.8.0]# ./configure --prefix=/usr/local/nginx--conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log--http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx/nginx.pid--lock-path=/var/lock/nginx.lock --with-http_ssl_module--with-http_stub_status_module --with-http_gzip_static_module --with-debug
注意:check時,在Linux上epoll機制要存在
[root@localhostnginx-1.8.0]#make &&make install
(3)啓動服務,檢測端口是否啓用
[root@localhost~]# /usr/local/nginx/sbin/nginx
[root@localhost~]# ss-tnl
2.Nginx配置文件
(1)配置指令有類型
1) 全局指令:放置於mainblock中,即文檔根
main配置段類別:正常運行必備的配置;優化性能相關的配置;用於調試、定位問題的配置;
2) 模塊指令:由模塊引入,其也必須放置於相應的Directive blocks中;block之間可能存在嵌套關係。用{}嵌套
event 配置段 |
事件驅動模塊段,面向用戶併發鏈接請求響應組織配置機制 |
http 配置段 |
web模塊相關配置 |
mail配置段 |
郵件模塊相關配置;編譯安裝時候默認無此模塊 |
… ... |
(2)組成部分
主配置文件:nginx.conf
在主配置文件中加入include語句,能夠將主配置文件切割成端例如include conf.d/*.conf ===> /etc/nginx/conf.d/*.conf
fastcgi的配置文件:fastcgi_params
… ...
(3)配置文件內容語法格式
1) 配置指令(必須以分號結尾):Directive value1 [value2...];
2) 支持使用變量:
內置變量:由模塊引入;
自定義變量:set variable value; 引用變量:$variable
3、主配置文件框架解析
1.MAIN配置段經常使用參數
(1)常規配置指令
user USERNAME [GROUPNAME]; |
指定用於運行worker進程的用戶和組:例如user nginx nginx; |
pid /PATH/TO/PID_FILE; |
指定nginx進程的pid文件路徑;pid /var/run/nginx.pid; |
worker_rlimit_nofile #; |
指定一個worker進程所可以打開的最大文件描述符數量; |
worker_rlimit_sigpending #; |
指定每一個用戶可以發往worker進程的信號的數量; |
(2)性能優化相關指令
worker_processes #; |
worker進程的個數;一般應該爲物理CPU核心數量減1;"auto"實現自動設定 |
worker_cpu_affinity CPUMASK CPUMASK …; |
CPU綁定;加上CPU掩碼 實例:worker_cpu_affinity 00000001 00000010 00000100; |
worker_priority nice; |
[-20, 19] |
(3)調試定位Bug相關指令
daemon off|on; |
是否以守護進程方式啓動nignx; |
master_process on|off; |
是否以master/worker模型運行nginx; |
error_log /PATH/TO/ERROR_LOG level; |
錯誤日誌文件及其級別; 調試須要能夠設定爲debug;但debug在編譯時使用了"--with-debug"選項 |
2.event配置段經常使用參數
worker_connections #; |
每一個worker進程所可以響應的最大併發請求數量;默認爲1024; 上限:worker_proceses * worker_connections |
use [epoll|rgsig|select|poll]; |
定義使用的事件模型;建議讓nginx自動選擇; |
accept_mutex [on|off]; |
各worker接收用戶的請求的負載均衡鎖(互斥鎖) on:啓用,表示用於讓多個worker輪流地、序列化地響應新請求; |
lock_file /PATH/TO/LOCK_FILE; |
鎖文件位置 |
4、Nginx:http常規配置
說明:http的全部配置須要在http{ } 配置段進行定義。未具體說明指令基於ngx_http_core_module模塊配置
1.主機或套接字相關指令
(1) server {}:定義一個虛擬主機;server能夠出現一次貨屢次
server{
listenPORT;
server_name NAME;
root /PATH/TO/DOCUMENTROOT;
}
...
注意:
1) 基於port:listen指令監聽在不一樣的端口;
2) 基於hostname:server_name指令指向不一樣的主機名;
(2) listen:配置監聽端口
使用格式:listen address[:port] [default_server] [ssl] [http2 | spdy]
listen port [default_server] [ssl] [http2 | spdy]
註釋:
default_server:設置默認虛擬主機;用於基於IP地址,或使用了任意不能對應於任何一個server的name時所返回站點;
ssl:用於限制只能經過ssl鏈接提供服務;
spdy:SPDYprotocol(speedy),在編譯了spdy模塊的狀況下,用於支持SPDY協議;
http2:支持httpversion 2第二版http協議;
(3) server_name NAME [...];:指明主機名稱
後可跟一個或多個主機名;名稱還可使用通配符和正則表達式(~引導整個正則表達式);
匹配順序:
1) 首先作精確匹配;例如:www.xxx.com
2) 左側通配符;例如:*.xxx.com
3) 右側通配符,例如:www.xxx.*
4) 正則表達式,例如:~^.*\.xxx\.com$
5)default_server
(4) tcp_nodelay on|off;
對keepalive模式下的鏈接是否使用TCP_NODELAY選項;通常爲off
提升帶寬利用率,將發往同一主機很小的TCP報文合併成一個;實際生產上對於用戶請求即便浪費帶塊也不能合併請求
(5) tcp_nopush on|off;
是否啓用TCP_NOPUSH(FREEBSE)或TCP_CORK(Linux)選項;僅在sendfile爲on時有用;
嘗試將多個報文首部壓縮成一個發送,默認off,不啓用該功能
(6) sendfile on|off;
是否啓用sendfile功能;靜態文件直接在內核中封裝響應,而不是從內核空間到用戶空間再發往內和空間
2.路徑相關指令
(1) root:指明根文件路徑
設置web資源的路徑映射;用於指明請求的URL所對應的文檔的目錄路徑;可用與server或localtion中
實例:
server{
...
root /data/www/vhosts;
}
http://www.xuding.com/p_w_picpaths/logo.jpg --> /data/www/vhosts/p_w_picpaths/logo.jpg
server{
...
server_name www.xuding.com;
location/p_w_picpaths/ {
root /data/imgs/;
...
}
}
http://www.xuding.com/p_w_picpaths/logo.jpg --> /data/imgs/p_w_picpaths/logo.jpg
(2) location
容許根據用戶請求的URI來匹配定義的各location。匹配到時,此請求將被相應的location塊中的配置所處理;即用於爲須要用到專用配置的uri提供特定配置;
使用格式:
1) location @name { ... }
2) location[ = | ~ | ~* | ^~ ] uri { ... }
當能匹配屢次時,其匹配優先級:精確匹配=、^~、~或~*、不帶符號的URL;
=:URI的精確匹配,其後多一個字符都不能夠,精確匹配根
~:作正則表達式匹配,區分字符大小寫;
~*:作正則表達式匹配,不區分字符大小寫;
^~:URI的左半部分匹配,不區分字符大小寫;
server {
...
server_name www.xuding.com;
root/data/www;
location /admin/ {
...
}
}
(3) alias:定義路徑別名,只能用於location配置段
location /p_w_picpaths/ {
root/data/imgs/;
}
location /p_w_picpaths/ {
alias/data/imgs/;
}
注意:
root指令:給定的路徑對應於location的「/」這個URL;/p_w_picpaths/test.jpg --> /data/imgs/p_w_picpaths/test.jpg
alias指令:給定的路徑對應於location的「/uri/"這個URL;/p_w_picpaths/test.jpg--> /data/imgs/test.jpg
(4) index :設置默認主頁(ngx_http_index_module模塊引入)
能夠帶上變量,如$geo更具不一樣IP地區來設置不一樣的語言主頁
indexfile ...;
(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,不然會致使死循環);
3.面向客戶端請求相關的配置
(1) keepalive_timeout # ;
設定keepalive鏈接的超時時長;0表示禁止長鏈接;默認爲啓用爲75s;
(2) keepalive_requests # ;
在keepalived鏈接上所容許請求的最大資源數量;默認爲100;
(3) keepalive_disable … ….;
指明禁止爲什麼種瀏覽器使用keepalive功能;默認none,也能夠指明具體瀏覽器名稱
(4) send_timeout #;
發送響應報文的超時時長,默認爲60s;
(5) client_body_buffer_size size;
接收客戶請求報文body的緩衝區大小;默認爲16k;超出此指定大小時將被移存於磁盤上;
(6) client_body_temp_pathpath [level1 [level2 [level3]]];
設定用於存儲客戶端請求body的臨時存儲路徑及子目錄結構和數量;
client_body_temp_path /var/tmp/client_body 2 2;
4.對客戶端請求的進行限制
(1) limit_excpet METHOD {...}:對指定範圍以外的其它的方法進行訪問控制;
limit_except GET {
allow 172.16.0.0/16;
denyall;
}
(2) limit_rate # ;
制客戶端每秒鐘所可以傳輸的字節數,默認爲0表示無限制;
5.文件操做優化相關的配置
(1) aio on|off;
是否啓用異步IO模式
(2) directio size|off;
直接IO;不在內存中緩衝,直接從硬盤加載使用(當大於指定size)
Enablesthe use of the O_DIRECT flag (FreeBSD, Linux), the F_NOCACHE flag (Mac OS X),or the directio() function (Solaris), when reading files that are larger thanor equal to the specified size.
(3) open_file_cache :打開文件緩存
open_file_cache off;
open_file_cachemax=N [inactive=time];
註釋:nginx能夠緩存如下三種信息
1)文件描述符、文件大小和最近一次的修改時間;
2)打開的目錄的結構;
3)沒有找到的或者沒有權限操做的文件的相關信息;
max=N表示可緩存的最大條目上限;一旦達到上限,則會使用LRU算法從緩存中刪除最近最少使用的緩存項;
inactive=time:在此處指定的時長內沒有被訪問過的緩存項是爲非活動緩存項,所以直接刪除;
(4) open_file_cache_errorson | off;
是否緩存找不到其路徑的文件,或沒有權限沒有權限訪問的文件相關信息;
(5) open_file_cache_valid # ;
每隔多久檢查一次緩存中緩存項的有效性;默認爲60s;
(6) open_file_cache_min_uses # ;
緩存項在非活動期限內最少應該被訪問的次數;
6.ngx_http_access_module模塊調用配置(基於IP的訪問控制)
allow address | CIDR | unix: | all; 容許
deny address | CIDR | unix: | all; 拒絕
能夠應用於http, server, location, limit_except上下文範圍內,直接指定IP
7.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/ {
auth_basic"Admin Area";
auth_basic_user_file/etc/nginx/.ngxhtpasswd;
}
8.ngx_http_log_module模塊調用配置(訪問日誌)
(1) log_format name string ...;:定義日誌格式及其名稱;
日誌格式通常經過調用內置變量來定義;
string:經過nginx所支持的變量(每一個模塊會引入自變量)來支持的
(2) access_log:訪問日誌
access_logpath [format [buffer=size [flush=time]]];
access_logoff;
訪問日誌文件路徑,格式名稱以及緩存大小和刷寫時間間隔;建議定義緩衝以提高性能;
(3) open_log_file_cachemax=N [inactive=time] [min_uses=N] [valid=time];
open_log_file_cacheoff;
9.ngx_http_stub_status_module模塊調用配置:
stub_status; |
調用查看nginx狀態指令 |
實例:
location /staus{
stub_status;
}
經過指定的uri輸出stub status;其具體輸出結果以下:
Activeconnections: 291
serveraccepts handled requests
1663094816630948 31070465
Reading:6 Writing: 179 Waiting: 106
輸出結果註釋 |
|
Active connections |
當前活動的客戶端鏈接數 |
accepts |
已經接受的客戶端鏈接總數量:16630948 |
handled |
已經處理事後客戶端鏈接總數量:16630948 |
requests |
客戶端的總的請求數量:31070465 |
Readking |
正在讀取的客戶端請求的數量 |
Writing |
正向其發送響應報文的鏈接數量 |
Waiting |
等待其發出請求的空閒鏈接數量 |
10.ngx_http_referer_module模塊調用配置(基於請求報文中的Referer首部的值作訪問控制)
valid_referers none | blocked | server_names | string ...;
none |
請求報文不存在referer首部; |
blocked |
請求報文中存在referer首部,但其沒有有效值,或其值非以http://或https://開頭; |
server_names |
其值爲一個主機名; |
arbitrary string |
直接字符串,可使用*通配符; |
regular expression |
以~起始的正則表達式; |
注意:內置變量:$invalid_referer(全部不能符合valid_referer指定定義的引用請求均爲不合法引用),需加上條件判斷語句
示例:
valid_referers none blocked server_names *.example.com example.* www.example.org/galleries/ ~\.google\.;
if($invalid_referer) {
return 403;
}
11.ngx_http_gzip_module模塊:gip壓縮
gzip on | off; |
啓用或禁用gzip壓縮響應報文; |
gzip_comp_level level; |
壓縮比,1-9,默認爲1; |
gzip_disable regex ...; |
regex是爲用於匹配客戶端響應器類型的正則表達式;表示對何種瀏覽器禁止使用壓縮功能; |
gzip_min_length length; |
觸發壓縮功能的響應報文的最小長度; |
gzip_http_version 1.0 | 1.1; |
設定啓用壓縮功能時,協議的最小版本; |
gzip_proxied # ; |
off | expired | no-cache | no-store | private | no_last_modified | no_etag | auth | any ...; 定義對客戶端請求的具備何種請求屬性的資源啓用壓縮功能;如expired則表示對因爲使用了expire首部而沒法緩存的對象啓用壓縮功能; |
gzip_types mime-type ...; |
指明僅對哪些類型的資源執行壓縮操做;即壓縮過濾器; |
實例:
gzip on;
gzip_http_version1.0;
gzip_comp_level6;
gzip_disablemsie6;
gzip_min_length2;
gzip_typestext/plain text/css text/xml application/x-javascript application/xmlapplication/jsonapplication/java-script;
5、Nginx:https配置(基於ngx_http_ssl_module)
ssl_certificate FILE; |
證書文件路徑 |
ssl_certificate_key FILE; |
證書對應的私鑰文件 |
ssl_ciphers CIPHERS; |
指明由nginx使用的加密算法,能夠是OpenSSL庫中所支持各加密套件 |
ssl_protocols # ; |
指明支持的ssl協議版本,[SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]默認爲後三個 |
ssl_session_timeout #; |
ssl會話超時時長;即ssl session cache中的緩存有效時長 |
ssl_session_cache # ; |
指明ssl會話緩存機制;off | none | [builtin[:size]] [shared:name:size],默認使用shared |
說明:(ssl_session_cache)
off:禁止緩存,關閉緩存,不支持緩存功能
none:禁止緩存,不響應緩存
builtin:使用OpenSSL內置的ssl會話緩存,對機制爲各worker私有;
shared:在各worker之間使用一個共享的緩存;name:獨有名稱;size:緩存空間大小,默認1M,能夠調到10M;
注意:
1) https定義時候也是定義在http{ }配置段,其監聽配置定義:listen 443 ssl。不是以監聽在443端口做爲限定。用於限制只能經過ssl鏈接提供服務。
2) 若不在listen處定義,也能夠在server{ }中定義ssl on; 來啓用https服務
6、Nginx:http請求重寫(ngx_http_rewrite_module)
1.ngx_http_rewrite_module功能
將請求的url基於正則表達式進行重寫(URL重定向),在以下狀況下可使用:ttp轉換成httpd服務http--> https、域名轉換domain1.tld --> domain2.tld,、URL轉換uri1 --> uri2、實現SEO搜索引擎優化效果 …
2.指令
(1)rewrite regex replacement [flag];
regex:正則表達式,用於匹配用戶請求的url;
replacement:重寫(重定向、替換)成爲的結果;
[flag]:
last:重寫完成以後中止對當前uri的進一步處理,從新請求URL,對新url的新一輪從第一條開始匹配處理;
可能會出現死循環狀況,此時能夠設置循環次數,超過次數後返回給客戶端錯誤
break:重寫完成以後中止對當uri的處理,重寫檢查結果結束,轉向其後面的其它配置;
redirect:重寫完成以後會返回客戶端一個臨時的重定向,由客戶端對新的url從新發起請求(302);
permanent:重寫完成以後會返回客戶端一個永久的重定向,由客戶端對新的url從新發起請求(301);
實例:
server{
...
rewrite^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last;
rewrite^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last;
return 403;
...
}
驗證請求:http://www.xxx.com/download/a/b/c/media/32.wmv --> /download/a/b/c/mp3/32.mp3
注意:
1)last和break請求處理是在服務器內部完成,客戶端僅請求一次。redirect和permanent須要客戶端再次請求
2)URL重寫時所用的正則表達式須要使用PCRE格式。PCRE正則表達式元字符:
字符匹配:.,[ ], [^]
次數匹配:*,+, ?, {m}, {m,}, {m,n}
位置錨定:^,$
或者:|
分組:(),後向引用, $1, $2, ...
3.if (condition) { ... }:條件判斷,引用新的配置上下文
condition能夠爲如下格式 :
1) 比較表達式:
==,!=
~:模式匹配,區分字符大小寫;
~*:模式匹配,不區分字符大小寫;
!~:模式不匹配,區分字符大小寫;
!~*:模式不匹配,不區分字符大小寫;
2) 文件及目錄判斷:
-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;
}
4.reture:當即中止對請求的uri的處理,並返回指定的狀態碼;
returncode [text];
returncode URL;
returnURL;
5.set:設定變量值,或者自定義變量
set $variable value; 變量賦值;
6.rewrite_log 重寫日誌
rewrite_log on | off;:是否將重寫日誌記入errorlog中,默認爲關閉;
錯誤日誌調試方法:錯誤日誌debug,並開啓rewrite_log;