1. 程式人生 > >Nginx 服務器配置和詳解

Nginx 服務器配置和詳解

proxy erer 模塊 了解 bin 變量 linux 系統 auto 參數

目錄

  • Nginx 服務器配置和詳解
    • Nginx 模板配置
    • Nginx 模塊說明
      • 核心模塊
      • http 模塊

Nginx 服務器配置和詳解

Nginx 扮演 web 開發的服務端入口控制的角色,相比 Apache,Nginx 使用更少的資源,支持更多的並發連接,體現更高的效率。這需要開發人員對其配置有一定程度的了解,主要用到的是負載均衡和反向代理這兩項功能。

Nginx 模板配置

user  www www;

worker_processes  2;

pid /var/run/nginx.pid;

#[ debug | info | notice | warn | error | crit ]

error_log  /var/log/nginx.error_log  info;

events {
    worker_connections   2000;

    # use [ kqueue | epoll | /dev/poll | select | poll ];
    use kqueue;
}

http {

    include       conf/mime.types;
    default_type  application/octet-stream;


    log_format main      ‘$remote_addr - $remote_user [$time_local] ‘
                         ‘"$request" $status $bytes_sent ‘
                         ‘"$http_referer" "$http_user_agent" ‘
                         ‘"$gzip_ratio"‘;

    log_format download  ‘$remote_addr - $remote_user [$time_local] ‘
                         ‘"$request" $status $bytes_sent ‘
                         ‘"$http_referer" "$http_user_agent" ‘
                         ‘"$http_range" "$sent_http_content_range"‘;

    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;

    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    gzip on;
    gzip_min_length  1100;
    gzip_buffers     4 8k;
    gzip_types       text/plain;

    output_buffers   1 32k;
    postpone_output  1460;

    sendfile         on;
    tcp_nopush       on;
    tcp_nodelay      on;
    send_lowat       12000;

    keepalive_timeout  75 20;

    #lingering_time     30;
    #lingering_timeout  10;
    #reset_timedout_connection  on;


    server {
        listen        one.example.com;
        server_name   one.example.com  www.one.example.com;

        access_log   /var/log/nginx.access_log  main;

        location / {
            proxy_pass         http://127.0.0.1/;
            proxy_redirect     off;

            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            #proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;

            client_max_body_size       10m;
            client_body_buffer_size    128k;

            client_body_temp_path      /var/nginx/client_body_temp;

            proxy_connect_timeout      70;
            proxy_send_timeout         90;
            proxy_read_timeout         90;
            proxy_send_lowat           12000;

            proxy_buffer_size          4k;
            proxy_buffers              4 32k;
            proxy_busy_buffers_size    64k;
            proxy_temp_file_write_size 64k;

            proxy_temp_path            /var/nginx/proxy_temp;

            charset  koi8-r;
        }

        error_page  404  /404.html;

        location = /404.html {
            root  /spool/www;
        }

        location /old_stuff/ {
            rewrite   ^/old_stuff/(.*)$  /new_stuff/$1  permanent;
        }

        location /download/ {

            valid_referers  none  blocked  server_names  *.example.com;

            if ($invalid_referer) {
                #rewrite   ^/   http://www.example.com/;
                return   403;
            }

            #rewrite_log  on;

            # rewrite /download/*/mp3/*.any_ext to /download/*/mp3/*.mp3
            rewrite ^/(download/.*)/mp3/(.*)\..*$
                    /$1/mp3/$2.mp3                   break;

            root         /spool/www;
            #autoindex    on;
            access_log   /var/log/nginx-download.access_log  download;
        }

        location ~* \.(jpg|jpeg|gif)$ {
            root         /spool/www;
            access_log   off;
            expires      30d;
        }
    }
}

上述模板來自於 Nginx 官方示例

Nginx 模塊說明

核心模塊

控制整個 Nginx 的基本功能和程序配置

主模塊

user www www;
worker_processes 2;

error_log /var/log/nginx-error.log info;
...
  • user user [group]:定義運行 Nginx 的用戶和其所在組,該項默認 ser nobody nobody 可以使用默認配置。在 linux 系統上,一切皆文件,每個文件都有其訪問權限,如果訪問了權限外的文件,客戶端會接受到服務端 403 錯誤。不設置 group 則組名與用戶名一致。
  • worker_processes number | auto
    :工作進程數,一般與 cpu 核心數保持一致,可以設置為 auto,Nginx 可以自動調整為最佳個數。
  • error_log file [level]:日誌存放目錄,level 日誌輸出等級
  • pid file :進程 id 存儲位置
  • worker_cpu_affinity:工作進程與 cpu 綁定
worker_processes    4;
\\1表示對應cpu核心工作
worker_cpu_affinity 0001 0010 0100 1000;
  • worker_rlimit_nofile number:一個工作進程可打開的最大文件數,設置該值後 worker_connections 不能超過該值,理論上這個值是最多打開文件數(ulimit -n
    )與 Nginx 工作進程相除。

event 模塊

events {
    use kqueue;
    worker_connections 2048;
}
...
  • use method:事件模型,Linux 系統下設置有效,默認會找出最適合系統的事件模型,常用 use epoll
  • worker_connections number:設置最大並發連接數,該值不僅僅是與客戶端連接。通過 worker_connectionsworker_proceses 可以計算出 max_clients = worker_processes * worker_connections,作為反向代理,max_clients = worker_processes * worker_connections/4
  • multi_accept on | off:關閉時一個進程只接受一個連接,開啟時盡可能接受連接,連接放進監聽隊列

http 模塊

配置 http 服務相關

  • include:定義文件擴展名,該文件包含類型映射表
  • default_type:默認解析類型
  • limit_req_zone key zone=name:size rate=rate:如limit_req_zone $binary_remote_addr zone=limit:10m rate=1r/s;,10m 緩存,每秒僅允許統一 ip 訪問一次 超出頻率或者緩存超出則返回 503
  • sendfile on | off:開啟後 Nginx 使用零拷貝的方式輸出文件,一般設置為 on,對於磁盤 IO 重負債應用時可以設置 off
  • tcp_nopush on | off:激活 tcp_nopush 參數可以允許把 http response header 和文件的開始放在一個文件裏發布或者發送一個滿包的文件,傳輸大量數據有利,只有 sendfile 起效是才有作用
  • tcp_nodelay on | off:啟用後會禁用 Nagle 算法,盡快發送數據,Nginx 只會針對 keep-alive 狀態的起作用,該選項看似與tcp_nopush矛盾,但同時啟用產生的效果是先填滿包在盡快發送
  • keepalive_timeout:連接超時時間

upstream 模塊

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    #server 192.168.1.116  backup;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

該模塊主要完成負載均衡功能

  • server address [parameters]
  • weight:代表權重,權重越高被分配的記錄越大
  • max_conns:限制最大活動連接數,默認為 0,表示沒有限制
  • fail_timeout=time:與服務器通信失敗時長,默認 10 s
  • max_fails:設置在 fail_timeout 內連接到主機的失敗次數,超過該次數則認為該主機不可用

server 模塊

server {
    server_name ~^(www\.)?(.+)$;

    location / {
        root /sites/$2;
    }
}
  • listen:可設置為只是監聽 ip 地址,或者端口,也可以是兩者都有,也可以是主機名稱
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
  • server_name name ...:主機名稱,可以使用通配符,多個主機空格隔開

location 模塊

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

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

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

該模塊完成對請求分類處理

  • = 開頭表示精確匹配
  • 單個 / 表示通用匹配任何請求都能匹配到
  • ^~ 表示匹配 url 路徑
  • ~ 表示區分大小寫的正則匹配
  • ~* 表示不區分大小寫的正則匹配
  • !~ 表示區分大小寫的正則不匹配
  • !~* 表示不區分大小寫的正則不匹配

  • proxy_pass URL:代理服務器地址
  • proxy_set_header field value:代理請求頭設置,Nginx 可以重新定義或附加請求表頭
//主機名稱
proxy_set_header Host  $host;
//真實請求 ip,如果不存在該字段,則該$proxy_add_x_forwarded_for變量等於該$remote_addr變量。
proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
proxy_set_header  X-Real-IP  $remote_addr;  

Nginx 服務器配置和詳解