Nginx 我們必須知道的那些事

1、Nginx

介紹Nginx

       NGINX寫入解決服務器的少數之一C10K問題。不同於傳統的服務器,NGINX不依靠線程來處理請求。相反,它使用一個更可擴展的事件驅動的(異步)架構。這種結構採用小,但更重要的是,可預測的量的負荷下存儲器。即使你不希望處理成千上萬的併發請求,你仍然可以從NGINX的高性能和小內存佔用受益。NGINX擴展在所有方向:從最小的VPS一路攀升到服務器的大型集羣

[擴展]

C10k

       指的是服務器同時支持成千上萬個客戶端的問題,也就是conncurrent10 000     connection;而Nginx就是能解決這樣的一個問題

Nginx的應用

       Netflix, Hulu,Pinterest, CloudFlare, Airbnb, WordPress.com, GitHub, SoundCloud, Zynga,Eventbrite, Zappos, Media Temple, Heroku, RightScale, Engine Yard, MaxCDN

官方站點

       http://nginx.org/

選擇一個新的程序包注意的問題

       1.序包的新功能是否是我們需要的

       2.新的程序包之前必須做測試

作用

       一個自由的,開放源碼的,高性能的http和反向、代理服務器,以及一個IMAP/POP3代理服務器

Nginx的特點

高性能,高穩定性,功能豐富,配置簡單,資源消耗低

二次開發版:tengine, openresty

Nginx的特性:

       模塊化設計,較好的擴展性;

       高可靠性

              master/worker

       支持熱部署

              不停機更新配置文件、更換日誌文件、更新服務器程序版本;

       低內存消耗

              10000個keep-alive連接模式下的非活動連接僅消耗2.5M內存;

       Nginx支持事件驅動機制,支持異步,支持內存映射

【擴展】

什麼是代理:

       即代表處理,代表處理已授權的事情;

       wKiom1csrOKhGxxUAAA7F5ykAdU536.png

       上圖知,對於客戶端來說,中間的服務器是一個代理服務器,而對於服務器來說,中間的那個服務器稱之爲反向代理

基本功能

       靜態資源的web服務器;

       http協議反向代理服務器;

       pop3/imap4協議反向代理服務器;

       支持fastCGI(lnmp), uWSGI等協議

       模塊化(非DSO),著名模塊支持的有zip, SSL等等;        

web服務器相關的功能:

       虛擬主機、keepalive機制、訪問日誌、錯誤日誌、url 重寫、路徑別名、基於ip及用戶的訪問控制、支持速率限制及併發數限制,...;

Nginx的程序架構:

wKiom1csrPazfj7VAAM2vkKm4BY484.jpg

解釋:

       兩個補充的管理緩存的組件      

              Cache loader:負責加載/裝載緩存

              Cache Manager:管理緩存的

       中間的proxycache是需要開啓才能使用的,基於本地磁盤上與本地磁盤打交道時,支持高級I/O機制,支持sendfile機制,支持異步IO機制,支持mmap,支持

       實現併發請求響應上可以基於kevent,epoll(需要系統調用),.select機制,使用的方式都是不一樣的

架構:

       master/worker

              一個master進程,可生成一個或多個worker進程;

                     master:加載配置文件、管理worker進程(創建和銷燬)、平滑升級、...

                     worker:http服務、http代理、fastcgi代理                 

模塊類型:

       核心模塊:core module

       標準模塊:自己代理的核心模塊

              標準http模塊

              可選的http木塊

              郵件模塊

       第三方模塊(3rd party modules):           

模塊

       配置模塊即配置模塊中的指令,沒有配置指令就沒有相對應的有效的模塊;

       模塊中存在一些相關的變量;(內建變量)隨着模塊的不同而變化

Nginx能作什麼

       靜態資源的web服務器

       http協議反向代理

nginx如何作爲web服務器

安裝nginx:(nginx不再iso中,可以使用epel源安裝)

       推薦epel源:http://mirrors.aliyun.com/epel/7Server/x86_64/n/

配置yum源:

       [root@bogon yum.repos.d]#cat epel.repo

       [epel]

       name=centos epel

       baseurl=http://mirrors.aliyun.com/epel/7Server/x86_64/c/

       gpgcheck=0

配置nginx的yum源

       [nginx]

       name=nginx repo

       baseurl=http://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/

       gpgcheck=0

       enabled=1

下載nginx

       wget http://nginx.org/download/nginx-1.10.0.tar.gz

編譯安裝:按需安裝

配置安裝開發環境:

       準備支持的模塊

       yum install –y pcre-devel openssl-devel zlib-devel

       安裝開發包組

第一步:tar xfnginx-1.8.1.tar.gz

第二部:cdnginx-1.8.1

第三步:./configure\

       --prefix=/etc/nginx     nginx安裝的位置

       --sbin-path=/usr/sbin/nginx     nginx程序文件的安裝路徑

       --conf-path=/etc/nginx/nginx.conf   nginx的主配置文件路徑

       --error-log-path=/var/log/nginx/error.log     錯誤日誌文件路徑

       --http-log-path=/var/log/nginx/access.log    http訪問日誌路徑

       --pid-path=/var/run/nginx.pid  nginx的pid配置文件的路徑

       --lock-path=/var/run/nginx.lock      鎖文件

       --http-client-body-temp-path=/var/cache/nginx/client_temp    

       --http-proxy-temp-path=/var/cache/nginx/proxy_temp

       --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp

       --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp

       --http-scgi-temp-path=/var/cache/nginx/scgi_temp

       以上是臨時文件路徑,如果服務器允許使用put機制的話,客戶端可能會向服務器端請求大量的數據,服務器端收到的請求報文中的body中可能會有很多的數據,而這些數據都會存放內存中,倘若有很多的用戶併發發出請求,服務器端內存無法存放,因此就會把數據臨時存放在磁盤上的這些臨時文件內,上述都是代理服務器時緩存文件的存放路徑

       --user=nginx       指明那個用戶來運行nginx的work進程

       --group=nginx    

       --with-http_ssl_module      支持ssl認證

       --with-http_realip_module  記錄用戶的真實ip

       --with-http_addition_module

       --with-http_sub_module

       --with-http_dav_module

       --with-http_flv_module

       --with-http_mp4_module

       --with-http_gunzip_module

       --with-http_gzip_static_module

       --with-http_random_index_module

       --with-http_secure_link_module

       --with-http_stub_status_module

       --with-http_auth_request_module

       --with-threads

       --with-stream

       --with-stream_ssl_module

       --with-http_slice_module

       --with-mail

       --with-mail_ssl_module

       --with-file-aio      文件的異步IO機制

       --with-http_v2_module

       --with-ipv6

--with-* 指明編譯哪些功能

第四部:make&& make install

直接安裝:

       yum install –y nginx

nginx命令

       -?或者h:顯示幫助信息

       -v:顯示版本信息和退出

       -V:顯示版本信息和配置選項以及退出

       -t:測試配置文件是否存在錯誤

       -q:在配置測試過程中抑制錯誤消息

       -s:發送信號給主進程(stop(平滑停止),quit(及時有人正在使用,也會立即終止),reopen,reload)

       -p:設置前綴路徑

       -c:設置主置文件

       -g:設置全局指令的配置文件

啓動nginx

       前提是關閉佔用80端口的應用程序,比如http

       [root@www ~]# nginx

 

Nginx配置

       配置文件的組成部分:

       主配置文件:nginx.conf

       片段化配置文件實現:(相對於主配置文件的路徑,參照httpd)

1)創建一個conf.d目錄

2)在主配置文件中鍵入指令:include conf.d/*.conf

            Fastcgi,scgi,uwscgi的相關配置以及mime.types

配置指令

注意:必須以分號結尾

指令格式:directive  value1 [value2...];

支持使用變量:

內置變量:由模塊引入,可直接引用;

自定義變量:set  variable_name value;

            引用變量:$variable_name

整體配置文件結構:

     main block:全局配置;對http及mail模塊都有效;

            event{ ... }:事件驅動的相關配置;

            http { ...}:http協議的相關配置

            mail{ ... }:mail相關的配置;

       http相關的配置:

            http{ ...   ...

                   server{ ...       #一個sever一個虛擬主機

                          server_name  #當前主機名

                          root        #跟文檔的路徑

                          alias      #別名映射

                          location/url/ { ...   #這裏的url可以使用正則表達式做通配

                                 }    #定義訪問特定url目錄時的一些配置:

                          ...}

                   server { ... ...

                                 }

                          }

細化配置文件結構                           

       main block:配置指令的類別:

正常運行必備的配置;

優化性能的配置;

用於調試、定位問題的配置;

正常運行必備的配置

            1、user USERNAME [GROUPNAME];指定用於運行worker進程的用戶和組;

                   usernginx nginx;

            2、pid /PATH/TO/PID_FILE;指定nginx進程的pid文件路徑;

              pid /var/run/nginx.pid;

            3、worker_rlimit_nofile number;單個worker進程所能夠打開的最大文件數;


性能優化相關的配置

            1、worker_processes number | auto;

                   worker的進程數;通常應該爲CPU的核心數減1;

            2、worker_cpu_affinity cpumask ...;#指定worker進程運行在那顆cpu上

                worker_cpu_affinity auto [cpumask]; 1.8版本不支持auto

                               CPUMASK:cpu掩碼

                                        00000001      第0顆

                                        00000010      第1顆CPU

                                        00000100

                                        ...

範例:編輯配置文件添加:

                     worker_processes 2;#指定運行兩個worker_processes

                     Worker_cpu_affinity 0010 0100;

                     重新加載:nginx –s reload

                     查看worker運行在那顆cpu上:顯示命令,進程號,cpu,優先級

                          psaxo command,pid,psr,ni

            3、worker_priority nice;指明進程的優先級

                   [-20,19]對應的是100-139

調試、定位問題

1、daemon on | off;是否以守護進程方式啓動nginx進程;

守護進程:啓動在後臺運行

非守護進程:啓動在前臺消耗資源運行

            2、master_process on | off; 是否以master/worker模型啓動nignx進程;

            3、error_log file | stderr |syslog:server=address[,parameter=value] | memory:size [debug | info | notice |warn | error | crit | alert | emerg];#錯誤日誌文件的記錄方式,及其日誌級別:

            方式:

                   file /PATH/TO/SOME_LOG_FILE;      #日誌文件的路徑

                   stderr:                                            #發送到錯誤輸出;                                           syslog:server=address[,parameter=value]:#發送給syslog服務器;

                   memory:size                                     #記錄在內存中

            日誌級別:

                   debug依賴於configure時的--with-debug選項;

nginx.conf

main block;

event{

…}

     1、worker_connections number;每個worker進程所能夠併發打開的最大連接數;默認是512個

當前系統能響應的最大併發連接數:worker_processes *worker_connections

     2、use method;指明併發連接請求處理時使用的方法;

            use  epoll;

2、accept_mutex on | off;啓用時,表示用於讓多個worker輪流地、序列化地響應新請求;

http{

         }       

         定義套接字相關功能

     1、server { ... }

配置一個虛擬主機;

                   server {

                   listen PORT;

                   server_name  HOSTNAME;

                   root /PATH/TO/DOCUMENTROOT;

                   …}

注意:

            (1) 基於port的虛擬主機:

            listen指令要使用不同的端口;

            (2) 基於Hostname的虛擬主機;

            server_name指令指向不同的主機名;

            (3) 基於ip的虛擬主機:

            listen IP:PORT;

     2、listen address[:port] [default_server][ssl] [backlog=number] [rcvbuf=size] [sndbuf=size];

            listenport [default_server] [ssl];

            listenunix:path [default_server] [ssl] ;

            default_server:默認虛擬主機;

            ssl:限制只能通過ssl連接提供服務;

            backlog:後緩隊列的長度;

            rcvbuf:接收緩衝大小;

            sndbuf:發送緩衝區大小;

     3、server_name name ...;

            指明當前server的主機名;後可跟一個或空白字符分隔的多個主機;

支持使用*任意長度的任意字符;

支持~起始的正則表達式模式字符串;

應用策略:

             (1) 首先精確匹配;

             (2) 左則*通配符匹配;

             (3) 右側*通配符匹配;

             (4) 正則表達式模式匹配;

                   server_name  www.magedu.com;

                   server_name*.magedu.com;

                   server_name  www.magedu.*;

                   server_name~^.*\.magedu\..*$;

                   mail.magedu.com,www.magedu.com

     4、tcp_nodelay  on|off;

            對keepalived模式下的連接是否啓用TCP_NODELAY選項;


     5、sendfile on | off;

            是否啓用sendfile功能;

定義路徑相關配置

     6、root path;

            設置web資源路徑映射;用於指明用戶請求的url所對應的本地文件系統上的文檔所在目錄路徑;

可用上下文:http, server, location, if

     7、location [ = | ~ | ~* | ^~ ] uri { ...}

          location @name { ... }

          根據用戶請求的URI來匹配定義的location,匹配到時,此請求將被相應的location塊中的指令所處理;

     server {

            ...

            location {

            }

            location {

            ...

            }

            }

     =:URI精確匹配;

     ~:做正則表達式模式匹配,區分字符大小寫;

     ~*:做正則表達式模式匹配,不區分字符大小寫;

     ^~:對URI的左半部分做匹配檢查,不區分字符大小寫;

            匹配優先級:=、^~、~/~*、不帶符號;

     8、alias path;

            定義路徑別名,文檔映射的一種機制;僅能用於location上下文;


                          alias  /bbs/ /web/forum/


                          http://www.magedu.com/bbs/a.jpg          


                                 location  /bbs/ {

                                        alias  /web/forum/;

                                 }


                                 /web/forum/a.jpg


                                 location  /bbs/ {

                                        root  /web/forum/;

                                 }


                                 /web/forum/bbs/a.jpg



注意:

                                 root指令:給定的路徑對應於location中的/uri/左側的/;

                                 alias指令:給定的路徑對應於location中的/uri/右側的/;


9、index file ...;

可用位置:http, server, location


默認主面;


10、error_page code ... [=[response]] uri;

根據用戶請求的資源的http響應的狀態碼實現錯誤頁重定向;


                          http://www.magedu.com/hello.html--> 因爲資源不存在而被改爲對

                                 http://www.magedu.com/404.html


定義客戶端請求的相關配置


12、keepalive_timeout timeout[header_timeout];

設定保持連接的超時時長,0表示禁止長連接 ;默認爲75s;


13、keepalive_requests number;

在一次長連接上所允許請求的資源的最大數量,默認爲100;


14、keepalive_disable none | browser ...;

對哪種瀏覽器禁用長連接;


15、send_timeout time;

向客戶端發送響應報文的超時時長; 特別地,是指兩次寫操作之間的間隔時長;


16、client_body_buffer_size size;

用於接收客戶端請求報文的body部分的緩衝區大小;默認爲16k;超時此大小時,其將被暫存到磁盤上;


17、client_body_temp_path path [level1[level2 [level3]]];

設定用於存儲客戶端請求報文的body部分的臨時存儲路徑及子目錄結構和數量;


                          /var/tmp/body  2 1 2

                                 00-ff



對客戶的請求進行限制的相關配置

18、limit_rate rate;

限制響應給客戶端的傳輸速率,單位是bytes/second,0表示無限制;


19、limit_except method ... { ... };

限制對指定的請求方法之外的其它方法的使用客戶端;


                          limit_exceptGET POST {

                                 allow  172.18.0.0/16;

                                 denyall;

                          }


表示除了GET和POST之外的其它方法僅允許172.18.0.0/16中的主機使用;


文件操作優化的配置:

20、aio on | off | threads[=pool];

是否啓用aio功能;


21、directio size | off;


22、open_file_cache off;

                          open_file_cachemax=N [inactive=time];

                                 nginx可以緩存以下三種信息:

                                        (1)文件的描述符、文件大小和最近一次的修改時間;

                                        (2)打開的目錄的結構;

                                        (3)沒有找到的或者沒有權限訪問的文件的相關信息;


                                 max=N:可緩存的緩存項上限;達到上限後會使用LRU算法實現緩存管理;


                                 inactive=time:緩存項的超時時長,在此處指定的時長內未被命中的緩存項即爲非活動項;


23、open_file_cache_errors on | off;

是否緩存查找時發生錯誤的文件一類的信息;


24、open_file_cache_min_uses number;

在open_file_cache指令的inactive參數指定的時長內,至少命中此處指定的次數方可不被歸類到非活動項;


25、open_file_cache_valid time;

緩存項有效性的檢查頻率;默認是60s;


            ngx_http_access_module模塊:

實現基於ip的訪問控制功能;


26、allow address | CIDR | unix: | all;

27、deny address | CIDR | unix: | all;


可用上下文:http, server, location,limit_except


            ngx_http_auth_basic_module模塊:

28、auth_basic string | off;

使用basic機制進行用戶認證;


29、auth_basic_user_file file;

認證用的賬號密碼文件;


文件格式:

                                 name:password:commet


                          密碼格式:

                                 htpasswd命令;


                                 location/admin/ {

                                 auth_basic"Admin Area";

                                 auth_basic_user_file/etc/nginx/.ngxpasswd;

                                 }


            ngx_http_stub_status_module模塊:

用於輸出nginx的基本狀態信息;


                   Activeconnections: 1

                   serveraccepts handled requests

                   155155 298

                   Reading:0 Writing: 1 Waiting: 0              


                   Activeconnections:  處於活動狀態的客戶端連接的數量;

                   accepts:已經接受的客戶端請求的總數;

                   handled:已經處理完成的客戶端請求的總數;

                   requests:客戶端發來的總的請求數;

                   Reading:處於讀取客戶端請求報文首部的連接數;

                   Writing:處於向客戶端發送響應報文過程中的連接數;

                   Waiting:處於等待客戶端發出請求的空閒連接數;


            ngx_http_referer_module模塊:

                   Thengx_http_referer_module module is used to block access to a site for requestswith invalid values in the “Referer” header field.


 30、valid_referers none | blocked |server_names | string ...;

定義合法的referer數據;


         none:請求報文首部沒有referer首部;

         blocked:請求報文的referer首部沒有值;

         server_names:其值是主機名;

        arbitrarystring:直接字符串,可以使用*作爲通配符;

        regularexpression:被指定的正則表達式模式匹配到的字符串;要使用~起始;


        valid_referersnone blocked server_names *.magedu.com magedu.* ~\.magedu\.;


                          if($invalid_referer) {

                                 return403;

                          }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章