生產環境中安裝和配置 Nginx 以部署 Flask 應用的詳細指南

在生產環境中部署 Flask 應用時,Nginx 常被用作反向代理服務器,與 WSGI 服務器(如 Gunicorn)協同工作。Nginx 可以處理靜態文件、提供 SSL/TLS 加密、實現負載均衡等功能。本文將詳細介紹如何在 Ubuntu/Debian 系統上安裝 Nginx,并配置它以反向代理 Flask 應用。


一、安裝 Nginx

1. 使用包管理器安裝 Nginx

在 Ubuntu 或 Debian 系統上,可以使用 apt-get 包管理器來安裝 Nginx。執行以下命令:

sudo apt-get update                    # 更新軟件包列表
sudo apt-get install nginx             # 安裝 Nginx

解釋:

  • sudo apt-get update
    • 更新本地的軟件包列表,確保獲取最新的軟件包信息。
  • sudo apt-get install nginx
    • 安裝 Nginx 服務器的軟件包。
  • 安裝完成后,Nginx 服務會自動啟動,默認監聽 80 端口。

2. 驗證 Nginx 是否安裝成功

在瀏覽器中輸入服務器的 IP 地址,或者在本地服務器上運行:

curl http://localhost

如果 Nginx 安裝成功,您應當看到包含 “Welcome to nginx!” 的默認歡迎頁面。


二、配置 Nginx

為了使 Nginx 反向代理您的 Flask 應用,需要創建或修改 Nginx 的配置文件。

1. 創建新的 Nginx 配置文件

在目錄 /etc/nginx/sites-available/ 下創建一個新的配置文件,例如 myapp

sudo nano /etc/nginx/sites-available/myapp

解釋:

  • sudo:以超級用戶權限執行命令。
  • nano:文本編輯器,可以根據喜好替換為 vivim 等。
  • 創建或打開名為 myapp 的配置文件。

2. 配置文件內容詳解

在打開的文件中,輸入以下內容:

server {listen 80;server_name your_domain.com;  # 或者服務器的 IP 地址# 配置反向代理到 Gunicorn 服務location / {proxy_pass http://127.0.0.1:5001;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;}# 處理靜態文件location /static/ {alias /path/to/your/app/static/;}
}
詳細解釋:
  • server { ... }:定義一個服務器塊,其中包含與特定域名或 IP 地址相關的配置。
1. 基本設置
  • listen 80;
    • 監聽服務器的 80 端口,即 HTTP 的默認端口。
  • server_name your_domain.com;
    • 指定服務器的域名或 IP 地址。
    • 替換為您的實際域名或服務器的公網 IP
    • 如果沒有域名,可以使用 _default_server,表示匹配所有請求。
2. 反向代理配置
  • location / { ... }

    • 匹配所有以 / 開頭的請求,即除其他 location 配置外的所有路徑。
  • proxy_pass http://127.0.0.1:5001;

    • 將匹配的請求轉發到運行在本地 5001 端口的服務,即 Gunicorn 服務器。
    • 確保 Gunicorn 正在監聽 127.0.0.1:5001
  • 設置請求頭信息(解決請求頭丟失的問題):

    • proxy_set_header Host $host;
      • 將原始請求的主機頭轉發給后端服務器。
    • proxy_set_header X-Real-IP $remote_addr;
      • 將客戶端的 IP 地址傳遞給后端服務器。
    • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      • 用于識別經過代理的原始客戶端 IP 地址,支持多級代理。
    • proxy_set_header X-Forwarded-Proto $scheme;
      • 將客戶端使用的協議(HTTP 或 HTTPS)傳遞給后端服務器。
3. 靜態文件處理
  • location /static/ { ... }
    • 匹配以 /static/ 開頭的請求,通常用于請求靜態文件(如 CSS、JavaScript、圖片等)。
  • alias /path/to/your/app/static/;
    • 指定靜態文件的實際存儲路徑。
    • 請將 /path/to/your/app/static/ 替換為您 Flask 應用中靜態文件所在的實際路徑

為什么需要 Nginx 處理靜態文件?

  • Nginx 對靜態文件的處理效率高于 Gunicorn。
  • 減輕 WSGI 服務器的負擔,提高整體性能。
完整的配置示例:
server {listen 80;server_name your_domain.com;  # 替換為您的域名或服務器 IPlocation / {proxy_pass http://127.0.0.1:5001;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;}location /static/ {alias /home/username/myproject/static/;  # 替換為實際的靜態文件路徑}error_log /var/log/nginx/myapp_error.log;access_log /var/log/nginx/myapp_access.log;
}

可選配置:

  • 錯誤頁面定制:您可以定義自定義的錯誤頁面,以提升用戶體驗。
  • 日志文件:指定專門的日志文件,方便調試和監控。

3. 創建符號鏈接以啟用配置

Nginx 默認從 /etc/nginx/sites-enabled/ 目錄加載配置文件。為了啟用新創建的配置,需要創建符號鏈接:

sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/

解釋:

  • ln -s:創建符號鏈接(軟鏈接)。
  • /etc/nginx/sites-available/myapp:原始配置文件。
  • /etc/nginx/sites-enabled/:Nginx 加載配置的目錄。

4. 測試 Nginx 配置并重啟服務

在重新加載 Nginx 之前,確保配置文件沒有錯誤。

sudo nginx -t

解釋:

  • nginx -t:測試 Nginx 配置文件的語法和有效性。
  • 如果輸出顯示 syntax is oktest is successful,表示配置沒有問題。

重啟 Nginx:

sudo systemctl restart nginx

或在某些系統中:

sudo service nginx restart

確保 Nginx 已成功重啟并加載新的配置。


三、驗證配置

1. 啟動您的 Flask 應用

確保您的 Flask 應用正在運行,并且 Gunicorn 正在監聽 127.0.0.1:5001。示例命令:

gunicorn -w 4 -b 127.0.0.1:5001 app:app

解釋:

  • -w 4:啟動 4 個工作進程。
  • -b 127.0.0.1:5001:綁定到本地的 5001 端口。
  • app:appapp.py 文件中的 Flask 實例名為 app

2. 訪問應用程序

在瀏覽器中輸入您的域名或服務器的 IP 地址:

http://your_domain.com/

您應該能夠看到您的 Flask 應用返回的內容。

3. 測試靜態文件

訪問一個靜態文件的 URL,例如:

http://your_domain.com/static/your_static_file.css

驗證 Nginx 是否正確提供靜態文件。


四、常見問題及解決方案

1. Nginx 無法啟動或重新加載失敗

癥狀:

  • 執行 sudo nginx -t 時出現錯誤。
  • Nginx 無法啟動或重啟。

解決方案:

  • 檢查配置文件的語法錯誤,特別是缺少分號、花括號等。

  • 確認配置文件中的路徑和文件是否存在。

  • 查看 Nginx 錯誤日志:

    sudo cat /var/log/nginx/error.log
    

2. 訪問應用時出現 502 Bad Gateway 錯誤

原因:

  • Nginx 作為反向代理,無法連接到后端的 Gunicorn 服務。

解決方案:

  • 確認 Gunicorn 正在運行,并且監聽的地址和端口與 Nginx 配置中的 proxy_pass 一致。
  • 檢查防火墻設置,確保本地端口是開放的。

3. 靜態文件無法加載或返回 404 錯誤

原因:

  • Nginx 的 alias 配置路徑不正確。
  • 靜態文件實際存儲的位置與配置不匹配。

解決方案:

  • 確認靜態文件的實際路徑,并在 Nginx 配置中正確設置 alias
  • 檢查文件權限,確保 Nginx 對靜態文件目錄有讀取權限。

五、進階配置與優化

1. 配置 HTTPS

為保證數據傳輸的安全性,建議使用 SSL/TLS 加密。

  • 獲取 SSL 證書:

    • 可以使用 Let’s Encrypt 免費獲取證書:

      sudo apt-get install certbot python3-certbot-nginx
      sudo certbot --nginx -d your_domain.com
      
  • 自動配置 Nginx:

    • Certbot 會自動修改 Nginx 配置,添加 SSL 配置和自動重定向。

2. 設置防火墻

  • 使用 UFW 管理防火墻規則:

    sudo ufw allow 'Nginx Full'
    sudo ufw delete allow 'Nginx HTTP'
    
  • 確保僅開放必要的端口(如 80、443)。

3. 優化 Nginx 配置

  • 啟用 Gzip 壓縮:

    http 塊中添加:

    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
    
  • 設置緩存頭:

    在靜態文件的 location 塊中添加:

    location /static/ {alias /path/to/your/app/static/;expires 30d;add_header Cache-Control "public, max-age=2592000";
    }
    
  • 限制請求速率:

    防止惡意請求導致的服務器壓力過大:

    http {limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;...
    }
    server {...location / {limit_req zone=one burst=20 nodelay;...}
    }
    

4. 日志分割與管理

  • 設置日志切割

    使用 logrotate 管理 Nginx 日志文件,防止日志文件過大。

  • 自定義日志格式

    http 塊中定義新的日志格式:

    log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
    

    然后在 server 塊中使用:

    access_log /var/log/nginx/access.log main;
    

六、總結

通過以上步驟,您已經成功在生產環境中安裝并配置了 Nginx,以反向代理您的 Flask 應用。Nginx 的強大功能不僅提高了應用的性能和安全性,還提供了靈活的配置選項,滿足不同的部署需求。

關鍵點回顧:

  • 安裝 Nginx:使用包管理器方便快捷。
  • 配置 Nginx:創建專用的配置文件,詳細理解每一項配置的含義。
  • 處理靜態文件:讓 Nginx 接管靜態文件的服務,提高效率。
  • 啟用配置并重啟 Nginx:確保新的配置生效。
  • 驗證配置:通過訪問應用和靜態資源,確認配置正確。
  • 解決常見問題:掌握故障排查的方法,保證服務的穩定運行。

后續建議:

  • 持續監控:使用監控工具(如 Prometheus、Grafana)監測服務器性能和應用狀態。
  • 安全更新:定期更新 Nginx 和系統軟件,修復已知的安全漏洞。
  • 備份配置:保存 Nginx 的配置文件,便于恢復或遷移。

通過合理配置和優化,您的 Flask 應用將在生產環境中高效、安全地運行,提供可靠的服務。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/85654.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/85654.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/85654.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙進階——Mindspore Lite AI框架源碼解讀之模型加載詳解(一)

文章大綱 引言一、模型加載概述二、核心數據結構三、模型加載核心流程 引言 Mindspore 是一款華為開發開源的AI推理框架,而Mindspore Lite則是華為為了適配在移動終端設備上運行專門定制的版本,使得我們可以在OpenHarmony快速實現模型加載和推理等功能&…

AI煉丹日志-24 - MCP 自動操作 提高模型上下文能力 Cursor + Sequential Thinking Server Memory

點一下關注吧!!!非常感謝!!持續更新!!! Java篇: MyBatis 更新完畢目前開始更新 Spring,一起深入淺出! 大數據篇 300: Hadoop&…

【仿muduo庫實現并發服務器】實現時間輪定時器

實現時間輪定時器 1.時間輪定時器原理2.項目中實現目的3.實現功能3.1構造定時任務類3.2構造時間輪定時器每秒鐘往后移動添加定時任務刷新定時任務取消定時任務 4.完整代碼 1.時間輪定時器原理 時間輪定時器的原理類似于時鐘,比如現在12點,定一個3點的鬧…

Windows10下搭建sftp服務器(附:詳細搭建過程、CMD連接測試、連接失敗問題分析解決等)

最終連接sftp效果 搭建sftp服務器 1、這里附上作者已找好的 freeSSHd安裝包 ,使用它進行搭建sftp服務器。 2、打開freeSSHd安裝包,進行安裝 (1)、選擇完全安裝 (2)、安裝完成后,對提示窗口選擇關閉 (3)、安裝完成后,提示是否安裝私有密鑰。我們選擇"是" (4)、安…

推薦幾個不錯的AI入門學習視頻

引言:昨天推薦了幾本AI入門書(AI入門書),反響還不錯。今天,我再推薦幾個不錯的AI學習視頻,希望對大家有幫助。 網上關于AI的學習視頻特別多。有收費的,也有免費的。我今天只推薦免費的。 我們按…

點擊啟動「高效模式」:大騰智能 CAD 重構研發設計生產力

在制造業數字化轉型浪潮中,設計工具的革新正成為企業突破效率瓶頸的關鍵。傳統CAD軟件因本地硬件依賴、協作壁壘高筑、復雜場景響應遲緩等問題,長期困擾設計團隊。 大騰智能CAD依托華為云底座、自研幾何引擎及AI技術深度融合,為制造行業各細…

cursor如何開啟自動運行模式

在Cursor中,開啟自動運行模式即啟用“Yolo Mode”,具體操作如下: 按下Ctrl Shift J(Windows/Linux)或Cmd Shift J(Mac)打開Cursor設置。導航到“Features”(功能)選…

Windows10-ltsc-2019 使用 PowerShell 安裝安裝TranslucentTB教程(不通過微軟商店安裝)

Windows10-ltsc-2019 使用 PowerShell 安裝安裝TranslucentTB教程(不通過微軟商店安裝) 下載 v2020.4(最后一個兼容 1809 的版本): TranslucentTB安裝包(下載不了上面有安裝包)安裝依賴項(如未安裝&#x…

分布式拜占庭容錯算法——實現工作量證明(PoW)算法詳解

Java 實現工作量證明(PoW)算法詳解 一、PoW 核心原理 #mermaid-svg-AAj0Pvst1PVcVy5v {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-AAj0Pvst1PVcVy5v .error-icon{fill:#552222;}#mermaid…

黑馬Java面試筆記之框架篇(Spring、SpringMvc、Springboot)

一. 單例bean Spring框架中的單例bean是線程安全的嗎? Spring框架中的bean是單例的,可以在注解Scope()進行設置 singleton:bean在每一個Spring IOC容器中只有一個實例。prototype:一個bean的定義可以有多個實例 總結 二. AOP AOP稱…

electron下載文件

const http require(http); const https require(https); const fs require(fs); const { URL } require(url); const path require(path);// 下載文件函數 function downloadFile(url, savePath) {return new Promise((resolve, reject) > {try {console.log(開始下載…

快速掌握 GO 之 RabbitMQ 結合 gin+gorm 案例

更多個人筆記見: (注意點擊“繼續”,而不是“發現新項目”) github個人筆記倉庫 https://github.com/ZHLOVEYY/IT_note gitee 個人筆記倉庫 https://gitee.com/harryhack/it_note 個人學習,學習過程中還會不斷補充&…

android FragmentManager 刪除所有Fragment 重建

在Android開發中,管理Fragment是一項常見任務,有時需要刪除所有Fragment并重新創建。這在某些場景下,例如用戶需要重置應用狀態或切換內容時,顯得尤為重要。本文將詳細介紹如何通過 FragmentManager刪除所有Fragment并重建。 一、…

ubuntu之開機自啟frpc

在 Ubuntu 系統中為 frpc 設置開機自啟(以 frpc -c frpc.toml 命令為例),可以通過 systemd 服務實現。以下是詳細步驟: 創建 systemd 服務文件 sudo vim /etc/systemd/system/frpc.service 寫入以下內容(根據你的路…

推薦一款PDF壓縮的工具

今天一位小伙伴找來,問我有沒有辦法將PDF變小的辦法。 詳細了解了一下使用場景: 小伙伴要在某系統上傳一個PDF文件,原文件是11.6MB,但是上傳時系統做了限制,只能上傳小于10MB的文件,如圖: 我聽…

JDK21深度解密 Day 11:云原生環境中的JDK21應用

【JDK21深度解密 Day 111】云原生環境中的JDK21應用 本文是《JDK21深度解密:從新特性到生產實踐的全棧指南》專欄的第11天內容,聚焦云原生環境中的JDK21應用。我們將深入探討如何在容器化、微服務、Serverless等云原生架構中充分發揮JDK21的技術優勢,提升Java應用的性能、穩…

Java-redis實現限時在線秒殺功能

1.使用redisson pom文件添加redisson <!--redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.23.4</version></dependency> 2.mysql數據庫表設…

QT- QML Layout+anchors 布局+錨點實現窗口部件權重比例分配

布局管理 簡單比較兩種界面管理錨點布局實現比例布局布局管理實現比例布局循環依賴問題簡談 在日常打螺絲中&#xff0c;我們偶爾會需要實現界面各組件能按比例放置&#xff0c;自適應各種分辨率的需求。我用錨點和布局都實現過相關界面&#xff0c;記錄下來兩種方式實現的差異…

Java項目OOM排查

排查思路 Java項目出現OOM&#xff08;Out Of Memory&#xff0c;內存溢出&#xff09;問題時&#xff0c;排查思路如下&#xff1a; 確認OOM類型&#xff1a; Java Heap Space&#xff1a;堆內存溢出&#xff0c;通常是對象創建過多或內存泄漏。PermGen Space&#xff1a;永久…

vue+threeJs 生成云狀特效屏幕

嗨&#xff0c;我是小路。今天主要和大家分享的主題是“vuethreeJs 生成云狀特效屏幕”。 動態云狀特效示例圖 二、實例代碼 <!--創建一個動態數字屏幕--> <template><div class"pageBox"><div class"leftBox" ref"lef…