Nginx(一):靜態資源web服務器配置詳解

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代理,...

wKioL1bIF0fD_1shAAKLQ5WBSH0552.png

 

     事件驅動: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時,在Linuxepoll機制要存在

              [root@localhostnginx-1.8.0]#make &&make install

     (3)啓動服務,檢測端口是否啓用

              [root@localhost~]#  /usr/local/nginx/sbin/nginx

              [root@localhost~]# ss-tnl

wKiom1bIFt-iaDHCAACydAysM8U914.png

 

2.Nginx配置文件

    (1)配置指令有類型

             1) 全局指令:放置於mainblock中,即文檔根

main配置段類別:正常運行必備的配置;優化性能相關的配置;用於調試、定位問題的配置;

             2) 模塊指令:由模塊引入,其也必須放置於相應的Directive blocks中block之間可能存在嵌套關係。用{}嵌套

   event 配置段

事件驅動模塊段,面向用戶併發鏈接請求響應組織配置機制

   http 配置段

web模塊相關配置

   mail配置段

郵件模塊相關配置;編譯安裝時候默認無此模塊

   … ...


wKiom1bIF0KQTyFnAAE_wCXCz8E867.jpg

    (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、Nginxhttp常規配置

     說明:http的全部配置須要在http{ } 配置段進行定義。未具體說明指令基於ngx_http_core_module模塊配置

  1.主機或套接字相關指令

   (1) server {}定義一個虛擬主機;server能夠出現一次貨屢次

server{

listenPORT;

server_name  NAME;

root /PATH/TO/DOCUMENTROOT;

}

...

              注意:

      1) 基於portlisten指令監聽在不一樣的端口;

      2) 基於hostnameserver_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所對應的文檔的目錄路徑;可用與serverlocaltion

實例:

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、Nginxhttps配置(基於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、Nginxhttp請求重寫(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)lastbreak請求處理是在服務器內部完成,客戶端僅請求一次。redirectpermanent須要客戶端再次請求

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;

相關文章
相關標籤/搜索