1. 程式人生 > >nginx作為http服務器常用模塊

nginx作為http服務器常用模塊

epoll handle aid error_log 通配符 元數據 端口 method 等於

1、詳細描述常見nginx常用模塊和模塊的使用示例

常用模塊:
1.nginx核心功能模塊(Core functionality)
accept_mutex on|off; #Context:events
這個指令的意義:當一個新連接或者說用戶請求到達nginx服務時,如果accept_mutex為on,
那麽多個worker將以串行方式來處理,其中一個worker會被激活,其他worker繼續保持休眠狀態,
如果accept_mutex為off,那麽所有的worker將會被喚醒,但只有一個worker會獲取新連接,其他worker會重新休眠。
這可以算是驚群問題吧。當網站並發量很大時,可以設置為off,

    error_log
        錯誤日誌文件路徑,錯誤記錄等級,等級從低到高為debug, info, notice, warn, error, crit, alert, emerg
        例:error_log /var/log/nginx/error.log;

    events
        用來指定nginx的工作模式及連接數上限
        例:events {
                use epoll; #使用epoll I/O傳輸模型
                worker_connections  1024; #每個worker允許的最大用戶請求數
                    }

    ***worker_connections #Context:events
        每一個worker進程能並發處理(發起)的最大連接數,並不是越大越好
        ***需要深入理解的優化選項

    worker_cpu_affinity
        將worker進程固定在指定的CPU(或核心)中,因為nginx默認是隨機分配cpu(或核心)的,
        此設置可將nginx進程固定在指定的CPU(或核心)上,以加快處理速度降低出錯率。
        例:worker_processes    4;
            worker_cpu_affinity 0001 0010 0100 1000;

    worker_priority
        讓worker以指定nice值工作,-20~19 nice值越高就會優先獲取CPU資源;
        nginx默認狀態下的nice值為0

    worker_processes
        設置nginx的work process的數量,推薦設置為等於或略小於CPU的核心數,
        因為若設置為大於CPU的核心數時會產生擁擠,範圍會影響性能,若設置成auto,默認數量為CPU的核心數

    include file | mask;
        將指定的文件包含在配置中,nginx運行時會自動加載
        例:include vhost/*.conf

    master_process on | off;
        確認master process的開啟狀態。

    multi_accept on | off; #Context:events
        當multi_accept為on時,所有的新連接情求將同時被worker process同時接收處理,
        當multi_accept為off時,worker process一次只接收處理一個新連接
        默認為off

    pid
        設置nginx主進程ID文件位置
        例:pid log/nginx.pid;

    use
        設置進程連接的方式。值得註意的是此項一般不做設置,因為nginx會自動選擇最適合系統的方式。
        There is normally no need to specify it explicitly, because nginx will by default use the most efficient method.

    user
        指定nginx主進程的用戶及組

2.http核心功能模塊(ngx_http_core_module)
    alias #Context:location
        alias表示路徑別名,alias後面接路徑,也就是用戶訪問的真正路徑,一般用在location環境下
        例:location /i/ {
            alias /data/w3/images/; #一定要記得結尾加/
                        }
        當用戶請求為路徑URI/i/時,實際訪問的是URI/data/w3/images/
        此處可深入對比root與alias的區別:
        1.root指定的是location匹配訪問的path目錄的上一級目錄,也可以理解為location匹配訪問的起始根目錄
        2.alias指定的是location匹配訪問的path目錄的真正目錄路徑,而location後是path目錄別名
        3.對於root來說,location後的path目錄必須真實存在
        4.對於alias來說,location後的path目錄可以不存在
        5.alias只能用在location中,而root可用在    http,server,location,if in location中
        6.有網友建議
            1)在location /中配置root目錄;
            2)在location /path中配置alias虛擬目錄。

    listen #Context:server
        設置監聽IP的地址和端口,一般只需設置ip和端口
        例:
        listen 127.0.0.1:8000;
        listen 127.0.0.1;
        listen 8000;
        listen *:8000;
        listen localhost:8000;
        擴展設置:listen address[:port] [default_server] [ssl] [http2 | spdy]  [backlog=number] [rcvbuf=size] [sndbuf=size]
            default_server:設定為默認虛擬主機;
            ssl:限制僅能夠通過ssl連接提供服務;
            backlog=number:後援隊列長度;
            rcvbuf=size:接收緩沖區大小;
            sndbuf=size:發送緩沖區大小;

    server #Context:http
        用來定義虛擬主機,格式為server { ... }

    server_name #Context:server
        設置虛擬主機的主機名,可使用正則表達式進行匹配
        例:server {
                server_name  ~^(www\.)?(.+)$;
                index index.php index.html;
                root  /nginx/$2;
                    }
            這裏用到了正則表達式後向引用的知識,可以實現在一個server中配置多個站點,
            當輸入站點www.fff.com時對應站點的主目錄為/nginx/fff.com目錄
            當輸入站點www.ddd.org時對應站點的主目錄為/nginx/ddd.com目錄
            目錄必須存在

    tcp_nodelay on|off; #Context:http, server, location       
        只在keepalived下開啟有效,長連接時不做報文打包發送,不產生延遲(delay)

    tcp_nopush on|off; #Context:http, server, location
        在 nginx 中,tcp_nopush 配置和 tcp_nodelay "互斥"。它可以配置一次發送數據的包大小。也就是說,它不是按時間累計  0.2 秒後發送包,而是當包累計到一定大小後就發送。
        在 nginx 中,tcp_nopush 必須和 sendfile 搭配使用。

    sendfile #Context:http, server, location, if in location
        此選項可提高web服務器的傳輸性能,不使用sendfile的傳統網絡傳輸:
            read(file,tmp_buf, len);
            write(socket,tmp_buf, len);
            硬盤 --> kernel buffer --> user buffer --> kernel socket buffer --> 協議棧
        使用sendfile的網絡傳輸:
            sendfile(socket,file, len);
            硬盤 --> kernel buffer (快速拷貝到kernelsocket buffer) --> 協議棧
        sendfile省去了很多中間過程,從而提高了傳輸速度

    keepalive_timeout
        keepalive的超時時間
        例:keepalive 75s;

    root #Context:http, server, location, if in location
        設置站點的根目錄

    location #Context: server, location
        根據用戶請求的URI做訪問邏輯的設置,location下的root比server下的root有更高的優先權?
        例:
        location = / {
        [ configuration A ]
                    }

        location / {
        [ configuration B ]
        }

        location /documents/ {
        [ configuration C ]
        }

        location ^~ /images/ {
        [ configuration D ]
        }

        location ~* \.(gif|jpg|jpeg)$ {
        [ configuration E ]
        }

    error_page #Context:http, server, location, if in location
        設置當用戶請求發生錯誤時nginx反饋給用戶錯誤顯示的URI
        設置方法有多種:
            例:1. error_page 502 503  /50x.html; #當訪問出現502 503錯誤時,就向用戶反饋50x.html的內容
                2. error_page 502 503 =200 /50x.html; #當訪問出現502 503時,向用戶反饋狀態碼為200,並反饋50x.html的內容
                                                        50x.html可替換為其他內容,如jpg,gif,php文件
                3. error_page 404 = http://www.baidu.com; #當訪問出現404錯誤時,將用戶請求跳轉至百度主頁
                4. location / {
                        error_page 404 = @fallback;
                                }

                        location @fallback {
                            proxy_pass http://backend;
                                }

    keepalive_timeout
        設置長連接的超時時間,設置0時表示關閉長連接,默認為75s
            例:keepalive_timeout 40s;

    keepalive_disable none | browser ...;
        設置禁止長連接的瀏覽器

    keepalive_requests
        設置一次長連接允許的最大請求數,默認為100

    client_body_buffer_size # Context:http, server, location
        body是指報文的主體部分,此選項用於設置接收客戶端請求報文的body部分的緩沖區大小,
        默認為16k,一旦超過設置的值,便會發起磁盤I/O,影響站點性能,
        只有在允許用戶請求或上傳大於16k數據時,才有必要調整此項,
        但當用戶上傳數據大到不得不直接儲存在磁盤上時則需使用client_body_temp_path

    client_body_temp_path # Context:http, server, location
        這裏涉及到了當用戶較多且用戶存放文件較多時,各用戶如何快速準確的找到各自存放在站點的文件的問題。
        此選項可設置文件分級存放,
            例:client_body_temp_path /var/tmp/client_body 2 1 1
                #用戶存放主目錄為/var/tmp/client_body 創建16*16個一級子目錄,
                每個一級子目錄下創建16個二級子目錄,每個二級子目錄下創建16個三級子目錄
                這是一種算法機制,為用戶訪問磁盤數據時提供一種快捷的路徑路由機制

    aio on|off
        aio是指異步非阻塞IO模型,在nginx第一講中有詳細介紹

    open_file_cache Context:http, server, location
        用於設置服務器訪問頻率較高文件的元數據緩存,將訪問頻率較高的文件緩存至內存中,
        當用戶訪問時不需要再進行磁盤查找,可直接根據文件的元數據找到文件進行下一步操作,
        大大提升了用戶訪問效率。
            例:open_file_cache off;
                open_file_cache max=1000 inactive=20s; #最大緩存1000個緩存項 緩存項的非活動時長20s,受open_file_cache_min_uses選項的影響,在設定時間內訪問命中數少於open_file_cache_min_uses設置數時,緩存將被清理

    open_file_cache_uses
        參照open_file_cache
            例:open_file_cache          max=1000 inactive=20s;
                open_file_cache_valid    30s;
                open_file_cache_min_uses 2;
                open_file_cache_error on; #是否緩存查找時發生錯誤的文件信息的

3.基於IP的訪問控制模塊(ngx_http_access_module)
    allow
        允許訪問
    deny
        拒絕訪問

          例:location / {
                deny  192.168.1.1;
                allow 192.168.1.0/24;
                allow 10.1.1.0/16;
                allow 2001:0db8::/32;
                deny  all; }       

4.基於用戶登錄的訪問控制模塊(ngx_http_auth_basic_module)
    auth_basic #Context:http, server, location, limit_except
        反饋給用戶的服務器認證信息,必須與auth_basic_user_file配合使用

    auth_basic_user_file
        設置用戶認證文件的路徑,配置用戶認證的用戶名與密碼可用httpd-tools來實現
            1.yum -y install httpd-tools #安裝httpd-tools
            2.htpasswd -c -m /etc/nginx/.ngxpwd ready #指定密碼文件路徑與文件名,用戶名為ready
        例:server {
                server_name www.hhh.com;
                root /nginx/test2/;
                location ~* ^/(login|admin) {
                    #alias /admin/; #為何加此項會訪問不成功,改為location /login/卻會訪問成功?
                    auth_basic "why?";
                    auth_basic_user_file /etc/nginx/.ngxpwd;
                    }   #root路徑下用戶請求以admin或login開頭時,都會出現用戶認證
5.nginx訪問狀態模塊(ngx_http_stub_status_module)                }
    stub_status
        可以查看nginx的狀態信息,此信息一定要保密,可單獨創建一個location再配合auth_basic_user_file與auth_basic使用
        例:
            location /abc {
                stub_status;
                auth_basic "why?";
                auth_basic_user_file /etc/nginx/.ngxpwd;
                    }
        輸出示例:
            Active connections: 3  #當前的活動鏈接數
            server accepts handled requests #accept已經接受的用戶請求數,handled已經處理完成的用戶請求數,requests總請求數
                   303     303     2533
            Reading: 0 Writing: 1 Waiting: 2 #Reading:處於讀取客戶端請求報文首部的連接的連接數;
                                             #Writing:處於向客戶端發送響應報文過程中的連接數;
                                             #Waiting:處於等待客戶端發出請求的空閑連接數

6.nginx訪問日誌模塊(ngx_http_log_module)
    access_log #Context:http, server, location, if in location, limit_except
        設置訪問日誌路徑,可在全局設置,也可在server,location等中做精細設置,便於不同主機的訪問精細管理
        也可壓縮打包處理
            例:access_log /path/to/log.gz combined gzip  buffer=16k flush=5m;
                #buffer可設置訪問日誌的緩沖區大小,flush為刷新周期

    log_format
        定義訪問日誌的格式
            例:log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
                                  ‘$status $body_bytes_sent "$http_referer" ‘
                                  ‘"$http_user_agent" "$http_x_forwarded_for"‘;

7.ngx_http_gzip_module
    nginx中gzip的主要作用就是用來減輕服務器的帶寬問題,經過gzip壓縮後的頁面大小可以變為原來的30%甚至更小,
    這樣用戶瀏覽頁面時的速度會快很多。gzip的壓縮頁面需要瀏覽器和服務器雙方都支持,實際上就是服務器端壓縮,
    傳到瀏覽器後瀏覽器解壓縮並解析。目前的大多數瀏覽器都支持解析gzip壓縮過的頁面。默認為off
        例:gzip            on;
            gzip_comp_level 2; #壓縮等級,默認為1
            gzip_min_length 1000; #啟用壓縮功能的臨界值
            gzip_proxied    expired no-cache no-store private auth;
            gzip_types      text/plain application/xml;

8.https服務模塊(ngx_http_ssl_module)                                 
    ssl on | off;
        開啟/關閉ssl服務
    例:
    server {
        listen 443 ssl;
        server_name www.hhh.com;
        root /nginx/test2/;
        access_log /var/log/nginx/ssl_access.log main;

        ssl on;
        ssl_certificate /etc/pki/nginx/server.crt; #證書存放路徑
        ssl_certificate_key /etc/pki/nginx/private/server.key; #私鑰存放路徑
        ssl_session_cache shared:SSL:1m; #在各worker之間啟用大小為1m的共享緩存,可提高緩存利用率,1m可緩存4000個回話
        ssl_protocols sslv3 TLSv1 tlsv1.1 tlsv1.2; #設置支持的ssl協議
        ssl_session_timeout 10m; #設置共享緩存的超時時間

9.nginx URL重寫模塊,rewrite模塊(ngx_http_rewrite_module)
    根據用戶請求的URL按一定規則進行重新替換或定向,使用戶請求跳轉至規則定制的URL
        例:server {
                server_name www.fff.com;
                location  /alais/ {
                alias /nginx/ta/;
                index index.html index.htm;
                rewrite /(.*)\.png$ http://www.fff.com/$1.jpg; #將用戶輸入以.png結尾的請求全部替換為.jpg結尾的請求
                rewrite /(.*)$ https://www.fff.com/$1; #將用戶請求全部重寫為https協議並返回請求
                        }
                    }
    rewrite規則默認會自上而下一次匹配執行,當第一條rewrite執行後,會將新URL再重新在location中檢查一遍,直到沒有匹配的rewrite,
    這樣可能會產生死循環,因為rewrite結尾默認有一個last標識,也可在結尾改為其他標識實現不提功能
        1.last #只要有新URL就會使用此標識結尾的規則檢查一次
        2.break #檢查若匹配就執行並不再執行後面的rewrite規則
        3.redirect #反饋給用戶302響應碼並將新定向的URL,讓客戶端自己請求新定向的URL
        4.permanent #與redirect不同的是,permanent是永久重定向

10.防盜鏈模塊(ngx_http_referer_module)
    **#再打開某些網站時,會出現類似"此圖片僅允許xx網內部使用"的圖片提示,這就是基於此模塊來實現防盜鏈的一種方法
    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 http://www.magedu.com/invalid.jpg;

nginx作為http服務器常用模塊