洞悉本質在不確定的世界預見未來

Nginx配置參數中文詳細說明

Nginx的配置文件nginx.conf位於其安裝目錄的conf目錄下。nginx.conf由多個塊組成,最外面的塊是main(全局設置),main包含Events和HTTP,HTTP包含upstream(負載均衡服務器設置)和多個Server(主機設置),Server又包含多個location(URL匹配特定位置的設置)。

	--{ Events
main +				--{ upstream
	--{ HTTP --+				--{ location
					--{ Server --+--{ location
					--{ Server

1、main全局塊:配置影響nginx全局的指令。一般有運行nginx服務器的用戶組,nginx進程pid存放路徑,日誌存放路徑,配置文件引入,允許生成worker process數等。

2、events塊:配置影響nginx服務器或與用戶的網絡連接。有每個進程的最大連接數,選取哪種事件驅動模型處理連接請求,是否允許同時接受多個網路連接,開啟多個網絡連接序列化等。

3、http塊:可以嵌套多個server,配置代理,緩存,日誌定義等絕大多數功能和第三方模塊的配置。如文件引入,mime-type定義,日誌自定義,是否使用sendfile傳輸文件,連接超時時間,單連接請求數等。

4、upstream:其指令主要用於負載均衡,設置一系列的後端服務器

5、server塊:配置虛擬主機的相關參數,一個http中可以有多個server。

6、location塊:配置請求的路由,以及各種頁面的處理情況。

# 定義Nginx運行的用戶和用戶組
user www www;

# nginx進程數,建議設置為等於CPU總核心數.
worker_processes auto;

#全局錯誤日誌定義類型,[ debug | info | notice | warn | error | crit ]
error_log /var/log/nginx/error.log info;

# 進程文件
pid /var/run/nginx.pid;

# 引用其他模組
include /etc/nginx/modules-enabled/*.conf;

# 一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(系統的值ulimit -n)
# 與nginx進程數相除,但是nginx分配請求並不均勻,所以建議與ulimit -n的值保持一致.

worker_rlimit_nofile 65535;

# 設定工作模式與連接數上限
events
{
    # 參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; 
    # epoll模型是Linux 2.6以上版本內核中的高性能網絡I/O模型,如果跑在FreeBSD上面,就用kqueue模型.
    use epoll;
    #设置一个进程是否同时接受多个网络连接,默认为off
    multi_accept on;
    # 设置网路连接序列化,防止惊群现象发生,默认为on
    accept_mutex on; 
    # 單個進程最大連接數(最大連接數=連接數*進程數)
    worker_connections 65535;
}

# 設定http服務器
http
{

    # 開啟高效文件傳輸模式,sendfile指令指定nginx是否調用sendfile函數來輸出文件,
    # 對於普通應用設為 on,如果用來進行下載等應用磁盤IO重負載應用,可設置為off,
    # 以平衡磁盤與網絡I/O處理速度,降低系統的負載.注意:如果圖片顯示不正常把這個改成off.
    sendfile on; 
    # 防止網絡阻塞
    tcp_nopush on; 
    # 防止網絡阻塞
    tcp_nodelay on; 
    # (單位s)設置客戶端連接保持活動的超時時間,在超過這個時間後服務器會關閉該鏈接
    keepalive_timeout 120; 
    # 混淆數據,影響散列表的衝突率,值越大消耗內存越多,散列key的衝突率會降低,檢索速度更快;
    # 值越小占用內存較少,散列key的衝突率越高,檢索速度變慢
    types_hash_max_size 2048;
    # 關閒nginx版本顯示,安全
    server_tokens off; 

    # 允許客戶端請求上傳文件的最大單文件大小。默認情況下,該指令值為1m。
    # 如請求大於指定的大小,則NGINX發回HTTP 413(Request Entity too large)錯誤。
    client_max_body_size 28m;
    # 設定主體的緩衝區大小。代理緩衝客戶端請求的最大字節數
    # 默认情况下,该指令为32位系统设置一个8k缓冲区,为64位系统设置一个16k缓冲区。 
    # 该指令在NGINX配置的http,server和location区块使用。
    client_body_buffer_size 128k;
    # 禁用NGINX緩衝區並將請求體存儲在臨時文件中。文件包含純文本數據。 
    # 該指令在NGINX配置的http,server和location區塊使用。可選值有:
    # off:該值將禁用文件寫入。默認情況下,指令值為關閉。
    # clean:請求body將被寫入文件。該文件將在處理請求後刪除。
    # on:請求正文將被寫入文件。處理請求後,將不會刪除該文件。
    client_body_in_file_only clean;
    # 設置NGINX將完整的請求主體存儲在單個緩衝區中。 默認情況下,指令值為off。
    # 如果啟用,它將優化讀取$request_body變量時涉及的I/O操作。
    client_body_in_single_buffer on;
    # 指定存儲請求正文的臨時文件的位置。默認情況下,
    # NGINX在NGINX安裝路徑下的client_body_temp文件夾創建臨時文件。
    # 該指令生成的文件路徑如temp_files/1/05/0000003051。
    client_body_temp_pathtemp_files 1 2;
    # 與client_max_body_size指令類似。它為請求頭分配一個緩衝區。如果請求頭大於 
    # 指定的緩衝區,則使用large_client_header_buffers指令分配更大的緩衝區。
    client_header_buffer_size 1m; 
    # 用於讀取大型客戶端請求頭的緩衝區的最大數量和大小。 這些緩衝區僅在缺省緩衝區 
    # 不足時按需分配。當處理請求或連接轉換到保持活動狀態時,釋放緩衝區。
    large_client_header_buffers 4 64k;

    # 文件擴展名與文件類型映射表
    include mime.types; 
    # 默認文件類型
    default_type application/octet-stream; 
    # 默認編碼
    # charset utf-8; 

    # 用於設置域名哈希表的桶(bucket)的大小。配置多個 server 虛擬主機要用。默認256
    server_names_hash_bucket_size 128;
    # 設置域名哈希表的最大大小,默認1024
    # server_names_hash_max_size 2056;
    
    # 開啟目錄列表訪問,合適下載服務器,默認關閉。
    # 顯示目錄
    # autoindex on; 
    # 顯示文件大小 默認為on,顯示出文件的確切大小,單位是bytes
    # 改為off後,顯示出文件的大概大小,單位是kB或者MB或者GB
    # autoindex_exact_size on; 
    # 顯示文件時間 默認為off,顯示的文件時間為GMT時間
    # 改為on後,顯示的文件時間為文件的服務器時間
    # autoindex_localtime on;
    
    # 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;
    
    # gzip模塊設置
    # 開啟gzip壓縮輸出
    gzip on; 
    # 指定哪些不需要gzip壓縮的瀏覽器
    gzip_disable "msie6";

    # 允許壓縮的頁面的最小字節數,頁面字節數從header偷得content-length中獲取.默認是0,
    # 不管頁面多大都進行壓縮.建議設置成大於1k的字節數,小於1k可能會越壓越大
    gzip_min_length 1k; 
    # 表示申請4個單位為16k的內存作為壓縮結果流緩存,
    # 默認值是申請與原始數據大小相同的內存空間來存儲gzip壓縮結果
    gzip_buffers 4 16k; 
    # 壓縮版本(默認1.1,目前大部分瀏覽器已經支持gzip解壓.前端如果是squid2.5請使用1.0)
    gzip_http_version 1.1; 
    # 壓縮等級.1壓縮比最小,處理速度快.9壓縮比最大,比較消耗cpu資源,
    # 處理速度最慢,但是因為壓縮比最大,所以包最小,傳輸速度快
    gzip_comp_level 2; 
    # 壓縮類型,默認就已經包含text/html,所以下面就不用再寫了,寫上去也不會有問題,但是會有一個warn.
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    # 選項可以讓前端的緩存服務器緩存經過gzip壓縮的頁面.例如:用squid緩存經過nginx壓縮的數據
    gzip_vary on;

    # nginx做為反向代理時啟用,off(關閉所有代理結果的數據的壓縮)
    # expired(啟用壓縮,如果header頭中包括"Expires"頭信息)
    # no-cache(啟用壓縮,header頭中包含"Cache-Control:no-cache")
    # no-store(啟用壓縮,header頭中包含"Cache-Control:no-store")
    # private(啟用壓縮,header頭中包含"Cache-Control:private")
    # no_last_modefied(啟用壓縮,header頭中不包含"Last-Modified")
    # no_etag(啟用壓縮,如果header頭中不包含"Etag"頭信息)
    # auth(啟用壓縮,如果header頭中包含"Authorization"頭信息)
    gzip_proxied off;
    
    # 限制每個IP的併發連接數,定義一個叫“onetx”的記錄區,總容量為 10M
    # limit_zone onetx $binary_remote_addr 10m;

    # 防止跨站點腳本攻擊,配置可以放入到 http 或者 server 中。賦值有如下四種:
    # ALLOWALL:允許所有域名iframe。DENY:不能被嵌入到任何iframe或者frame中。
    # SAMEORIGIN:頁面只能被本站(相同域名)頁面嵌入到iframe或者frame中
    # ALLOW-FROM uri:只能被嵌入到指定域名的框架中
    add_header X-Frame-Options SAMEORIGIN;
    
    # upstream的負載均衡,有四種負載均衡算法(咱個人永遠也用不上)
    # Weight(默認):每個請求按時間順序逐一分配到不同的後端服務器,
    # 輪詢調度默認為1,指定輪詢權值,Weight值越大,分配到的訪問機率越高。
    # ip_hash:每個請求按訪問IP的hash結果分配,同一個IP客戶端固定訪問一個後端服務器。
    # 這樣有效解決了動態網頁存在的session共享問題。
    # url_hash:按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,可以進一步提高後端緩存
    # 服務器的效率。Nginx本身是不支持url_hash的,如需要使用這種調度算法,(必須安裝Nginx的hash軟件包)。
    # fair:比上面兩個更加智能的負載均衡算法。此種算法可以依據頁面大小和加載時間長短智能地進行負載均衡,
    # 也就是根據後端服務器的響應時間來分配請求,響應時間短的優先分配。Nginx本身是不支持fair的,如果需要
    # 使用這種調度算法,(必須下載Nginx的upstream_fair模塊)。
    upstream name {
          # 指定請求調度算法,默認負載的權重由 weight 來輪詢調度,默認為 1 ,weight 越大,權重就越大。
          ip_hash;
          # 後端分發服務器訪問規則 server host:port 
          server 192.168.1.100:8000;
          # down 表示該主機暫停服務不参与负载
          server 192.168.1.100:8001 down; 
          # backup 表示預留的備份機器。當其他所有的非backup機器出現故障或者忙的時候,
          # 才會請求backup機器,因此這台機器的壓力最輕;
          # 注意:backup不能和ip_hash同時配置。因為ip_hash只能訪問同一台服務器,
          # 而backup是在只有所有參與負載均衡的服務器出現故障時,才會請求備份機。
          # 當所有負載均衡的服務器出現故障,ip_hash的將無法請求了。
          server 192.168.1.100:8001 backup;
          # max_fails 表示失敗最大次數,超過失敗最大次數暫停服務
          server 192.168.1.100:8002 max_fails=3;
          # fail_timeout 表示如果請求受理失敗,暫停指定的時間之後重新發起請求
          server 192.168.1.100:8003 fail_timeout=20s;
          server 192.168.1.100:8004 max_fails=3 fail_timeout=20s;
    }

    # 虛擬主機的配置
    server
    {
        # 監聽端口
        listen 80;
        # 域名可以有多個,用空格隔開
        server_name xxxx.com zzz.net;
        # 顯示500錯誤
        # return 500;
        # HTTP 自動跳轉 HTTPS
        rewrite ^(.*) https://$server_name$1 permanent;
    }
    
    server
    {
        # 監聽端口 HTTPS
        listen 443 ssl;
        server_name xxxx.com;
         
        index index.html index.htm index.php;
        # 定義服務器的默認網站根目錄位置。
        root /var/www/html;

        location ~ \.php$
        {
        include snippets/fastcgi-php.conf;
        # nginx常量的定義
        include fastcgi_params;
        # php-cgi 進程管理方式
        fastcgi_pass 127.0.0.1:9000;
        # php-fpm 進程管理方式
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        # 腳本文件請求的網站的根目錄路徑,修改 $document_root 為 /var/www/html
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
        
        # 配置地址攔截轉發,解決跨域驗證問題
        location /oauth/{

            # 設置後端代理服務器的協議(protocol)和地址(address),
            # 以及location中可以匹配的一個可選的URI。協議可以是"http"或"https"。
            # 地址可以是一個域名或ip地址和端口,或者一個 unix-domain socket 路徑。
            # 當在url後面加上了/,相當於是絕對根路徑,則nginx不會把location中匹配的路徑部分代理走;
            # 如果url後面沒有/,則會把匹配的路徑部分也給代理走。
            proxy_pass https://webhost;
            # 獲取用戶真實IP。變量值$host(如果客戶端請求頭中沒有攜帶這個頭部,那麼
            # 傳遞到後端服務器的請求也不含這個頭部。)
            # 變量值$http_host(不改變請求頭 )
            # 變量值$host:$proxy_port(服務器名可以和後端服務器的端口一起傳送)
            proxy_set_header HOST $host;
            # 把真實客戶端IP寫入到請求頭X-Real-IP
            proxy_set_header X-Real-IP $remote_addr;
            # 後端的Web服務器可以通過X-Forwarded-For獲取用戶真實IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            # 以下是一些啟用反向代理的配置,可選
            # 重定向到後端服務器。on 時按照proxy_pass重定向。Off時按照服務器的指示重定向。
            proxy_redirect off;
            proxy_connect_timeout 90; # nginx跟後端服務器連接超時時間(代理連接超時)
            proxy_send_timeout 90; # 後端服務器數據回傳時間(代理發送超時)
            proxy_read_timeout 90; # 連接成功後,後端服務器響應時間(代理接收超時)
            proxy_buffer_size 4k; # 設置代理服務器(nginx)保存用戶頭信息的緩衝區大小
            proxy_buffers 4 32k; # proxy_buffers緩衝區,網頁平均在32k以下的設置
            proxy_busy_buffers_size 64k; # 高負荷下緩衝大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k;# 設定緩存文件夾大小,大於這個值,將從upstream服務器傳
        }
        
        # 圖片緩存時間設置
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
            expires 10d;
        }
        
        # JS和CSS緩存時間設置
        location ~ .*\.(js|css)?$ {
            expires 1h;
        }
 
        # 日誌格式設定
        log_format access '$remote_addr - $remote_user [$time_local] "$request" '
        '$status $body_bytes_sent "$http_referer" '
        '"$http_user_agent" $http_x_forwarded_for';
        # 定義本虛擬主機的訪問日誌
        access_log /var/log/nginx/access.log access;
        
        # 設定查看Nginx狀態的地址.StubStatus模塊能夠獲取Nginx自上次啟動以來
        # 的工作狀態,此模塊非核心模塊,需要在Nginx編譯安裝時手工指定才能使用
        location /NginxStatus {
            stub_status on;
            access_log on;
            auth_basic "NginxStatus";
            auth_basic_user_file conf/htpasswd;
            #htpasswd文件的內容可以用apache提供的htpasswd工具來產生.
        }
    }
}
back to top