当前位置: 首页 > news >正文

Docker+Uwsgi+Nginx部署Django项目保姆式教程

之前,我和大家分享了在docker中使用uwsgi部署django项目的教程。这次,为大家带来的是使用Docker+Uwsgi+Nginx部署Django项目。废话不多说,我们开干。

步骤1:使用命令创建一个django项目

我这里python版本使用的是3.9.x
首先,我们使用pip安装django

pip install django

接下来,我们创建一个django项目

django-admin startproject djangoProject

步骤2:修改settings.py

在settings.py中需要配置一下允许host
ALLOWED_HOSTS = ['*']
然后将Debug模式改为False
DEBUG = False

步骤3:在django项目中的urls.py写一个示例代码,用户测试代码是否正常运行

# urls.py
from django.urls import path
from django.shortcuts import HttpResponsedef index(request):return HttpResponse("Hello World Django!")urlpatterns = [path('', index)
]

这样以来,如果项目部署成功,打开浏览器访问页面,会正常显示Hello World Django!

步骤4:在djago根目录手动新建一个requirements.txt

# requirements.txt
Django==4.2.11
uwsgi==2.0.24

步骤5:将django项目上传到服务器的某个路径上

例如,我这里使用宝塔面板将django项目手动上传到了/www/wwwroot/djangoProject这个路径下。
在这里插入图片描述

步骤6:在django根目录新建Dockerfile文件

Dockerfile文件代码如下:

# 使用 Python 3.9 作为基础镜像
FROM python:3.9# 设置工作目录
WORKDIR /app# 复制项目文件到工作目录
COPY . /app# 创建一个新的用户和组,例如命名为 myapp
ARG USER_ID=1000
ARG GROUP_ID=1000
RUN groupadd -g ${GROUP_ID} myapp && \useradd -u ${USER_ID} -g ${GROUP_ID} -d /app myapp && \chown ${USER_ID}:${GROUP_ID} /app# 切换回 root 用户来创建虚拟环境
USER root# 创建虚拟环境
RUN python -m venv venv# 激活虚拟环境
ENV PATH /app/venv/bin:$PATH# 设置清华 pip 镜像
ENV PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple  
ENV PIP_TRUSTED_HOST=pypi.tuna.tsinghua.edu.cn# 安装项目依赖
RUN pip install --no-cache-dir -r requirements.txt# 设置环境变量,确保Django在生产模式下运行
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1EXPOSE 8000# 切换回 myapp 用户来运行应用
USER myapp

步骤7:在django项目根目录新建uwsgi.ini文件

# uwsgi.ini配置文件
[uwsgi]
master = true
# 指定 Django 项目的 WSGI 文件
# 这里的djangoProject是django项目中wsgi.py文件的父目录名称,我这里名称是djangoProject
module = djangoProject.wsgi:application# 项目根目录,根据实际情况进行调整
chdir = /app# 指定 Python 环境变量,确保使用正确的 Python 版本
home = /app/venv# 指定 uWSGI 服务的 http 文件位置
http = 0.0.0.0:8000# 进程数和线程数根据需要进行调整
processes = 4
threads = 2# 设置环境变量,确保 Django 在生产模式下运行
env = DJANGO_SETTINGS_MODULE=djangoProject.settings
vacuum = true

步骤8:在django根目录中新建nginx.conf文件

# nginx.conf配置文件
# events 块在 Nginx 配置中用于设置与网络连接相关的全局参数,必须放在http的上面# 否则会报错!!这里坑了我很久。这些参数影响 Nginx 服务器如何处理连接和请求。
# 如果不包含 events 块,Nginx 将无法初始化这些全局参数,
# 因为它不知道如何处理网络连接。这会导致 Nginx 在启动时报错,
# 因为它缺少必要的配置信息来正确地处理客户端请求。
events {worker_connections 1024;
}http {server { listen 80;  # 监听 80 端口server_name *.xxx.com xxx.com;  # 配置服务器名称,支持通配符子域名和顶级域名location / {  # 配置根位置的请求处理proxy_pass http://web:8000; # 转发到 uWSGI 服务 # 转发到 uWSGI 监听的端口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;}}
}

步骤9:在django项目根目录中新建docker-compose.yml文件

services:web:build: .command: uwsgi --ini /app/uwsgi.ini      nginx:image: nginx:latestvolumes:- ./nginx.conf:/etc/nginx/nginx.confports:- "80:80"depends_on:- web

好了,到这里所有的部署依赖文件我们就创建完毕了,接下来就是输入命令让docker容器跑起来。

步骤10:构建docker镜像并运行

cd到django根目录中,因为执行docker命令必须在有Dockerfile文件的同级目录中。
我们先执行构建docker镜像命令:

docker-compose build

然后再执行运行命令

docker-compose up -d

docker-compose:这是命令行工具的名称,用于通过 Docker Compose 技术来管理多容器 Docker 应用。

up:这是 docker-compose 命令的一个子命令,用于构建、启动并创建服务所定义的容器。

-d 或 --detach:这个选项告诉 Docker Compose 在后台运行容器。当你执行 docker-compose up -d 命令后,Docker Compose 将启动定义在 docker-compose.yml 文件中的所有服务,并将它们作为后台进程运行。这意味着命令会立即返回,你可以看到容器启动的过程,但之后你可以继续在同一个终端会话中执行其他命令。

接下来,我们可以输入docker-compose ps 或 docker ps命令来查看正在运行的docker镜像。
在这里插入图片描述
这里我们可以清晰地看到,有两个镜像正在运行,并且nginx运行在80端口,django运行在8000端口。最后,我们可以在浏览器中访问域名或者服务器ip。就能看到项目部署成功了。
在这里插入图片描述

相关文章:

Docker+Uwsgi+Nginx部署Django项目保姆式教程

之前,我和大家分享了在docker中使用uwsgi部署django项目的教程。这次,为大家带来的是使用DockerUwsgiNginx部署Django项目。废话不多说,我们开干。 步骤1:使用命令创建一个django项目 我这里python版本使用的是3.9.x 首先&#…...

[openGL] 高级光照-Gamma矫正

目录 一 Gamma是什么? 二 感知光度和物理光度 2.1 与Gamma的关系 2.3 存在问题和弊端? 三 Gamma矫正(逆Gamma) 3.1 Gamma矫正的两种方法 3.2 sRGB空间 3.3 重复校正 3.3.1 在着色器中处理重复校正 3.3.2 在加载纹理时就重复校正 3.3.3 校正前后效果 本章节Qt源码点…...

Prometheus+Grafana监控K8S集群(基于K8S环境部署)

目录 一.环境信息二.部署提前工作三.部署Prometheus监控系统四.部署Node_exporter组件五.部署Kube_state_metrics组件六.部署Grafana可视化平台七.Grafana接入Prometheus数据八.Grafana添加监控模板九.拓展 一.环境信息 1.服务器及k8s版本信息 IP地址主机名称角色版本192.168…...

[opencv]VideoWriter写出fourcc格式

fourcc支持的格式 fourcc全名Four-Character Codes,四字符代码,该编码由四个字符组成 cv2.VideoWriter_fourcc(O,O,O,O) cv2.VideoWriter_fourcc(*OOOO) 通常写法有上述两种形式,O代表一个字符,通常有 支持avi格式的有&#…...

软考中级网络工程师-网络技术

下列命令片段含义是( )。 system-view [HUAWEI] observe-port 1 interface gigabitethernet 0/0/1 [HUAWEI] interface gigabitethernet 0/0/2 [HUAWEI-GigabitEthernet0/0/2] port-mirroring to observe-port 1 inbound A 配置端口镜像 B 配置链路聚合 C 配置逻辑接口 D 配置访…...

cmake基础教程(12)函数和宏用法

参考: https://cmake.org/cmake/help/latest/command/function.html https://cmake.org/cmake/help/latest/command/macro.html#command:macro 文章目录 函数宏在CMake中,宏(macro)和函数(function)命令用于封装重复的任务,这些任务可能分散在你的CMakeLists文件中。一…...

SQLite的PRAGMA 声明(二十三)

返回:SQLite—系列文章目录 上一篇:SQLite从出生到现在(发布历史记录)(二十二) 下一篇:用于 SQLite 的异步 I/O 模块(二十四) PRAGMA 语句是特定于 SQLite 的 SQL 扩…...

Qt 实战(1)Qt 概述

一、Qt概述 1、什么是Qt? Qt(官方发音 [kju:t],音同 cute)是一个跨平台的 C 开发库,主要用来开发图形用户界面(Graphical User Interface,GUI)程序,也可以开发不带界面的…...

【练习】二分查找

1、704 &#xff08;1&#xff09;题目描述 &#xff08;2&#xff09;代码实现 package com.hh.practice.leetcode.array.demo_02;public class BinarySearch_704 {public int search(int[] nums, int target) {int i 0,j nums.length -1;while (i < j){int mid (ij) &…...

FactoryTalk View 上位机画面版本升级,还原和备份

FactoryTalk View 上位机画面版本升级,还原和备份 1 归档文件(尾缀.apa)升级2 画面文件(尾缀.sed)升级3 提示“目标工程中包含旧的HMI标签报警,FT View 10.0是最后一个......” 解决方法1 归档文件(尾缀.apa)升级 案例是FTVIEW5.0升级到FT VIEW12,需要用FT VIEW 6过渡升…...

【微信小程序】分包

整个小程序所有分包大小不超过 20M&#xff08;开通虚拟支付后的小游戏不超过30M&#xff09; 单个分包/主包大小不能超过 2M在小程序启动时&#xff0c;默认会下载主包并启动主包内页面&#xff0c;当用户进入分包内某个页面时&#xff0c;客户端会把对应分包下载下来&#xf…...

Golang教程六(单元测试,反射,网络编程,部署)

目录 一、单元测试 单元测试 子测试 TestMain 二、反射 类型判断 通过反射获取值 通过反射修改值 结构体反射 利用tag修改结构体的某些值 调用结构体方法 orm的一个小案例 对反射的一些建议 三、网络编程 socket编程 websocket编程 四、部署 打包命令 交叉编译…...

mybatis进阶篇-执行CRUD操作-typeAliases别名-接口绑定

目录结构 1.创建数据表&#xff08;book&#xff09; # 创建book表 create table book(id int auto_increment primary key,name varchar(255) ,price double ,num int );2.mybatis.xml配置文件 <?xml version"1.0" encoding"UTF-8" ?> <!DOC…...

C#面:泛型的主要约束和次要约束是什么

在 C# 中&#xff0c;泛型的约束是用来限制泛型类型参数的行为和能力的。 主要约束和次要约束是两种不同的约束方式。 主要约束&#xff08;Primary Constraint&#xff09;&#xff1a; 主要约束指定了泛型类型参数必须满足的最基本的条件&#xff0c;它可以是一个类、一个接…...

Java使用documents4j将word和excel转pdf

pom.xml添加documents4j依赖 <!-- documents4j --> <dependency><groupId>com.documents4j</groupId><artifactId>documents4j-local</artifactId><version>1.0.3</version> </dependency> <!-- documents4j 转 wor…...

使用策略模式实现 Spring 分布式和单机限流

我们可以使用策略模式来统一单机限流和分布式限流的实现,提高代码的可扩展性和可维护性。 思路是定义一个 RateLimitStrategy 接口,并分别实现单机限流策略 LocalRateLimitStrategy 和分布式限流策略 DistributedRateLimitStrategy。在 AOP 切面中,根据配置决定使用哪种限流策…...

@CrossOrigin注解解决跨域问题

文章目录 一、什么是跨域二、CrossOrigin注解是干什么用的三、用法 一、什么是跨域 跨域&#xff0c;指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的&#xff0c;是浏览器对JavaScript施加的安全限制。 所谓同源是指&#xff0c;域名&#xff0c;协议&…...

【力扣】45. 跳跃游戏 II

Problem: 45. 跳跃游戏 II 文章目录 问题思路复杂度Code 问题 思路 核心思路&#xff0c;例如nums[i]5&#xff0c;那么最远能跳五步&#xff1b; //那么在这接下来1-5范围内&#xff0c;哪个能让我跳的最远&#xff0c;这个最远指的是 -------------------------------------…...

【Python基础】19.eval函数的使用

eval函数 eval()将字符串转变为有效的表达式来求值并返回对应的结果 基础数据计算 In [1]: eval("1 1") Out[1]: 2字符串重复 In [2]: eval (" * * 10") Out[2]: **********字符串转为列表 In [3]: type(eval("[1,2,3,4,5]")) Out[3]: lis…...

对装饰器模式的理解

目录 一、场景二、面对场景中的新需求&#xff0c;我们怎么办&#xff1f;1、暴力法&#xff1a;直接修改原有的代码。2、子类继承法&#xff1a;既然要增强行为&#xff0c;那我搞一个子类&#xff0c;覆写不就完事了&#xff1f;3、装饰器模式 三、对装饰器模式的思考1、从代…...

Win11虚拟机密码重置保姆教程:VirtualBox+系统备份双保险

Win11虚拟机密码重置与系统防护全指南&#xff1a;VirtualBox实战策略 在数字化工作环境中&#xff0c;虚拟机已成为隔离测试环境、保障系统安全的标配工具。当我们因各种原因遗忘Windows 11虚拟机密码时&#xff0c;传统物理机的解决方案往往无法直接套用。本文将深入探讨基于…...

3个高效学习技巧:如何用JiYuTrainer实现课堂学习体验优化

3个高效学习技巧&#xff1a;如何用JiYuTrainer实现课堂学习体验优化 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 问题场景&#xff1a;当数字化教学遇上学习需求冲突 "…...

HunyuanVideo-Foley企业应用:汽车HMI人机交互音效AI生成平台

HunyuanVideo-Foley企业应用&#xff1a;汽车HMI人机交互音效AI生成平台 1. 产品概述 HunyuanVideo-Foley是一款专为企业级音视频生成需求设计的AI平台&#xff0c;特别针对汽车HMI&#xff08;人机交互界面&#xff09;音效场景进行了深度优化。该平台基于RTX 4090D 24GB显存…...

高效安全备份QQ空间历史说说:GetQzonehistory全方位使用指南

高效安全备份QQ空间历史说说&#xff1a;GetQzonehistory全方位使用指南 【免费下载链接】GetQzonehistory 获取QQ空间发布的历史说说 项目地址: https://gitcode.com/GitHub_Trending/ge/GetQzonehistory 功能价值&#xff1a;为什么选择GetQzonehistory&#xff1f; …...

探索黑苹果安装实战:从零到完美的完全指南

探索黑苹果安装实战&#xff1a;从零到完美的完全指南 【免费下载链接】Hackintosh 国光的黑苹果安装教程&#xff1a;手把手教你配置 OpenCore 项目地址: https://gitcode.com/gh_mirrors/hac/Hackintosh 破解三大核心技术痛点 直面固件层兼容性障碍 当PC尝试运行mac…...

解锁Online3DViewer:浏览器端3D模型可视化的核心价值与实践指南

解锁Online3DViewer&#xff1a;浏览器端3D模型可视化的核心价值与实践指南 【免费下载链接】Online3DViewer A solution to visualize and explore 3D models in your browser. 项目地址: https://gitcode.com/gh_mirrors/on/Online3DViewer 在数字化设计与开发领域&am…...

Phi-4-Reasoning-Vision效果展示:红外图像+可见光图像跨模态推理

Phi-4-Reasoning-Vision效果展示&#xff1a;红外图像可见光图像跨模态推理 1. 多模态推理工具概览 Phi-4-Reasoning-Vision是基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为双卡RTX 4090环境优化。这个工具最令人印象深刻的是它能够处…...

vue-sonner:轻量级Vue通知组件的高效集成方案

vue-sonner&#xff1a;轻量级Vue通知组件的高效集成方案 【免费下载链接】vue-sonner &#x1f514; An opinionated toast component for Vue. 项目地址: https://gitcode.com/gh_mirrors/vu/vue-sonner 项目概述 vue-sonner是一个为Vue和Nuxt应用设计的轻量级通知组…...

ChatGPT API调用实战:从基础接入到生产环境优化指南

ChatGPT API调用实战&#xff1a;从基础接入到生产环境优化指南 作为一名开发者&#xff0c;在将ChatGPT这类强大的AI能力集成到自己应用中的过程中&#xff0c;我踩过不少坑。从最初的简单请求&#xff0c;到后来面对高并发、长对话、成本控制等生产级挑战&#xff0c;整个过…...

14 年 Java 老码农,重启 CSDN:从 2012 到 2026,我的技术成长与重启之路

图&#xff1a;我的 CSDN 主页&#xff0c;2012 年 8 月 13 日注册&#xff0c;2014 年分享的第一篇 SSH 框架相关文章。 14 年过去&#xff0c;从青涩的 Java 工具类到现在的 DevOps 科研 AI&#xff0c;账号尘封多年&#xff0c;今天正式重启。 一、2012–2026&#xff1a;…...