Knight Li design

Knight Li design

  • TOP
  • WORKS
  • STEP INTO TAINAN
  • BLOG
  • CONTACT
ALL TAGS
  • TOP
  • WORKS
  • STEP INTO TAINAN
  • BLOG
  • CONTACT

BLOG

Nginx Config 設定

程式技術教學

PUBLIC DATE:2021.09.08

B-09202111
 
 Nginx Config 設定





Nginx Config 配置範例


以下範例為使用 Docker 建置 Nginx、Nuxt.js 專案配置。
而我這裡的配置為區分【HTTP】與【HTTPS / SSL】兩種,僅供參考。
更多配置設定:Nginx Config


   目錄、文件所在位置:



 etc
  ┗  nginx
    ┣  ssl.crt
    ┣  ssl.key
    ┗  conf.d
      ┣  default.conf
      ┗  default.ssl.conf

   etc/nginx/conf.d/default.conf(HTTP):



# 配置多台 Server Name 或 IP 的分流(負載平衡)
upstream app_domain.com {
  # docker-compose.yml 中的 services 內所自定的容器名稱與 Port
  server nuxtjs:3000;
}

# 配置 expires
map $sent_http_content_type $expires {
  "text/html"                epoch;
  "text/html; charset=utf-8" epoch;
  default                    off;
}

# Http 80 Port(有 www.)自動轉址到下方無 Http 80 Port(無 www.)
server {
  # 監聽所有 ipv4 的位址(80 port)
  listen 80;

  # 設置您的網域 Domain Name 或本機開發(如本機開發,需到 hosts 文件手動新增 Server IP 與指向的 Domain Name)
  server_name www.my-dns.com;

  # 重定向所有非 https 請求
  # 方式-1:
  return 301 http://my-dns.com$request_uri;
  # 301:永久轉址,轉址時,改變 Request Method 為 GET,無法保留 POST 資料。
  # 308:永久轉址,轉址時,不改變 Request Method,能保留 POST 資料。
  # 302:暫時轉址,轉址時,改變 Request Method 為 GET,無法保留 POST 資料。
  # 307:暫時轉址,轉址時,不改變 Request Method,能保留 POST 資料。
  # 方式-2:
  # rewrite ^ http://$host$request_uri? permanent;
}

# Http 80 Port(無 www.)
server {
  # 監聽所有 ipv4 的位址(80 port)
  listen 80 default_server;
  # 監聽所有 ipv6 的位址(80 port)
  listen [::]:80 default_server;

  # 設置您的網域 Domain Name 或本機開發(如本機開發,需到 hosts 文件手動新增 Server IP 與指向的 Domain Name)
  server_name my-dns.com;

  # 設置 Log 檔位置
  error_log  /var/log/nginx/error.log;
  access_log /var/log/nginx/access.log;

  # Gzip
  gzip            on;
  gzip_types      text/plain application/xml text/css application/javascript;
  gzip_min_length 1000;

  # Proxy 方式(Nuxt.js + Nginx 配合)
  # Nuxt.js
  location / {
    # 緩存在 Client 端,減少伺服器請求
    expires $expires;
    # 虛擬主機的主域名 IP,Nginx 向後端 Web 伺服器發出的請求(如環境為 VM,IP 通常為 192.168.99.100)
    proxy_set_header Host $host;
    # 把真實用戶端的 IP 位址寫入到請求頭 X-Real-IP($remote_addr 為用戶端 IP,輸出結果為最後一個代理服務器的 IP,非真實用戶端 IP)
    proxy_set_header X-Real-IP $remote_addr;
    # X-Forwarded-For 代表用戶端 IP,$proxy_add_x_forwarded_for 為代理服務器的 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 請求使用的 Web 協議(HTTP 或 HTTPS)
    proxy_set_header X-Forwarded-Proto $scheme;
    # 連接成功後,等候後端 Web 伺服器響應時間(處理請求時間)
    proxy_read_timeout 1m;
    # 後端 Web 伺服器連接的超時時間
    proxy_connect_timeout 1m;
    # 使用代理服務器的標記(在大多數情況下可能沒有用)
    proxy_set_header X-NginX-Proxy true;
    # 後端 Web 伺服器
    proxy_pass http://app_domain.com;
    # 重定向 URL
    proxy_redirect off;
    # 用戶最多可以傳送多少資料(如:上傳圖片)如果用戶傳送到 Nginx 的資料超過這個限制,便會出現 413 Request Entity Too Large 錯誤,而這個參數的預設值是 1MB
    client_max_body_size 20M;
  }
  # FastCGI 方式(PHP + Nginx 配合)
  # 由於 Nginx 無法解析動態網頁,所以動態請求一般需要 PHP 來完成.通過 fastcgi, 也就是 php-fpm(fastcgi 的實現)來實現
  # phpMyAdmin
  location ^~ /pma {
    # 定義文件目錄(alias 後面必須要有 '/' 結束,否則會找不到文件)
    alias /var/www/html/;
    # 設置初始文件(頁),可設置多組(index index.php index.html;)
    # 如果文件存在,則使用文件作為路徑,發起內部重定向(內部重定向:域名+端口不發生變化,只會在同一個 server 下搜索)
    index index.php;
    # uri 路徑處理
    location ~ \.php$ {
      # 檢查文件是否存在,則返回 404
      try_files $uri = 404;
      # 引入 Nginx fastcgi_params 文件
      # 由於 Nginx 作為 Web 服務器,動態請求需轉發給後端 PHP 服務處理,轉發過程中就需要傳遞客戶端請求的一些參數
      include fastcgi_params;
      # 進行 uri 路徑處理
      fastcgi_split_path_info ^\/pma\/(.+\.php)(.*)$;
      # SCRIPT_FILENAME 變量是 php-fpm 可識別的腳本名稱,對應的 $fastcgi_script_name 變量是 Nginx 定義的腳本名稱
      # 腳本文件請求的路徑
      fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
      # 後端 Web 伺服器
      fastcgi_pass phpmyadmin:9000;
    }
  }
}

   SSL 憑證文件:


私有金鑰Pirvate Key(於上方樹狀結構內文件 etc/nginx/ssl.key)
簽署要求CSR
憑證CRT(於上方樹狀結構內文件 etc/nginx/ssl.crt)
中繼憑證PEM 或 CRT(如憑證中心有給予一個中繼憑證時)

   etc/nginx/conf.d/default.ssl.conf(HTTPS / SSL):


※※※※※ 注意事項 ※※※※※
default.ssl.conf 文件名稱中的 .ssl 僅是區分文件用,須改回默認名稱 default.conf。



# 配置多台 Server Name 或 IP 的分流(負載平衡)
upstream app_domain.com {
  # docker-compose.yml 中的 services 內所自定的容器名稱與 Port
  server nuxtjs:3000;
}

# 配置 expires
map $sent_http_content_type $expires {
  "text/html"                epoch;
  "text/html; charset=utf-8" epoch;
  default                    off;
}

# 127.0.0.11 為 Docker Network 的 DNS Server,它會將設定名 Map 到 Docker 內的 IP 位置
resolver 127.0.0.11 valid=15s;

# Http 80 Port(有 www.)自動轉址到下方無 Http 80 Port(無 www.)
server {
  # 監聽所有 ipv4 的位址(80 port)
  listen 80;

  # 「_」為無效的域名,不會匹配
  # server_name _;
  # 設置您的網域 Domain Name
  server_name www.knight-li.com knight-li.com;

 # 重定向所有非 https 請求
  # 方式-1:
  return 301 https://my-dns.com$request_uri;
  # 301:永久轉址,轉址時,改變Request Method為GET,無法保留POST資料。
  # 308:永久轉址,轉址時,不改變Request Method,能保留POST資料。
  # 302:暫時轉址,轉址時,改變Request Method為GET,無法保留POST資料。
  # 307:暫時轉址,轉址時,不改變Request Method,能保留POST資料。
  # 方式-2:
  # rewrite ^ https://$host$request_uri? permanent;
}

# Https 443 Port SSL(有 www.)自動轉址到下方無 Https 443 Port SSL(無 www.)
server {
  # 監聽所有 ipv4 的位址(443 Port)
  listen 443 ssl http2;

  # 設置您的網域 Domain Name
  server_name www.my-dns.com;

  # 重定向所有非 https 請求
  return 301 $scheme://knight-li.com$request_uri;
}

# Https 443 Port SSL
server {
  # 監聽所有 ipv4 的位址(443 Port)
  listen 443 ssl http2 default_server;
  # 監聽所有 ipv6 的位址(443 Port)
  listen [::]:443 ssl http2 default_server;

  # 設置您的網域 Domain Name
  server_name knight-li.com;

  # 設置 Log 檔位置
  error_log  /var/log/nginx/error.log;
  access_log /var/log/nginx/access.log;

  # Gzip
  gzip            on;
  gzip_types      text/plain application/xml text/css application/javascript;
  gzip_min_length 1000;

  # 開啟 SSL
  ssl on;
  # SSL 憑證
  ssl_certificate /etc/nginx/ssl.crt;
  # SSL 金鑰
  ssl_certificate_key /etc/nginx/ssl.key;

  # ---------------以下為安裝 OpenSSL 自製憑證的配置(未測試)--------------- #
  # # SSL 配置生成器:https://ssl-config.mozilla.org
  # # 迪菲-赫爾曼密鑰交換密碼器(DHE)的參數(.pem檔案需在docker-compose nginx volumes加入鏡射)
  # ssl_dhparam /etc/nginx/dhparam.pem;
  # # 啟用伺服器端保護, 防止 SSL/TLS BEAST 攻擊
  # # 伺服器採用加密演算法,nginx 默認為 off(on: tlsv1 tls1.1, off: tlsv1.2 tlsv1.3)
  # ssl_prefer_server_ciphers off;
  # # 採用協議為 TLS(前身是 SSL)版本
  # ssl_protocols TLSv1.2 TLSv1.3;
  # # 加密採用演算法
  # ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;

  # 啟用TLS Session Resumption,提高HTTPS性能
  # 快取分配50MB空間,缓存SSL Session(1MB可以存放4,000個Session)
  ssl_session_cache shared:SSL:50m;
  # SSL Session生命週期天數
  # 設定SSL Session保留天數,過了設定天數後才需要重新建立SSL連線
  ssl_session_timeout 1d;
  # 在建立完TLS連線後,TLS Server會將這個Session的資訊做成Ticket並傳送給Client端
  # 如Client端暫時中斷連線,之後也可以拿這個Ticket給Server來恢復Session
  # 因為目前使用為Session Cache,所以先關閉Ticket機制
  ssl_session_tickets off;

  # 啟用OCSP stapling(網站可隱私保護、可擴展的方式向訪客傳達證書吊銷信息的機制)
  # Google's DNS(8.8.8.8, 8.8.4.4)
  resolver 8.8.8.8 8.8.4.4;
  ssl_stapling on;
  ssl_stapling_verify on;
  ssl_trusted_certificate /etc/nginx/ssl.crt;

  # 唯有當符合同源政策下,才能被嵌入到Frame中
  add_header X-Frame-Options SAMEORIGIN;
  # 用戶端一定要遵循在Content-Type請求頭中對MIME類型的設定,而不能對其進行修改
  add_header X-Content-Type-Options nosniff;
  # 檢測到跨站腳本攻擊 (XSS (en-US))時,瀏覽器將停止加載頁面
  add_header X-XSS-Protection "1; mode=block";
  # 設置HSTS為365天
  add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload' always;

  # Proxy 方式(Nuxt.js + Nginx 配合)
  # Nuxt.js
  location / {
    # 緩存在 Client 端,減少伺服器請求
    expires $expires;
    # 虛擬主機的主域名 IP,Nginx 向後端 Web 伺服器發出的請求(如環境為 VM,IP 通常為 192.168.99.100)
    proxy_set_header Host $host;
    # 把真實用戶端的 IP 位址寫入到請求頭 X-Real-IP($remote_addr 為用戶端 IP,輸出結果為最後一個代理服務器的 IP,非真實用戶端 IP)
    proxy_set_header X-Real-IP $remote_addr;
    # X-Forwarded-For 代表用戶端 IP,$proxy_add_x_forwarded_for 為代理服務器的 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 請求使用的 Web 協議(HTTP 或 HTTPS)
    proxy_set_header X-Forwarded-Proto $scheme;
    # 連接成功後,等候後端 Web 伺服器響應時間(處理請求時間)
    proxy_read_timeout 1m;
    # 後端 Web 伺服器連接的超時時間
    proxy_connect_timeout 1m;
    # 使用代理服務器的標記(在大多數情況下可能沒有用)
    proxy_set_header X-NginX-Proxy true;
    # 後端 Web 伺服器
    proxy_pass http://app_domain.com;
    # 重定向 URL
    proxy_redirect off;
    # 用戶最多可以傳送多少資料(如:上傳圖片)如果用戶傳送到 Nginx 的資料超過這個限制,便會出現 413 Request Entity Too Large 錯誤,而這個參數的預設值是 1MB
    client_max_body_size 20M;
  }
  # FastCGI 方式(PHP + Nginx 配合)
  # 由於 Nginx 無法解析動態網頁,所以動態請求一般需要 PHP 來完成.通過 fastcgi, 也就是 php-fpm(fastcgi 的實現)來實現
  # phpMyAdmin
  location ^~ /pma {
    # 定義文件目錄(alias 後面必須要有 '/' 結束,否則會找不到文件)
    alias /var/www/html/;
    # 設置初始文件(頁),可設置多組(index index.php index.html;)
    # 如果文件存在,則使用文件作為路徑,發起內部重定向(內部重定向:域名+端口不發生變化,只會在同一個 server 下搜索)
    index index.php;
    # uri 路徑處理
    location ~ \.php$ {
      # 檢查文件是否存在,則返回 404
      try_files $uri = 404;
      # 引入 Nginx fastcgi_params 文件
      # 由於 Nginx 作為 Web 服務器,動態請求需轉發給後端 PHP 服務處理,轉發過程中就需要傳遞客戶端請求的一些參數
      include fastcgi_params;
      # 進行 uri 路徑處理
      fastcgi_split_path_info ^\/pma\/(.+\.php)(.*)$;
      # SCRIPT_FILENAME 變量是 php-fpm 可識別的腳本名稱,對應的 $fastcgi_script_name 變量是 Nginx 定義的腳本名稱
      # 腳本文件請求的路徑
      fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
      # 後端 Web 伺服器
      fastcgi_pass phpmyadmin:9000;
    }
  }
}

TAGSALL TAGS

  • # Nginx
  • # VPS
  • # Docker

SHARE

https://knight-li.com/blog/B-09202111/detail

RELATED

  • Nginx Config 設定

    2019.11.12

    JavaScript 取得各瀏覽器捲軸寬度

    程式技術教學

  • Nginx Config 設定

    2021.09.02

    Docker Compose 配置 & CLI

    程式技術教學

  • Docker Compose 配置 & CLI

    PREV POST Docker Compose 配置 & CLI

  • Nuxt.js 相關配置

    NEXT POST Nuxt.js 相關配置

Knight Li design

CONTACT

©Knight Li design, All Rights Reserved