PREV POST Docker Compose 配置 & CLI
PUBLIC DATE:2021.09.08
B-09202111Nginx 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;
}
}
}