第二講 Nginx模塊詳解

本章要點

  • Nginx 配置文件結(jié)構(gòu)
  • 各個模塊的詳解

2.1 Nginx配置文件結(jié)構(gòu)

Nginx的配置文件nginx.conf位于其安裝目錄的conf目錄下。
nginx.conf由多個塊組成,最外面的塊是main雁歌,main包含Events和HTTP儿奶,HTTP包含upstream和多個Server眷射,Server又包含多個location镇辉,如圖:


nginxconf.png

main(全局設(shè)置)词身、server(主機(jī)設(shè)置)厅目、upstream(負(fù)載均衡服務(wù)器設(shè)置)和 location(URL匹配特定位置的設(shè)置)。
● main塊設(shè)置的指令將影響其他所有設(shè)置法严;
● server塊的指令主要用于指定主機(jī)和端口损敷;
● upstream指令主要用于負(fù)載均衡,設(shè)置一系列的后端服務(wù)器深啤;
● location塊用于匹配網(wǎng)頁位置拗馒。
這四者之間的關(guān)系式:server繼承main,location繼承server溯街,upstream既不會繼承其他設(shè)置也不會被繼承诱桂。
在這四個部分當(dāng)中,每個部分都包含若干指令呈昔,這些指令主要包含Nginx的主模塊指令挥等、事件模塊指令、HTTP核心模塊指令堤尾,同時每個部分還可以使用其他HTTP模塊指令肝劲,例如Http SSL模塊、HttpGzip Static模塊和Http Addition模塊等郭宝。
上面提到過nginx配置文件中主要包括六塊:main辞槐,events,http剩蟀,server,location切威,upstream
main塊:主要控制nginx子進(jìn)程的所屬用戶/用戶組育特、派生子進(jìn)程數(shù)、錯誤日志位置/級別先朦、pid位置缰冤、子進(jìn)程優(yōu)先級、進(jìn)程對應(yīng)cpu喳魏、進(jìn)程能夠打開的文件描述符數(shù)目等
events塊:控制nginx處理連接的方式
http塊:是nginx處理http請求的主要配置模塊棉浸,大多數(shù)配置都在這里面進(jìn)行
server塊:是nginx中主機(jī)的配置塊,可以配置多個虛擬主機(jī)
location塊:是server中對應(yīng)的目錄級別的控制塊刺彩,可以有多個
upstream塊:是nginx做反向代理和負(fù)載均衡的配置塊迷郑,可以有多個

2.2 各個模塊詳解

下面復(fù)制一下最原始配置文件ngin.conf中的內(nèi)容:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

2.2.1 main 模塊

main.png

  • user zhaosc zhaoscgroup;:nginx的用戶枝恋,用戶組
  • worker_processes 1; #啟動進(jìn)程數(shù),根據(jù)硬件調(diào)整嗡害,通常等于CPU數(shù)量或者2倍于CPU焚碌。
  • worker_cpu_affinity 00000001 00000010 00000100 00001000; #CPU邏輯數(shù),為每個進(jìn)程分別綁在CPU上面霸妹,為每個進(jìn)程分配一個CPU十电。
    注釋:它用的是二進(jìn)制表示,0001表示啟用第一個CPU內(nèi)核叹螟,0010表示啟用第二個CPU內(nèi)核鹃骂,依此類推;worker_processes最多開啟8個罢绽,8個以上性能提升不會再提升了畏线,而且穩(wěn)定性變得更低,所以8個進(jìn)程夠用了有缆。
  • worker_rlimit_nofile 102400; #這個指令當(dāng)一個進(jìn)程打開的最大文件數(shù)目象踊,與NGINX并發(fā)連接有關(guān)系
  • error_log logs/error.log;
    error_log logs/error.log notice;
    error_log logs/error.log info;#錯誤日志:存放路徑,[ debug | info | notice | warn | error | crit ] 棚壁,默認(rèn)值是error
  • pid logs/nginx.pid; #pid(進(jìn)程標(biāo)識符):存放路徑

2.2.2 events模塊

events.png

  • use epoll; #多路復(fù)用IO 基于LINUX2.6以上內(nèi)核杯矩,可以大大提高NGINX的性能,可選值有:use [ kqueue | rtsig | epoll | /dev/poll | select | poll | eventport ]
  • worker_connections 2000;#工作進(jìn)程的最大連接數(shù)量 理論上每臺nginx服務(wù)器的最大連接數(shù)為worker_processes*worker_connections worker_processes為我們再main中開啟的進(jìn)程數(shù)
  • client_header_buffer_size 4k;客戶端請求頭部的緩沖區(qū)大小袖外,這個可以根據(jù)你的系統(tǒng)分頁大小來設(shè)置史隆,一般一個請求頭的大小不會超過1k,不過由于一般系統(tǒng)分頁都要大于1k曼验,所以這里設(shè)置為系統(tǒng)分頁大小泌射。查看系統(tǒng)分頁可以使用 getconf PAGESIZ。在這里容量4K鬓照,如果header頭信息請求超過了熔酷,nginx會直接返回400錯誤,先根據(jù)client_header_buffer_size配置的值分配一個buffer豺裆,如果分配的buffer無法容納 request_line/request_header拒秘,那么就會再次根據(jù)large_client_header_buffers配置的參數(shù)分配large_buffer,如果large_buffer還是無法容納臭猜,那么就會返回414(處理request_line)/400(處理request_header)錯誤躺酒。
  • open_file_cache max=2000 inactive=60s;
    為打開文件指定緩存,默認(rèn)是沒有啟用的蔑歌,max指定緩存最大數(shù)量羹应,建議和打開文件數(shù)一致,inactive是指經(jīng)過多長時間文件沒被請求后刪除緩存 打開文件最大數(shù)量為我們再main配置的worker_rlimit_nofile參數(shù)
  • open_file_cache_valid 60s;這個是指多長時間檢查一次緩存的有效信息次屠。如果有一個文件在inactive時間內(nèi)一次沒被使用园匹,它將被移除
  • open_file_cache_min_uses 1;open_file_cache指令中的inactive參數(shù)時間內(nèi)文件的最少使用次數(shù)雳刺,如果超過這個數(shù)字,文件描述符一直是在緩存中打開的偎肃,如果有一個文件在inactive時間內(nèi)一次沒被使用煞烫,它將被移除。
  • accept_mutex語法:accept_mutex [ on | off ] 默認(rèn)值:on Nginx使用連接互斥鎖進(jìn)行順序的accept()系統(tǒng)調(diào)用
  • accept_mutex_delay 語法:accept_mutex_delay Nms; 默認(rèn)值:500ms 如果一個進(jìn)程沒有互斥鎖累颂,它將至少在這個值的時間后被回收

2.2.3 http模塊

http.png
  • include mime.types;#引用mime.types,這個類型定義了很多滞详,當(dāng)web服務(wù)器收到靜態(tài)的資源文件請求時,依據(jù)請求文件的后綴名在服務(wù)器的MIME配置文件中找到對應(yīng)的MIME Type紊馏,根據(jù)MIMETYPE設(shè)置并response響應(yīng)類型(Content-type)料饥,指定默認(rèn)類型為二進(jìn)制流,也就是當(dāng)文件類型未定義時使用這種方式朱监,此時岸啡,用瀏覽器訪問JSP文件就會出現(xiàn)下載窗口

  • default_type application/octet-stream;#定義的數(shù)據(jù)流,有的時候默認(rèn)類型可以指定為text,這跟我們的網(wǎng)頁發(fā)布還是資源下載是有關(guān)系的

  • fastcgi_intercept_errors on; #表示接收fastcgi輸出的http1.0 response code

  • server_names_hash_bucket_size 128; #保存服務(wù)器名字的hash表 #could not build the server_names_hash, you should increase server_names_hash_bucket_size: 64

  • client_header_buffer_size 4k;#用來緩存請求頭信息的赫编,容量4K

  • large_client_header_buffers 4 32k;巡蘸,如果header頭信息請求超過了,nginx會直接返回400錯誤擂送,先根據(jù)client_header_buffer_size配置的值分配一個buffer悦荒,如果分配的buffer無法容納request_line/request_header,那么就會再次根據(jù)large_client_header_buffers配置的參數(shù)分配large_buffer嘹吨,如果large_buffer還是無法容納搬味,那么就會返回414(處理request_line)/400(處理request_header)錯誤。

  • client_max_body_size 300m; #允許客戶端請求的最大單文件字節(jié)數(shù)

  • sendfile on; #指定NGINX是否調(diào)用這個函數(shù)來輸出文件蟀拷,對于普通的文件我們必須設(shè)置為ON碰纬,如果NGINX專門做為一個下載端的話可以關(guān)掉,好處是降低磁盤與網(wǎng)絡(luò)的IO處理數(shù)及系統(tǒng)的UPTIME

  • autoindex on;開啟目錄列表訪問问芬,適合下載服務(wù)器

  • tcp_nopush on; #防止網(wǎng)絡(luò)阻塞

  • keepalive_timeout 60;#非常重要悦析,根據(jù)實際情況設(shè)置值,超時時間此衅,客戶端到服務(wù)端的連接持續(xù)有效時間强戴,60秒內(nèi)可避免重新建立連接,時間也不能設(shè)太長炕柔,太長的話酌泰,若請求數(shù)10000媒佣,都占用連接會把服務(wù)托死

  • tcp_nodelay on;#提高數(shù)據(jù)的實時響應(yīng)性

  • client_body_buffer_size 512k; #緩沖區(qū)代理緩沖用戶端請求的最大字節(jié)數(shù)(請求多)

  • proxy_connect_timeout 5; #nginx跟后端服務(wù)器連接超時時間(代理連接超時)

  • proxy_read_timeout 60; #連接成功后匕累,后端服務(wù)器響應(yīng)時間(代理接收超時)

  • proxy_send_timeout 5; #后端服務(wù)器數(shù)據(jù)回傳時間(代理發(fā)送超時)

  • proxy_buffer_size 16k; #設(shè)置代理服務(wù)器(nginx)保存用戶頭信息的緩沖區(qū)大小

  • proxy_buffers 4 64k;#proxy_buffers緩沖區(qū),網(wǎng)頁平均在32k以下的話默伍,這樣設(shè)置

  • proxy_busy_buffers_size 128k; #高負(fù)荷下緩沖大小

  • proxy_temp_file_write_size 128k; #設(shè)定緩存文件夾大小欢嘿,大于這個值衰琐,將從upstream服務(wù)器傳

  • gzip on; #NGINX可以壓縮靜態(tài)資源,比例我的靜態(tài)資源有10M炼蹦,壓縮后只有2M羡宙,那么瀏覽器下載的就少了

  • gzip_min_length 1k;

  • gzip_buffers 4 16k;

  • gzip_http_version 1.1;

  • gzip_comp_level 2;#壓縮級別大小,最小1掐隐,最大9狗热,值越小,壓縮后比例越小虑省,CPU處理更快匿刮,為1時,原10M壓縮完后8M探颈,但設(shè)為9時熟丸,壓縮完可能只有2M了

  • gzip_types text/plain application/x-javascript text/css application/xml; 壓縮類型:text,js css xml 都會被壓縮

  • gzip_vary on; #作用是在http響應(yīng)中增加一行目的是改變反向代理服務(wù)器的緩存策略

  • log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    '$status $body_bytes_sent "$http_referer" '
    '"$http_user_agent" $request_time';
    日志格式 "$request" ' #ip 遠(yuǎn)程用戶 當(dāng)?shù)貢r間 請求URL
    '$status $body_bytes_sent "$http_referer" ' #狀態(tài) 發(fā)送的大小 響應(yīng)的頭
    '"$http_user_agent" $request_time'; #客戶端使用的

2.2.4 server模塊

server.png
  • listen :所監(jiān)聽的端口
  • server_name 配置訪問域名,可以有多個直接用空格隔開伪节,也可以用正則表達(dá)式
  • charset:編碼集
  • access_log :正常訪問日志所在的目錄

2.2.5 upatream 模塊
upstream 比較簡單,用于處理服務(wù)器的負(fù)載均衡光羞,實例如下:
先配置upstream 模塊

upstream zhaosc { 
      server 192.168.1.100:8080; 
      server 192.168.1.200:8080; 
}

然后,配置location,將 proxy_pass配置為:http:// + upstream名稱

location / { 
            root  html; 
            index  index.html index.htm; 
            proxy_pass http://zhaosc; 
}

nginx 負(fù)載均衡的算法是輪詢怀大,同時還支持權(quán)重(weight)機(jī)制纱兑,如下:

upstream zhaosc{ 
      server 192.168.1.100:8080  weight=5; 
      server 192.168.1.200:8080  weight=10; 
}

ip_hash如下:

upstream zhaosc{ 
      ip_hash; 
      server 192.168.1.100:8080; 
      server 192.168.1.200:8080; 
}

fair: 按后端服務(wù)器的響應(yīng)時間來分配請求。響應(yīng)時間短的優(yōu)先分配叉寂。
與weight分配策略相似萍启。

 upstream zhaosc{      
      server 192.168.1.100:8080; 
      server 192.168.1.200:8080; 
      fair; 
}

url_hash:按訪問url的hash結(jié)果來分配請求,使每一個url定向到同一個后端服務(wù)器屏鳍。后端服務(wù)器為緩存時比較有效勘纯。
注意:在upstream中加入hash語句。server語句中不能寫入weight等其他的參數(shù)钓瞭,hash_method是使用的hash算法驳遵。

 upstream zhaosc{ 
      server 192.168.1.100:8080; 
      server 192.168.1.200:8080;  
      hash $request_uri; 
      hash_method crc32; 
}

upstream還可以為每個設(shè)備設(shè)置狀態(tài)值,這些狀態(tài)值的含義分別如下:

  • down 表示單前的server暫時不參與負(fù)載.
  • weight 默認(rèn)為1.weight越大山涡,負(fù)載的權(quán)重就越大堤结。
  • max_fails :允許請求失敗的次數(shù)默認(rèn)為1.當(dāng)超過最大次數(shù)時,返回proxy_next_upstream 模塊定義的錯誤.
  • fail_timeout : max_fails次失敗后鸭丛,暫停的時間竞穷。
  • backup: 其它所有的非backup機(jī)器down或者忙的時候,請求backup機(jī)器鳞溉。所以這臺機(jī)器壓力會最輕瘾带。
upstream zhaosc{ #定義負(fù)載均衡設(shè)備的Ip及設(shè)備狀態(tài) 
      ip_hash; 
      server 192.168.1.100:9090 down; 
      server 192.168.1.100:8080 weight=2; 
      server 192.168.1.100:6060; 
      server 192.168.1.100:7070 backup; 
}

由于location模塊內(nèi)容比較多,所以重開一篇熟菲,下一節(jié)詳細(xì)介紹看政。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末朴恳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子允蚣,更是在濱河造成了極大的恐慌于颖,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嚷兔,死亡現(xiàn)場離奇詭異森渐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)冒晰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門章母,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人翩剪,你說我怎么就攤上這事乳怎。” “怎么了前弯?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵蚪缀,是天一觀的道長。 經(jīng)常有香客問我恕出,道長询枚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任浙巫,我火速辦了婚禮金蜀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘的畴。我一直安慰自己渊抄,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布丧裁。 她就那樣靜靜地躺著护桦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪煎娇。 梳的紋絲不亂的頭發(fā)上二庵,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機(jī)與錄音缓呛,去河邊找鬼催享。 笑死,一個胖子當(dāng)著我的面吹牛哟绊,可吹牛的內(nèi)容都是我干的因妙。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼兰迫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炬称,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤汁果,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后玲躯,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體据德,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年跷车,在試婚紗的時候發(fā)現(xiàn)自己被綠了棘利。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡朽缴,死狀恐怖善玫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情密强,我是刑警寧澤茅郎,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站或渤,受9級特大地震影響系冗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜薪鹦,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一掌敬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧池磁,春花似錦奔害、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至离斩,卻和暖如春银舱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背跛梗。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工寻馏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人核偿。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓诚欠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子轰绵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348