1. 程式人生 > 實用技巧 >nginx配置檔案詳解(2)

nginx配置檔案詳解(2)

1、nginx全域性變數

  • $args:這個變數等於請求行中的引數,同$query_string。
  • $is_args: 如果已經設定$args,則該變數的值為"?",否則為""。
  • $content_length: 請求頭中的Content-length欄位。
  • $content_type: 請求頭中的Content-Type欄位。
  • $document_uri: 與$uri相同。
  • $document_root: 當前請求在root指令中指定的值。
  • $host: 請求主機頭欄位,否則為伺服器名稱。
  • $http_user_agent: 客戶端agent資訊。
  • $http_cookie: 客戶端cookie資訊。
  • $limit_rate: 這個變數可以限制連線速率。
  • $request_method: 客戶端請求的動作,通常為GET或POST。
  • $remote_addr: 客戶端的IP地址。
  • $remote_port: 客戶端的埠。
  • $remote_user: 已經經過Auth Basic Module驗證的使用者名稱。
  • $request_body_file`: 客戶端請求主體的臨時檔名。
  • $request_uri: 請求的URI,帶引數
  • $request_filename: 當前請求的檔案路徑,由root或alias指令與URI請求生成。
  • $scheme: 所用的協議,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;
  • $server_protocol: 請求使用的協議,通常是HTTP/1.0或HTTP/1.1。
  • $server_addr: 伺服器地址,在完成一次系統呼叫後可以確定這個值。
  • $server_name: 伺服器名稱。
  • $server_port: 請求到達伺服器的埠號。
  • $request_uri: 包含請求引數的原始URI,不包含主機名,如:/foo/bar.php?arg=baz,它無法修改。
  • $uri: 不帶請求引數的當前URI,$uri不包含主機名,如/foo/bar.html可能和最初的值有不同,比如經過重定向之類的。它可以通過內部重定向,或者使用index指令進行修改。不包括協議和主機名,例如/foo/bar.html。

2、總述

nginx配置檔案主要分為四個部分

  • main(全域性設定)
  • http ( )
  • upstream(負載均衡伺服器設定)
  • server(主機設定)
  • location(URL匹配特點位置的設定)

server部分的指令主要用於指定主機和埠,upstream指令主要用於負載均衡和設定一系列的後端伺服器,location部分用於匹配網頁位置位置。
關係如下:
server繼承main,location繼承server,upstream即不會繼承其他設定也不會被繼承。

3、main 全域性配置

nginx在執行時與具體業務功能(比如http服務或者email服務代理)無關的一些引數,比如工作程序數,執行的身份等。

user  www www;
worker_processes 4;
worker_cpu_affinity 0001 0010 0100 1000;
error_log  /data/logs/nginx_error.log  crit;
pid        /usr/local/webserver/nginx/nginx.pid;
worker_rlimit_nofile 65535;
  • user www www;: 指定nginx程序使用什麼使用者啟動
  • worker_processes 4;: 指定啟動多少程序來處理請求,一般情況下設定成CPU的核數,如果開啟了ssl和gzip更應該設定成與邏輯CPU數量一樣甚至為2倍,可以減少I/O操作。使用grep ^processor /proc/cpuinfo | wc -l檢視CPU核數。
  • worker_cpu_affinity 0001 0010 0100 1000;: 在高併發情況下,通過設定將CPU和具體的程序繫結來降低由於多核CPU切換造成的暫存器等現場重建帶來的效能損耗。如worker_cpu_affinity 0001 0010 0100 1000; (四核)。
  • error_log /var/logs/nginx_error.log crit;: error_log是個主模組指令,用來定義全域性錯誤日誌檔案。日誌輸出級別有debug、info、notice、warn、error、crit可供選擇,其中,debug輸出日誌最為最詳細,而crit輸出日誌最少。
  • pid /usr/local/webserver/nginx/nginx.pid;: 指定程序pid檔案的位置。
  • worker_rlimit_nofile 65535;: 用於指定一個nginx程序可以開啟的最多檔案描述符數目,這裡是65535,需要使用命令“ulimit -n 65535”來設定。

4、events模組

events{
  use epoll;
  worker_connections      65536;
}
  • use epoll;use是個事件模組指令,用來指定Nginx的工作模式。Nginx支援的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是標準的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平臺上,而kqueue用在BSD系統中。對於Linux系統,epoll工作模式是首選。在作業系統不支援這些高效模型時才使用select。
  • worker_connections 65536;每一個worker程序能併發處理(發起)的最大連線數(包含與客戶端或後端被代理伺服器間等所有連線數)。nginx作為反向代理伺服器,計算公式最大連線數 = worker_processes * worker_connections/4,所以這裡客戶端最大連線數是65536,這個可以增到到8192都沒關係,看情況而定,但不能超過後面的worker_rlimit_nofile。當nginx作為http伺服器時,計算公式裡面是除以2。程序的最大連線數受Linux系統程序的最大開啟檔案數限制,在執行作業系統命令ulimit -n 65536worker_connections的設定才能生效。

5、http模組

http
{
  include       mime.types;
  default_type  application/octet-stream;
  #charset  gb2312;
  }
  • include是個主模組指令,實現對配置檔案所包含的檔案的設定,可以減少主配置檔案的複雜度。類似於Apache中的include方法。
  • default_type屬於HTTP核心模組指令,這裡設定預設型別為二進位制流,也就是當檔案型別未定義時使用這種方式,例如在沒有配置PHP環境時,Nginx是不予解析的,此時,用瀏覽器訪問PHP檔案就會出現下載視窗。
  • charset gb2312; 指定客戶端編碼格式。

a、HTTP引數之客戶端head快取

server_names_hash_bucket_size 128;
client_header_buffer_size 32k; 
large_client_header_buffers 4 128k; 
client_max_body_size 10m; 
client_body_buffer_size 128k; 
sendfile on ; 
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65 : 
client_body_timeout 60s;
send_timeout 60s;
  • server_names_hash_bucket_size 128;: 伺服器名字的hash表大小。
  • client_header_buffer_size 32k;:用來指定來自客戶端請求頭的header buffer 大小。對於大多數請求,1K的快取已經足夠了,如果自定義了訊息頭或有更大的cookie,可以增大快取區大小。
  • large_client_header_buffers 4 128k;:用來指定客戶端請求中較大的訊息頭的快取最大數量和大小,4為個數,128k為大小,最大快取為4個128KB。
  • client_max_body_size 10m;: 允許客戶端請求的最大單檔案位元組數。如果有上傳較大檔案,請設定它的限制值。
  • client_body_buffer_size 128k;: 緩衝區代理緩衝使用者端請求的最大位元組數。
  • sendfile on ;: 開啟高效檔案傳輸模式,sendfile指令指定nginx是否呼叫sendfile函式來輸出檔案,減少使用者空間到核心空間的上下文切換。對於普通應用設為 on,如果用來進行下載等應用磁碟IO重負載應用,可設定為off,以平衡磁碟與網路I/O處理速度,降低系統的負載。開啟tcp_nopush on;tcp_nodelay on;防止網路阻塞。
  • keepalive_timeout 65 :: 長連線超時時間,單位是秒,這個引數很敏感,涉及瀏覽器的種類、後端伺服器的超時設定、作業系統的設定,可以另外起一片文章了。長連線請求大量小檔案的時候,可以減少重建連線的開銷,但假如有大檔案上傳,65s內沒上傳完成會導致失敗。如果設定時間過長,使用者又多,長時間保持連線會佔用大量資源。
  • client_body_timeout 60s;: 用於設定客戶端請求主體讀取超時時間,預設是60s。如果超過這個時間,客戶端還沒有傳送任何資料,nginx將返回Request time out(408)錯誤。
  • send_timeout :: 用於指定響應客戶端的超時時間。這個超時僅限於兩個連線活動之間的時間,如果超過這個時間,客戶端沒有任何活動,Nginx將會關閉連線。

b、HTTP引數之FastCGI引數

FastCGI相關引數是為了改善網站的效能:減少資源佔用,提高訪問速度。

fastcgi_connect_timeout 300;  
fastcgi_send_timeout 300;  
fastcgi_read_timeout 300;  
fastcgi_buffer_size 64k;  
fastcgi_buffers 4 64k;  
fastcgi_busy_buffers_size 128k;  
fastcgi_temp_file_write_size 128k;  
fastcgi_cache TEST;  
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;  
fastcgi_cache_valid 200 302 1h;  
fastcgi_cache_valid 301 1d;  
fastcgi_cache_valid any 1m; 
  • fastcgi_connect_timeout 300;指定連線到後端FastCGI的超時時間。
  • fastcgi_send_timeout 300;指定向FastCGI傳送請求的超時時間,這個值是已經完成兩次握手後向FastCGI傳送請求的超時時間。
  • fastcgi_read_timeout 300;指定接收FastCGI應答的超時時間,這個值是已經完成兩次握手後接收FastCGI應答的超時時間。
  • fastcgi_buffer_size 64k;用於指定讀取FastCGI應答第一部分需要多大的緩衝區,這個值表示將使用1個64KB的緩衝區讀取應答的第一部分(應答頭),可以設定為fastcgi_buffers選項指定的緩衝區大小。
  • fastcgi_buffers 4 64k;指定本地需要用多少和多大的緩衝區來緩衝FastCGI的應答請求。如果一個PHP指令碼所產生的頁面大小為256KB,那麼會為其分配4個64KB的緩衝區來快取;如果頁面大小大於256KB,那麼大於256KB的部分會快取到fastcgi_temp指定的路徑中,但是這並不是好方法,因為記憶體中的資料處理速度要快於硬碟。一般這個值應該為站點中PHP指令碼所產生的頁面大小的中間值,如果站點大部分指令碼所產生的頁面大小為256KB,那麼可以把這個值設定為“16 16k”、“4 64k”等。
  • fastcgi_busy_buffers_size 128k;預設值是fastcgi_buffers的兩倍。
  • fastcgi_temp_file_write_size 128k;表示在寫入快取檔案時使用多大的資料塊,預設值是fastcgi_buffers的兩倍。
  • fastcgi_cache TEST;表示開啟FastCGI快取併為其指定一個名稱。開啟快取非常有用,可以有效降低CPU的負載,並且防止502錯誤的發生。但是開啟快取也會引起很多問題,要視具體情況而定。
  • fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m;FastCGI快取指定一個檔案路徑、目錄結構等級、關鍵字區域儲存時間和非活動刪除時間。
  • fastcgi_cache_valid 200 302 1h;用來指定應答程式碼的快取時間。例項中的值表示將200和302應答快取一個小時,將301應答快取1天,其他應答均快取1分鐘。

c、HTTP引數之gzip模組設定

gzip on;
gzip_min_length 1k;
gzip_buffers    4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
gzip_vary on;
gzip_proxied any;
limit_zone crawler $binary_remote_addr 10m;
  • gzip on;開啟gzip壓縮輸出
  • gzip_min_length 1k;最小壓縮檔案大小,頁面位元組數從header頭的Content-Length中獲取。預設值為0,不管多大頁面都壓縮,建議設定成大於1K的位元組數,小於1K可能會越壓越大。
  • gzip_buffers 4 16k;壓縮緩衝區,表示申請四個16K的記憶體作為壓縮結果流快取,預設是申請與原始資料大小相同的記憶體空間來儲存gzip壓縮結果。
  • gzip_http_version 1.1;用於設定識別HTTP協議版本,預設是1.1,目前主流瀏覽器都已成指出。(預設1.1,前端如果是squid2.5請使用1.0)
  • gzip_comp_level 6;壓縮等級,1壓縮比最小,處理速度最快,9壓縮比最大,傳輸速度快,但是消耗CPU資源。
  • gzip_types text/plain application/x-javascript text/css application/xml;壓縮型別,預設就已經包含text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn。
  • gzip_vary on;和http頭有關係,會在響應頭加個 Vary: Accept-Encoding ,可以讓前端的快取伺服器快取經過gzip壓縮的頁面,例如,用Squid快取經過Nginx壓縮的資料。
  • gzip_proxied any;Nginx作為反向代理的時候啟用,決定開啟或者關閉後端伺服器返回的結果是否壓縮,匹配的前提是後端伺服器必須要返回包含”Via”的 header頭。
  • limit_zone crawler $binary_remote_addr 10m;開啟限制IP連線數的時候需要使用

d、如何檢視是否開啟了gzip壓縮

如果response header中包含Content-Encoding:gzip則表示開啟gzip壓縮。

Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html
Date:Wed, 29 Mar 2017 10:55:54 GMT
ETag:W/"58db92af-331a6"
Last-Modified:Wed, 29 Mar 2017 10:55:43 GMT
Server:nginx/1.10.3
Transfer-Encoding:chunked
Vary:Accept-Encoding

6、nginx 配置虛擬主機

a、配置虛擬主機流程

  1. 複製一段完整的server標籤段,到結尾。注意:要放在http的結束大括號前,也就是server標籤段放入http標籤。
  2. 更改server_name 及對應網頁的root根目錄。
  3. 檢查配置檔案語法,平滑重啟服務。
  4. 建立server_name 對應網頁的根目錄,並且建立測試檔案,如果沒有index首頁會出現403錯誤。
  5. 對客戶端server_name 的主機做host 解析或DNS配置。並檢查(ping)。
  6. 瀏覽器訪問,或者在Linux客戶端做host解析,用wget或curl 訪問。

http服務上支援若干虛擬主機。每個虛擬主機一個對應的server配置項,配置項裡面包含該虛擬主機相關的配置。在提供mail服務的代理時,也可以建立若干server。每個server通過監聽地址或埠來區分。

 server{
    listen 80 default;
    server_name _;
    index index.html index.htm index.php;
    root /data/htdocs/www;
    #server_name_in_redirect off;
    
    location ~ .*\.(php|php5)?${
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
      expires      30d;
    }
    
    location ~ .*\.(js|css)?${
      expires      1h;
    }
  }
  • listen 80;監聽埠,預設80,小於1024的要以root啟動。可以為listen *:80、listen 127.0.0.1:80等形式。
  • server_name blog.biglittleant.cn;伺服器名,如localhost可以通過正則匹配。
  • root /var/www/html定義伺服器的預設網站根目錄位置。如果locationURL匹配的是子目錄或檔案,root沒什麼作用,一般放在server指令裡面或/下。
  • index index.jsp index.html index.htm定義路徑下預設訪問的檔名,一般跟著root放。

b、sever模組下location模組的寫法

proxy_passhttp://backend

請求轉向backend定義的伺服器列表,即反向代理,對應upstream負載均衡器。也可以proxy_pass http://ip:port。

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;

7、其它nginx引數

a、訪問控制 allow/deny

Nginx 的訪問控制模組預設就會安裝,而且寫法也非常簡單,可以分別有多個allow,deny,允許或禁止某個ip或ip段訪問,依次滿足任何一個規則就停止往下匹配。如:

location /nginx-status {
  stub_status on;
  access_log off;
#  auth_basic   "NginxStatus";
#  auth_basic_user_file   /usr/local/nginx-1.6/htpasswd;
  allow 192.168.10.100;
  allow 172.29.73.0/24;
  deny all;
}

b、列出目錄 autoindex

Nginx預設是不允許列出整個目錄的。如需此功能,開啟nginx.conf檔案,在location,server 或 http段中加入如下引數

location /images {
  root   /var/www/nginx-default/images;
  autoindex on;
  autoindex_exact_size off;
  autoindex_localtime on;
  }
  • autoindex on;執行列出目錄內容。另外兩個引數最好也加上去。
  • autoindex_exact_size off;預設為on,顯示出檔案的確切大小,單位是bytes。改為off後,顯示出檔案的大概大小,單位是kB或者MB或者GB。
  • autoindex_localtime on;預設為off,顯示的檔案時間為GMT時間。改為on後,顯示的檔案時間為檔案的伺服器時間。

8、通用配置檔案

user  www www;
worker_processes  2;
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
pid        logs/nginx.pid;
events {
    use epoll;
    worker_connections  2048;
}
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  65;
  # gzip壓縮功能設定
    gzip on;
    gzip_min_length 1k;
    gzip_buffers    4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 6;
    gzip_types text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;
  
  # http_proxy 設定
    client_max_body_size   10m;
    client_body_buffer_size   128k;
    proxy_connect_timeout   75;
    proxy_send_timeout   75;
    proxy_read_timeout   75;
    proxy_buffer_size   4k;
    proxy_buffers   4 32k;
    proxy_busy_buffers_size   64k;
    proxy_temp_file_write_size  64k;
    proxy_temp_path   /usr/local/nginx/proxy_temp 1 2;
  # 設定負載均衡後臺伺服器列表 
    upstream  backend  { 
              #ip_hash; 
              server   192.168.10.100:8080 max_fails=2 fail_timeout=30s ;  
              server   192.168.10.101:8080 max_fails=2 fail_timeout=30s ;  
    }
  # 很重要的虛擬主機配置,多個虛擬機器可以複製修改此部分
    server {
        listen       80;
        server_name  test.example.com;
        root   /apps/oaapp;
        charset utf-8;
        access_log  logs/host.access.log  main;
        #對 / 所有做負載均衡+反向代理
        location / {
            root   /apps/oaapp;
            index  index.php index.html index.htm;
            proxy_pass        http://backend;  
            proxy_redirect off;
            # 後端的Web伺服器可以通過X-Forwarded-For獲取使用者真實IP
            proxy_set_header  Host  $host;
            proxy_set_header  X-Real-IP  $remote_addr;  
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        }
        
        #靜態檔案,nginx自己處理,不去backend請求後端的服務
        location  ~* /download/ {  
            root /data/app/nginx/downloads;  
        }
        
        location ~ .*\.(gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ {   
            root /data/app/nginx/images;   
            expires      7d; 
        }
        
        location /nginx_status {
            stub_status on;
            access_log off;
            allow 192.168.10.0/24;
            deny all;
        }
        
        location ~ ^/(WEB-INF)/ {   
            deny all;   
        }
        
        #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;
        }
    }
}