Nginx全配置解析

豎橫山發表於2023-04-03
#==========================nginx全域性配置==========================#
# 指定 nginx 程式執行的使用者,這裡是 nginx,預設為nobody。
user nginx;  

# 指定 nginx 使用多少個 worker 程式處理請求,這裡使用了 auto,表示根據 CPU 核心數自動分配。
worker_processes auto;  

# 指定 nginx 主程式的 PID 檔案路徑。
pid /run/nginx.pid;  

#指定錯誤日誌檔案的路徑
error_log /var/log/nginx/error.log;  
#==========================nginx全域性配置==========================#

##==========================events==========================##
# 事件模組的配置
events {
    # 預設值512,設定每個 worker 程式的最大連線數。
    worker_connections  1024;    

    # 預設值off,控制是否在一次事件迴圈中accept多個連線請求。啟用 multi_accept 可以減少 CPU 的使用和系統呼叫的次數,也可能會導致每個請求的響應時間增加
    multi_accept on; 

    # 使用連線互斥鎖進行順序的accept()系統呼叫,防止驚群現象發生,預設為on
    accept_mutex on;   

    # 如果一個程式沒有互斥鎖,它將延遲至少多長時間。預設情況下,延遲是500ms 
    accept_mutex_delay 500ms

    # 指定事件驅動模組,預設值select,這個驅動模組在大量連線時,效能較差,這裡使用了 epoll。 可選select|poll|kqueue|epoll|resig|/dev/poll|eventport
    use epoll;      

    # 設定 accept 互斥鎖等待時間。
    accept_mutex_delay 500ms; 

    # 實驗模組,僅在 FreeBSD 下可用,aio 啟用則使用非同步I/O,不啟用則使用同步I/O,預設不啟用
    aio threads; # 指定非同步 I/O 模組,這裡使用了 threads。
    aio_write on; # 啟用非同步寫入操作。
    aio_read on; # 啟用非同步讀取操作。

    # 事件驅動模組 use epoll時配置
    epoll_events 1024; # 預設值為 512,即每次事件迴圈最多處理 512 個事件。
    epoll_event_connections 512; # 預設值為 2048,即每個事件最多處理 2048 個連線。
    epoll_timeout 1s; # 預設值為 0,即 epoll 模組不會超時,等待事件的時間取決於作業系統。

    //事件驅動模組 use kqueue時配置,僅在 FreeBSD 下可用
    kqueue_events 1024;
    kqueue_event_connections 512;
    kqueue_timeout 1s;
}
##==========================events==========================##

##==========================http==========================##
# 主要用於處理 HTTP 請求和響應,包括路由、反向代理、快取、日誌等功能。
http {
    # 匯入 MIME 型別的配置檔案。
    include  /etc/nginx/mime.types;   

    # 定義預設的 MIME 型別,預設為text/plain 
    default_type  application/octet-stream; 

    # 定義訪問日誌格式 main
    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  /var/log/nginx/access.log main; 

    # 指定錯誤日誌檔案的路徑和格式。
    error_log  /var/log/nginx/error.log main;   

    # 預設開啟,直接把檔案內容從磁碟讀入核心緩衝區,尤其是在處理大檔案時,效果更為明顯。
    sendfile on;  

    # 每個程式每次呼叫傳輸數量不能大於設定的值,預設為0,即不設上限。
    sendfile_max_chunk 100k;  

    # 客戶端與伺服器之間的連線超時時間,預設值為 75s。
    keepalive_timeout 75;  

    # 在一個持久連線上最多允許的請求數量,預設值為 100。
    keepalive_requests 100; 

    # 是否開啟 Gzip 壓縮,預設值為 off。
    gzip on; 
    gzip_types text/plain text/css application/json application/javascript application/xml; # 壓縮檔案型別列表
    gzip_min_length 20; # 只壓縮大於該長度的檔案,單位為位元組,預設值為 20。
    gzip_buffers 4 8k; # 第一個引數列示緩衝區的數量,第二個引數列示每個緩衝區的大小。 預設值為 4 8k。

    # 當伺服器返回錯誤碼時,可以顯示指定的錯誤頁面。
    error_page error_page 404 /404.html;  

    ###==========================upstream=========================###
    # upstream 模組用於配置反向代理伺服器組,可以將客戶端請求轉發到多臺伺服器進行處理,從而實現負載均衡和高可用性。
    upstream backend  {   
      # 簡單的迴圈負載均衡
      server backend1.example.com;
      server backend2.example.com;

      # 使用權重進行負載平衡
      server backend3.example.com weight=3; #指定伺服器的權重,預設為 1,可以是任意正整數。
      server backend4.example.com weight=2;

      # 使用IP Hash值進行權重進行負載平衡,確保來自同一 IP 的請求總是傳送到同一伺服器。
      ip_hash;

      # 用最少的連線進行負載均衡,動態地將請求傳送到最空閒的伺服器。
      least_conn;

      # 使用伺服器響應時間進行負載平衡,將請求傳送到響應時間最短的伺服器。
      fair;

      # 根據請求 URL 的雜湊值進行負載平衡
      hash $remote_addr consistent;

      # 隨機傳送到伺服器
      random;

      # 為backend分配一個共享記憶體區域。
      zone backend_zone 64k;

      # 指定與後端伺服器的 TCP 連線複用數,預設為 1。
      keepalive 16; 

      # 指定與後端伺服器的 TCP 連線最大請求數,超過此數量,連線將關閉並重新建立新連線。預設為 100。
      keepalive_requests 100;

      # 指定與後端伺服器的 TCP 連線空閒超時時間,預設為 75 秒。
      keepalive_timeout 60s;
    }
    ###==========================upstream=========================###

    ###==========================server=========================###
    server {
      # 監聽埠
      listen 80;

      # 指定伺服器的主機名。它可以是域名、IP 地址或*匹配任何主機名,也可以配置多個域名
      server_name example.com;

      # 根目錄
      root /var/www/example.com;

      # 限速 每秒4K
      set $limit_rate 4k;

      # 當使用者訪問example.com 或 example.com/ 時
      location / {

      # 指定用於提供檔案的回退機制。如果請求的檔案不存在,nginx將嘗試返回fallback
        try_files index.html index.htm @fallback;
      }
      # 上面try files 回退到這裡
      location @fallback {
         root  /var/www/error;
         index index.html;
      }



      # 當使用者訪問example.com/api時
      location /api {

        # 反向代理到 http://backend/api; 本配置中 backend 是個負載均衡器
        proxy_pass http://backend/api;
      }

      # 當使用者訪問example.com/images時
      location /images/ {
        # alias 看起來類似於 root 指令,但檔案根目錄沒有改變,只是用於當前請求的路徑。 
        # /images/top.gif 將返回 /var/www/images/top.gif
        alias /var/www/images/;

        # 設定快取時間為1,原理是Header 設定Cache-Control
        expires 1d;

        # 新增header
        add_header Cache-Control "public";
      }

      location ~ \.php$ {
        include fastcgi_params;  
        fastcgi_index index.php;  
        # 使用fastcgi協議 轉發到 phpfpm的unix socket檔案 phpfpm 和 nginx 同一臺機器才可以這麼配置
        fastcgi_pass unix:/var/run/php/php7.x-fpm.sock;
        # 使用fastcgi協議 轉發到某個伺服器某個埠
        fastcgi_pass 127.0.0.1:9000;  
        # 使用fastcgi協議 轉發到負載均衡器
        fastcgi_pass http://backend/

        deny 127.0.0.1;  #拒絕的ip
        allow 172.18.5.54; #允許的ip           
      }

      # SSL 配置 監聽443
      listen 443 ssl;

      # 證照路徑
      ssl_certificate /etc/ssl/certs/example.com.crt;

      # 證照私鑰
      ssl_certificate_key /etc/ssl/private/example.com.key;

      # HTTP/2 配置 監聽443
      listen 443 ssl http2;

      # 設定安全header
      add_header X-Content-Type-Options "nosniff" always;
      add_header X-Frame-Options "SAMEORIGIN" always;
      add_header X-XSS-Protection "1; mode=block" always;
    }

    ###==========================server=========================###
}
##==========================http==========================##

@@todo rewrite 模組

本作品採用《CC 協議》,轉載必須註明作者和本文連結
遇強則強,太強另說

相關文章