前后端分離(前端 + flask):
# 阻止ip訪問server {# default_server 是一個配置參數,用于指定當請求的域名(Host 頭)沒有匹配任何 server 塊時,Nginx 應該使用哪個 server 塊來處理這些請求。 listen 443 ssl default_server;server_name _; # 匹配所有未配置的域名或IP,這樣設置了 default_server 的 server 塊(即本塊)就會處理所有未匹配的請求。ssl_certificate cert/證書.pem; # 簽名證書路徑,相對路徑、絕對路徑都可以ssl_certificate_key cert/私鑰.key; # 私鑰路經return 403; # 返回禁止訪問}# https配置模板server {# https的默認端口是443,只有把端口寫成443,登錄網站的時候才不需要寫端口號listen 443 ssl;# [::] 是 IPv6 的通配符地址,表示監聽所有可用的 IPv6 地址(類似于 IPv4 的 0.0.0.0)listen [::]:443 ssl;# Nginx 會先檢查請求的域名是否與某個 server_name 精確匹配,# 如果沒有精確匹配,會嘗試使用通配符匹配。如果沒有找到匹配的 server_name,Nginx 會將請求交給 default_server 的 server 塊。server_name 這里寫你的域名;# ssl配置,證書可以使用免費的Let's Encrypt生成,阿里云上也有,但是簽名需要域名,# 不需要域名的可以自己使用 openssl 創建自簽名證書,但是自簽名證書不受信任ssl_certificate cert/證書.pem; # 簽名證書路徑,nginx支持pem格式的證書ssl_certificate_key cert/私鑰.key; # 私鑰路經# 啟用ssl協議,強制使用 TLS 1.2 和 1.3 版本ssl_protocols TLSv1.2 TLSv1.3; # 啟用加密套件,加密套件的順序用冒號分隔。很重要,Nginx 會按照這個順序選擇一個加密套件ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';# 強制性要求瀏覽器在加密連接時優先使用 服務器端 的加密套件ssl_prefer_server_ciphers on; # 會話緩存:會話緩存能夠存儲客戶端和服務器之間建立的 SSL/TLS 會話,避免每次請求都重新建立完整的握手過程,從而提升性能,減少 CPU 使用。通常 1 MB 可以存儲大約 4000 個會話。ssl_session_cache shared:SSL:1m; # 會話緩存時間:用于設置 SSL 會話緩存中會話的過期時間。在指定時間內,客戶端可以重用之前緩存的會話,對于大多數網站,設置為 5m(5 分鐘)到 10m(10 分鐘)是合理的范圍。ssl_session_timeout 5m; # 向 HTTP 響應中添加自定義的 HTTP 頭部信息。語法:add_header <header_name> <value> [always];# add_header 指令可以寫在 http、server 或 location 塊中,作用范圍會逐級縮小。如果多個級別的 add_header 沖突,優先使用最具體(內層)的配置。# 強制客戶端使用 HTTPS 訪問,防止中間人攻擊。# max-age=31536000:緩存 1 年。includeSubDomains:對子域生效。preload:允許加入瀏覽器 HSTS 預加載列表。# [always]: 默認情況下,add_header 只會在響應狀態碼為 200、204、206、301、302、303 或 304 時添加。如果加上 always 參數,頭部會在所有響應中添加(包括錯誤狀態碼,如 404 或 500)。add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;# 只允許特定的 HTTP 方法。add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";# 限制加載資源的來源,防止惡意腳本注入。# default-src 'self' 僅允許加載本域的資源。如果你不熟悉域的概念就別用# script-src 'self' 'unsafe-inline' 限制腳本加載來源,僅允許本域和內聯腳本。如果你不熟悉域的概念就別用# img-src 'self' data: 限制圖片來源,僅允許本域和 data: 協議。add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; img-src 'self' data:;";# location 指令用于定義一個位置塊,它根據請求的 URI 匹配特定的路徑。# 前端代理,根路徑指向靜態文件location / {# 指定靜態文件的根目錄root html/course;# 指定當請求為目錄時,默認返回的頁面index index/index.html;}# 后端代理,將/api/開頭的請求轉發到后端服務器的 http://localhost:5000 上location /api/ {# proxy_pass 指定代理的后端服務器的地址。# 注意:http://localhost:5000/ 和 http://localhost:5000 所代表的url拼接規則是不一樣的。自己去搜 proxy_pass 參數怎么用proxy_pass http://localhost:5000/;# proxy_set_header 用于設置轉發給后端服務器的請求頭部。# Host頭部保持了原始請求的Host值。proxy_set_header Host $host;# X-Real-IP頭部記錄了原始客戶端的IP地址。proxy_set_header X-Real-IP $remote_addr;# X-Forwarded-For頭部是一個逗號分隔的列表,包含了從客戶端到代理服務器的所有IP地址(包括客戶端的IP地址)。proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;# X-Forwarded-Proto頭部記錄了原始請求使用的協議(如http或https)。proxy_set_header X-Forwarded-Proto $scheme;}# WebSocket 代理,我使用的是 flask_socketio,請根據實際情況修改匹配的urllocation /socket.io/ {proxy_pass http://localhost:5000;# 這里必須使用 http1.1 版本,因為1.1版本才是長連接proxy_http_version 1.1;# 設置 Upgrade 請求頭,用于處理協議升級(從 HTTP 升級到 WebSocket)。proxy_set_header Upgrade $http_upgrade;# 強制將 Connection 設置為 "upgrade",以支持協議切換。proxy_set_header Connection "upgrade";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_set_header X-Forwarded-Proto $scheme;# 設置超時時間為 60 秒,用于保持 WebSocket 連接。proxy_read_timeout 60s;}# 404錯誤頁面配置:當請求的文件不存在時,轉入 /404.html 頁面error_page 404 /404.html;# 匹配 /404 錯誤頁面,=表示精確匹配location = /404.html {# 指定 404.html 頁面的位置root /usr/share/nginx/html/404.html;}}