」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 將 django 部署到生產環境

將 django 部署到生產環境

發佈於2024-11-07
瀏覽:550

我最近将我自己的 django 应用程序部署到生产环境中。该网站名为 videoeiro.com,是用 django HTML/CSS/JS Tailwind 开发的。

设置

我正在使用 debian 12 服务器,它将通过 cloudflare 隧道公开我的应用程序。所有静态文件都通过 nginx 提供服务,Django 项目由 Gunicorn 运行。

在本指南中,我将向您展示如何进行设置。

准备 Django 项目

您要做的第一件事是打开 settings.py 并更改以下内容

Debug = False
ALLOWED_HOSTS = ['yourdomain.tld']
CSRF_COOKIE_SECURE = True
CSRF_TRUSTED_ORIGINS = [
    'yourdomain.tld',
]

您还应该将 SECRET_KEY 更改为长随机字符串,切勿与任何人共享。

之后创建一个名为 .gitignore 的新文件并粘贴以下内容:

db.sqlite3
*.pyc

这将确保数据库不会上传到我们的服务器,也不会上传 pyc 文件。

现在您可以将项目上传到新的 github 存储库(或 gitea 存储库)。如果您不希望每个人都可以访问您的源代码,请确保将存储库设置为私有。

如果您想确保源代码保持私有,我建议您设置一个自托管 gitea 实例,请阅读 Selfhost your own gitea instance - selfhosted, lightweight github Alternative,以了解如何做到这一点。

git init
git branch -M main
git add .
git commit -m "initial commit"
git remote add origin https://...
git push -u origin main

现在您已经完成了,您应该登录到您的服务器

服务器设置

在配置任何内容之前,请确保您不允许任何使用密码的 ssh 登录。遵循使用基于密钥的身份验证保护 ssh 来保护您的服务器免受此类攻击。

登录您的服务器

ssh [email protected]

确保您的包裹符合数据

sudo apt update && sudo apt upgrade

现在安装 python、pip、git 和 nginx

sudo apt install python3 python3-pip git nginx

现在将您的项目克隆到您的主目录中。

git clone https://...
cd my-project

安装后,安装以下内容:

pip install django django-crispy-forms whitenoise

现在尝试运行该项目:

python3 manage.py runserver

如果您收到缺少软件包的错误,请安装它并重新运行。

配置gunicorn

现在我们将设置gunicorn

首先安装

pip install gunicorn

现在用您最喜欢的文本编辑器创建一个名为gunicorn.service的新文件:

sudo vim /etc/systemd/system/gunicorn.service

并粘贴以下内容:

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=YOURUSER
Group=www-data
WorkingDirectory=/home/YOURUSER/PROJECT
ExecStart=/path/to/gunicorn --access-logfile - --workers 3 --bind 127.0.0.1:8000 PROJECTNAME.wsgi:application

[Install]
WantedBy=multi-user.target

将 YOURUSER 更改为您的用户。

找到gunicorn运行的路径:

which gunicorn

您的项目名称是项目内包含 settings.py 文件的文件夹的名称。

现在运行以下命令来启动并启用gunicorn(开机启动)

sudo systemctl daemon-reload
sudo systemctl start gunicorn.service
sudo systemctl enable gunicorn.service

现在,如果您访问 127.0.0.1:8000,您应该会看到您的项目正在运行。

但是还没完

设置 nginx

现在我们需要通过 nginx 提供静态内容。

首先用你喜欢的文本编辑器创建一个新的nginx配置文件:

sudo vim /etc/nginx/sites-available/PROJECT

将 PROJECT 更改为您想要的任何内容

现在粘贴以下内容:

server {
    listen 80;
    server_name YOURDOMAIN;

    location /static/ {
    alias /var/www/staticfiles/;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}

只需将 YOURDOMAIN 更改为将托管此域名的域。

创建符号链接以启用您的网站:

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

启动并启用nginx:

sudo systemctl start nginx
sudo systemctl enable nginx

设置静态文件

您要做的第一件事是 cd 进入您的 (django) 项目

cd project

现在运行以下命令:

python3 manage.py collectstatic

这将创建一个名为 staticfiles 的新文件夹

现在要设置静态文件,我们有两个选项:

  1. 将 /etc/nginx/nginx.conf 中的用户更改为您的用户(不太安全)
  2. 将静态文件复制到/var/www/(更安全)

我将做第二个选项:

首先在/var/www中创建一个名为staticfiles的新文件

sudo mkdir -p /var/www/staticfiles

现在复制项目中的所有静态文件:

sudo cp staticfiles/* /var/www/staticfiles

现在 cd 进入 /var/www

cd /var/www

更改所有文件的所有权

sudo chown www-data:www-data staticfiles
sudo chown www-data:www-data staticfiles/*

重启nginx服务:

sudo systemctl restart nginx

现在如果您前往:

127.0.0.1

您应该看到您的网站正在运行,并提供所有静态文件!

通过 cloudflare 隧道公开

现在让您的网站可公开访问。

为此,您需要一个 cloudflare 帐户和一个指向 cloudflare 的域名。

首先前往零信任仪表板

在“网络”下单击“隧道”,然后单击“创建隧道”

创建后,您应该安装并运行连接器,按照页面上的说明进行具体设置。

连接器运行后,您应该单击公共主机名选项卡并添加公共主机名。

现在您应该看到类似这样的内容:Deploy django to production

填写我所拥有的信息。服务类型应为 HTTP,url 应为 127.0.0.1:80 或 localhost:80

现在,如果您前往指定的域,您应该会看到您的应用程序已启动并正在运行。

恭喜!

如果您喜欢这篇文章并想支持我的(大部分是无偿的)工作,您可以在这里捐款。

加入我的免费时事通讯!

在这里加入

版本聲明 本文轉載於:https://dev.to/4rkal/deploy-django-to-production-4bn0?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • Angular 中的抽象文本內容
    Angular 中的抽象文本內容
    如果您正在开发网站,您可能会在组件模板中编写大量文本: 像这样编写文本不会损坏或有错误,但对于长期运行的项目来说维护起来相当烦人。为了改进这一点,您可以创建一个包含特定功能的所有文本的文件,并通过导入正确的密钥在整个应用程序中重复使用它。 该文件可以是: JSON 文件 TypeScript 文件 ...
    程式設計 發佈於2024-11-08
  • 為什麼現實世界的機器學習需要分散式運算
    為什麼現實世界的機器學習需要分散式運算
    PySpark 如何帮助您像专业人士一样处理庞大的数据集 PyTorch 和 TensorFlow 等机器学习框架非常适合构建模型。但现实是,当涉及到现实世界的项目时(处理巨大的数据集),您需要的不仅仅是一个好的模型。您需要一种有效处理和管理所有数据的方法。这就是像 PySpark 这样的分布式计算...
    程式設計 發佈於2024-11-08
  • 使用 Go IoT 平台確保物聯網資料完整性
    使用 Go IoT 平台確保物聯網資料完整性
    翻译: Go IoT 开发平台是使用 Go 编程语言开发的免费、高效、可扩展的物联网 (IoT) 解决方案。平台支持MQTT、HTTP、WebSocket、COAP、TCP/IP等数据传输协议,并提供基于JavaScript的报警功能和数据统计服务的轻量级配置工具。 官网:http://iot-de...
    程式設計 發佈於2024-11-08
  • 發布 CLI 應用程式(使用 Apt 和 YUM)
    發布 CLI 應用程式(使用 Apt 和 YUM)
    简介 我最近非常喜欢 CLI 应用程序。也许这是我童年时期终端的诱惑(从 486/33 上的 DOS 和我父亲的旧 Apple IIe 开始)。对于 X 代 Commodore64 时代,我出生得有点晚,但正好赶上了了解 Windows 95 之外的更多内容。那是一个有趣的时代,当...
    程式設計 發佈於2024-11-08
  • 適用於您的即時應用程式的 Supersonic GPU MelSpectrogram
    適用於您的即時應用程式的 Supersonic GPU MelSpectrogram
    在 Simli,我们最关心的是延迟。毕竟,这就是我们的目标:低延迟视频。另一方面,音频机器学习中一些最常用的算法的实现速度非常慢。需要明确的是,这些实现通常适合创建模型本身或批量推理。但对于 Simli 的我们来说,几毫秒就可能意味着视频是断断续续的混乱还是流畅。 对我来说幸运的是(以及作为读者的...
    程式設計 發佈於2024-11-08
  • 如何在 Next.js 應用程式中安裝和使用「next-sitemap」:逐步指南
    如何在 Next.js 應用程式中安裝和使用「next-sitemap」:逐步指南
    如果您使用 Next.js 建立網站,您可能希望搜尋引擎能夠有效地發現您的頁面並為其建立索引。改進此過程的一種方法是建立網站地圖。網站地圖是一個列出您網站上所有網址的文件,可協助 Google 等搜尋引擎更快地抓取您的網站並將其編入索引。 在本指南中,我們將逐步介紹如何在 Next.js 專案中安...
    程式設計 發佈於2024-11-08
  • Python 線程模組快速指南及範例
    Python 線程模組快速指南及範例
    介紹 Python 中的線程模組提供了一個高級介面來創建和管理線程,使您能夠並發運行程式碼。這對於可以並行執行的任務(例如 I/O 密集型操作)特別有用。以下列出了threading模組中常用的方法和函數,並附有簡要範例。 1. 線程() Thread 類別是執行...
    程式設計 發佈於2024-11-08
  • ✨ 從貢獻者到核心專案維護者:我的開源之旅 ✨
    ✨ 從貢獻者到核心專案維護者:我的開源之旅 ✨
    這一切都始於一個簡單的拉取請求...... 我記得當我第一次涉足開源世界。我最初的目標只是解決我欣賞的項目中的一個小問題。我幾乎不知道,這小小的貢獻將開始一段令人難以置信的旅程。 第 1 步:作為貢獻者開始 最初,我對貢獻感到緊張。我不確定我的程式碼是否足夠好或我的解決方案是否有效。但隨著時間的推...
    程式設計 發佈於2024-11-08
  • 程式設計基礎:C 簡介
    程式設計基礎:C 簡介
    C語言基礎:變數與類型: 定義變數以儲存數據,類型指定儲存的資料類型。輸入輸出: printf() 輸出到螢幕,scanf() 讀取使用者輸入。運算子: 使用算術和比較運算子進行運算和比較。控制流程: if-else 和 switch-case 用於選擇性執行程式碼,循環用於重複執行程式碼。函數: ...
    程式設計 發佈於2024-11-08
  • Mixin 如何在沒有傳統繼承的情況下增強類別功能?
    Mixin 如何在沒有傳統繼承的情況下增強類別功能?
    理解Mixins:類擴展的模組化方法mixin 是一種軟體設計模式,允許組合多個類,提供一種擴展基底類別功能而不直接繼承基底類別的方法。這種技術通常被稱為“抽象子類別”,因為它類似於繼承的概念,但具有更靈活和更精細的方法。 要了解 mixin 的工作原理,讓我們檢查以下範例:// Number cl...
    程式設計 發佈於2024-11-08
  • PHP 中可以像 JavaScript 一樣建立匿名物件嗎?
    PHP 中可以像 JavaScript 一樣建立匿名物件嗎?
    在 PHP 中建立匿名物件在 JavaScript 中,可以輕鬆建立匿名物件。然而,這種技術也可以應用在 PHP 上嗎? 術語解釋在討論對象時,術語「匿名」並不完全準確。相反,它應該被稱為“匿名類型的對象”。 PHP 物件創建在 PHP 中,所有物件都有一個指定的類別。預設類別是stdClass,該...
    程式設計 發佈於2024-11-08
  • 為什麼我的程式僅在 Windows Vista 的發布模式下崩潰?
    為什麼我的程式僅在 Windows Vista 的發布模式下崩潰?
    僅在發布版本中程序崩潰:深入研究調試晦澀之處遇到一個奇特的“薛定諤貓”錯誤可能會讓程式設計師感到困惑。在這種情況下,只有在發布模式下建置並從命令列啟動時,程式才會可靠地崩潰,並留下神秘的終止通知。 追蹤崩潰的根源透過細緻的調試,罪魁禍首方法已經被識別出來,但崩潰本身駐留在最後一個可見跟踪消息之後執行...
    程式設計 發佈於2024-11-08
  • Python 循環 2
    Python 循環 2
    大家好!这是 python 循环系列的第二部分。 第 1 部分在这里: https://dev.to/coderanger08/python-loops-1-5dho 本周,我们将更多地讨论 while 和 for 循环、break 和 pass 语句、范围函数等等。让我们开始吧。 ...
    程式設計 發佈於2024-11-08
  • 你能比較 C++ 中不同容器的迭代器嗎?
    你能比較 C++ 中不同容器的迭代器嗎?
    比較來自不同容器的迭代器:一個警示故事在C 中,迭代器提供了一個強大的遍歷集合的機制。然而,在使用來自不同容器的迭代器時,重要的是要意識到這些限制。 比較不同容器的迭代器是否合法的問題經常出現。考慮以下範例:std::vector<int> foo; std::vector<int...
    程式設計 發佈於2024-11-08
  • Spring Boot:Java 應用程式開發的革命
    Spring Boot:Java 應用程式開發的革命
    如果你用Java開發,你可能聽過Spring Boot。但如果您還不知道,請準備好發現最強大、最實用的工具之一,它徹底改變了 Java 應用程式的創建方式! 什麼是 Spring Boot? Spring Boot 是一個框架,它使 Java 應用程式的開發變得更加容易(而且更加容易!)。它消除...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3