服务器利用宝塔面板部署Django项目

目录

  • [1. 使用命令启动Django项目](#1. 使用命令启动Django项目)
    • [1.1 使用 Xshell 连接服务器](#1.1 使用 Xshell 连接服务器)
    • [1.2 安装Anaconda](#1.2 安装Anaconda)
    • [1.3 启动Django项目](#1.3 启动Django项目)
    • [1.4 使用tmux实现项目的后台运行](#1.4 使用tmux实现项目的后台运行)
  • [2. 使用Python项目管理器部署项目](#2. 使用Python项目管理器部署项目)
    • [2.1 安装宝塔面板和软件](#2.1 安装宝塔面板和软件)
    • [2.2 添加站点](#2.2 添加站点)
    • [2.3 上传项目文件](#2.3 上传项目文件)
      • [2.3.1 收集静态文件](#2.3.1 收集静态文件)
      • [2.3.2 生成依赖文件](#2.3.2 生成依赖文件)
    • [2.4 安装安装Python项目管理器](#2.4 安装安装Python项目管理器)
    • [2.5 创建配置文件](#2.5 创建配置文件)
    • [2.6 在Python项目管理器中添加项目](#2.6 在Python项目管理器中添加项目)
    • [2.7 访问项目](#2.7 访问项目)
  • [3. 使用『Python项目』部署项目(推荐)](#3. 使用『Python项目』部署项目(推荐))
    • [3.1 上传项目文件](#3.1 上传项目文件)
    • [3.2 创建python项目](#3.2 创建python项目)
    • [3.3 访问项目](#3.3 访问项目)
  • [4. 相关知识](#4. 相关知识)
    • [4.1 正向代理和方向代理](#4.1 正向代理和方向代理)
    • [4.2 WSGI/uwsgi/uWSGI的区别](#4.2 WSGI/uwsgi/uWSGI的区别)

记录服务器部署Django项目的三种方法,由于项目没有用到数据库服务,所以部署过程不涉及数据库相关的连接和配置(后续使用到数据库再补充)。服务器规格如下:

服务器 CPU&内存 系统
华为云 Flexus L 实例 2核 2 GiB CentOS 7.9 64bit

1. 使用命令启动Django项目

1.1 使用 Xshell 连接服务器

Xshell和Xftp免费下载,下载安装 Xshell 和 Xftp(后续用于传输文件到服务器),随后使用用户名(服务器给的用户名是 root)和密码(远程连接之前需重置实例密码)连接到服务器。

1.2 安装Anaconda

服务器自带的Python版本较低且不支持pip指令:
因此自己安装Anaconda比较靠谱,在[Anaconda官网]选择需要安装的版本(自行按需选择):

命令行输入:

bash 复制代码
wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh

运行sh命令安装anaconda:

bash 复制代码
sh Anaconda3-2022.05-Linux-x86_64.sh

然后一直Enter,输入yes之后完成安装:

输入yes后自动为配置 Anaconda 的环境变量。

此时命令行输入python时出现的还是服务器自带的版本,需要重新加载配置文件才能让安装的Anaconda生效:

bash 复制代码
source ~/.bashrc

在命令行手动安装项目所需的依赖包(如Django),torch的安装指令如下(使用清华源镜像下载更快):

bash 复制代码
pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple

1.3 启动Django项目

在服务器端和宝塔端放行对应端口,将settings.py文件中的ALLOWED_HOSTS = []改为ALLOWED_HOSTS = ['*'],命令行输入如下指令启动Django项目:

bash 复制代码
python manage.py runserver 0.0.0.0:8000

runserver 会自动处理静态资源的请求,因此无需像其他两种部署方式一样配置静态资源路径。

启动成功之后浏览器地址栏输入公网IP:8000即可访问项目。

1.4 使用tmux实现项目的后台运行

项目启动之后,屏幕睡眠或者手动关闭Xshell客户端时,项目的运行会被中断,此时浏览器访问不到项目资源。使用tmux后,在不手动关闭tmux会话的情况下,无论是屏幕睡眠还是关闭Xshell,项目的运行都不会被中断,tmux 会话仍然会在后台继续运行项目

新建一个名为task1的会话:

bash 复制代码
tmux new -s task1

启动tmux后,底部[0] 表示第0个tmux会话,再启动一个tmux会话则为[1],依次递增。在tmux的会话窗口执行的任务能够实现长期运行,除非手动关闭。

常用指令:

bash 复制代码
# 默认进入第一个会话
tmux a
# 进入到名称为demo的会话
tmux a -t demo

# 关闭所有会话
tmux kill-server
# 关闭指定对话
tmux kill-session -t 会话名

# 查看所有对话
tmux ls

更多命令可参考[1分钟掌握tmux使用]

2. 使用Python项目管理器部署项目

部署方法参考自[将Django项目部署到服务器]

2.1 安装宝塔面板和软件

使用 Xshell 连接服务器后在命令行输入指令安装宝塔面板:

bash 复制代码
yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec

根据宝塔面板提供的账号和密码登录到宝塔面板,安装软件:

2.2 添加站点

输入公网IP后其他默认设置(可以修改根目录的位置)即可,站点建立后将目录下的两个html文件删除。

2.3 上传项目文件

2.3.1 收集静态文件

上传项目前先收集项目所有的静态文件,将其放到项目根目录下的static目录中。在本地Django项目的settings.py文件中配置STATIC_ROOT

复制代码
STATIC_URL = '/static/']
# 静态文件将被收集到这个目录
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

在命令行执行:

复制代码
 python manage.py collectstatic

之后会在项目根目录下生成static文件夹,里面存放项目所有的静态文件,static文件夹的目录结构如下:

复制代码
├─admin
│  ├─css
│  │  └─vendor
│  │      └─select2
│  ├─img
│  │  └─gis
│  └─js
│      ├─admin
│      └─vendor
│          ├─jquery
│          ├─select2
│          │  └─i18n
│          └─xregexp
├─css
├─img
└─js

收集静态文件时,static 文件夹中会多出一个 admin 文件夹,它包含了 Django 管理后台(Django Admin)的静态文件,这些文件是 Django 自带的管理后台所需要的 CSS、JavaScript、图片等资源。

2.3.2 生成依赖文件

在项目目录中打开终端运行如下命令:

bash 复制代码
pip freeze > requirements.txt

目录中会生成依赖文件requirements.txt,可以只留下关键的依赖包,其他的可以删掉:

复制代码
Django==4.2.13
numpy
pandas

不指定版本时默认下载最新版本,后面添加项目时Python项目管理器会根据依赖文件下载对应的依赖包。

收集完静态资源后使用Xftp将整个项目文件上传到站点指定的目录下。

2.4 安装安装Python项目管理器

在软件商店中安装Python项目管理器 :

选择python版本(尽量与本地保持一致):

2.5 创建配置文件

在项目根目录下创建uwsgi.ini文件,内容如下:

复制代码
#添加配置选择
[uwsgi]
#配置和nginx连接的socket连接
socket=127.0.0.1:8000
#配置项目路径,项目的所在目录
chdir=/www/wwwroot/113.45.149.184/
#配置wsgi接口模块文件路径,也就是wsgi.py这个文件所在的目录
wsgi-file=prediction/wsgi.py
#配置启动的进程数
processes=4
#配置每个进程的线程数
threads=2
#配置启动管理主进程
master=True
#配置存放主进程的进程号文件
pidfile=uwsgi.pid
#配置dump日志记录
daemonize=/www/wwwlogs/python/113.45.149.184/uwsgi.log

配置站点的配置文件:

xml 复制代码
location / {
	include uwsgi_params;
	uwsgi_pass 127.0.0.1:8000;  #端口要和uwsgi里配置的一样
	uwsgi_param UWSGI_SCRIPT prediction.wsgi;  #wsgi.py所在的目录名+.wsgi
	uwsgi_param UWSGI_CHDIR /www/wwwroot/113.45.149.184/; #项目路径
}

我没配置如下静态资源的路径,因为压根就没有起作用。

xml 复制代码
location /static/ {
	alias /www/wwwroot/1.14.122.151/static/; #静态资源路径
}

这里注意一下,uwsgi.ini

复制代码
daemonize=/www/wwwlogs/python/113.45.149.184/uwsgi.log

记录的是 uWSGI 的启动信息、请求日志、错误日志和服务器活动日志(会记录Django项目的报错信息,可以根据报错信息完善项目配置),站点配置文件中的

xml 复制代码
access_log /www/wwwlogs/113.45.149.184.log;
error_log /www/wwwlogs/113.45.149.184.error.log;

记录的是nginx的日志信息,一般用处不大。

2.6 在Python项目管理器中添加项目

勾选安装依赖模块时会根据requirements.txt文件来安装依赖包,requirements.txt中的torch无法安装(而且在模块界面中手动安装时也安装不了),只能自己在命令行安装。


添加项目后会在项目根目录下随之创建一个虚拟环境:

我的虚拟环境如下:

命令行安装torch:

复制代码
d91a2f87349da87b741376f807c777e9_venv/bin/pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple

安装时会出现线程终结(killed)的错误,提示是由于运行内存不足导致,多试几次就能安装上。

2.7 访问项目

在服务器和宝塔上放行对应端口后,浏览器输入公网IP访问项目时出现错误:

修改项目settings.py文件中允许访问的地址,将ALLOWED_HOSTS = []改为ALLOWED_HOSTS = ['*']即可访问。

此时使用公网IP:8000是访问不到项目的,这是因为Nginx配置的反向代理隐藏了原始服务器的真实 IP 地址(8000端口),用户只能通过80端口发送请求(在面板中添加网站后,会默认将请求通过端口 80【HTTP】或 443【HTTPS】进行处理),然后Nginx服务器再将改请求转发到原始服务器 (uWSGI)的8000端口。

3. 使用『Python项目』部署项目(推荐)

部署方法参考自[最新宝塔面板部署Django项目教程(踩坑无数板,保姆级教学)]

3.1 上传项目文件

参照⌈2.3⌋收集静态文件并生成依赖文件,然后将项目上传到/www/wwwroot目录下:

3.2 创建python项目


创建环境时,requirements.txt里的torch能够成功安装(但是安装的版本号是2.3.1,原因未知,能用就行),在模块中手动安装反而安装不了,依赖如下:

复制代码
Django==4.2.14
numpy
pandas
torch==1.10.0
torchaudio==0.10.0
torchvision==0.11.0

但是pandas安装失败,需要在模块中手动添加:

3.3 访问项目

在设置中将启动用户从www改成root,在服务器端和宝塔端放行对应端口,将settings.py文件中的ALLOWED_HOSTS = []改为ALLOWED_HOSTS = ['*']。使用公网IP:8000能访问到项目但是无法加载静态资源:

在项目的uwsgi.ini文件(创建python项目后自动生成)或者在设置--> uwsgi配置中添加:

复制代码
static-map = /static=/www/wwwroot/userfeed/static

作用:将请求的静态文件路径映射到服务器上的实际文件系统路径,即当 uWSGI 服务器收到特定 URL 前缀的请求时,它可以直接从指定的文件系统路径提供静态文件,而不通过应用程序处理。这样可以减少应用程序的负载,提高静态文件的传输效率。

这种部署方式没有使用到Nginx服务器(仅使用到uWSGI服务器),所以需要在uwsgi.ini中指明静态资源位置。


重新访问网页即可正常显示,可以在项目日志中查看uWSGI服务器的运行日志。

4. 相关知识

4.1 正向代理和方向代理

  • 正向代理:位于客户端和原始服务器之间的代理服务器 。当客户端发起请求时,请求首先发送到正向代理服务器,然后由代理服务器转发请求到后端的原始服务器,最后将原始服务器的响应返回给客户端。正向代理隐藏了客户端的真实 IP 地址,同时可以提供一些额外的功能,比如缓存、安全性增强等。一句话,就是帮你搭梯子的。
  • 反向代理:位于原始服务器和客户端之间的代理服务器 。当客户端发起请求时,请求会先发送到反向代理服务器,然后由反向代理服务器将请求转发到后端的原始服务器(可以将请求分发到多个后端服务器,从而提高系统的稳定性和性能 ),最后将原始服务器的响应返回给客户端。反向代理隐藏了原始服务器的真实 IP 地址,同时可以提供负载均衡、安全性增强、缓存等功能。一句话,就是帮服务器减压的。

正向代理通常用于访问控制和隐私保护,反向代理通常用于负载均衡和资源缓存。

4.2 WSGI/uwsgi/uWSGI的区别

  • WSGI(Web Server Gateway Interface,Web服务器网关接口):WSGI 是一个 Python Web 应用程序与 Web 服务器之间的接口规范,它定义了应用程序和服务器之间的标准接口,使得应用程序可以在不同的 Web 服务器上运行。WSGI 协议使得不同的 Python Web 框架(例如 Flask、Django 等)能够在不同的 Web 服务器上运行。
  • uWSGI:uWSGI 是一个实现了WSGI、uwsgi、HTTP等协议的Web 服务器
  • uwsgi:是一个与 uWSGI 服务器相关的协议。uwsgi 协议是一种二进制协议,它定义了 uWSGI 服务器与应用程序之间的通信协议。

因此,WSGI 是 Python Web 应用程序与 Web 服务器之间的接口规范,定义了应用程序和服务器之间的标准接口。而 uwsgi 则是 uWSGI 服务器与应用程序之间的通信协议。


三者的关系图示[1](#1)如下:

Nginx 是常用的反向代理服务器,用于处理静态请求或将动态请求转发给 uWSGI。对于静态文件(例如HTML、CSS、JavaScript、图片等),Nginx 可以直接从文件系统中提供这些文件给客户端。


  1. WSGI,uwsgi,uWSGI梳理 ↩︎
相关推荐
K·Herbert4 小时前
最新CentOS 7 yum源失效的解决方案(2025年6月)
linux·运维·centos
别骂我h5 小时前
部署KVM虚拟化平台
linux·运维·服务器
繢鴻5 小时前
紧急救援!Ubuntu崩溃修复大赛
linux·服务器·ubuntu
showmethetime5 小时前
优化nginx参数(基本通用参数)
运维·nginx
老六ip加速器5 小时前
获取ip地址安全吗?如何获取静态ip地址隔离ip
运维·网络·智能路由器
xiaoming00185 小时前
Django中使用流式响应,自己也能实现ChatGPT的效果
后端·python·chatgpt·django
猿助码头qq3526746986 小时前
django基于Spark的国漫推荐系统
ajax·spark·django
净心净意13 小时前
浅谈DaemonSet
运维·jenkins
Apex Predator20 小时前
jenkins流水线打包vue无权限
运维·jenkins
哲讯智能科技1 天前
苏州SAP代理商:哲讯科技助力企业数字化转型
大数据·运维·人工智能