Django在服务端的部署(无废话)

一、准备工作

  1. Linux服务器(虚拟机、云服务器)

  2. Django开发好的项目(windows版本)

二、流程

1、在linux上得到一份和windows拥有相同依赖的虚拟环境

在windows下

pip freeze > requirement.txt(python -m pip freeze > requirement.txt)

2、将项目拷贝到远程服务器

1.先把项目中的venv虚拟环境拿走

2.在windows中,项目的文件夹的上方输入cmd进行

scp -r 项目文件名 root@"ip":重命名(可不写,不写则是原项目名)

3.然后再把拷贝后的文件转移到、var/www下方(必要操作)

(服务器需要有nginx,apt update ,apt install nginx)

vm 项目名 -t /var/www

3、利用requirement.txt 在linux上安装相同包

++在项目根目录下++

apt update

apt install python3.12-venv #(版本号可能有所不同 python --version 查看版本号)

python -m venv venv

source venv/bin/activate #激活虚拟环境

进入项目所在位置,

pip install -r requirement.txt

(如果你没有配置镜像源的话下载会很慢,不用担心)

试试这个:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt(清华镜像源下载更快)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ 包名(安装单一包)

迁移文件(大概率会出错,执行以下方法)

python manage.py makemigrations

python manage.py migrate

会出现部分模版还没pip或者文件有些格式在服务器中不适用需要修改也有可能是版本不适

根据错误进行导入修改,直到没有问题

如果不会分析问题,教你一招,ai一下你就知道

再进行

python manage.py migrate

python manage.py runserver

在浏览器中就可以看到项目,但是没有并没有装饰需要进行一下步骤

++注意一下问题:(步骤3和步骤4可能会遇到的问题)++

settings.py 中找到 ALLOWED_HOSTS 配置,添加你的 IP 地址(一定要配置

确保你的:

DEBUG = False

方法1:添加具体IP

ALLOWED_HOSTS = [

'8.130.115.214', # 你的服务器IP

'localhost',

'127.0.0.1',

]

方法2:允许所有主机(开发环境,不推荐生产)(这个特别好用,但是不安全)

ALLOWED_HOSTS = ['*']

方法3:如果你有域名,也一并添加

ALLOWED_HOSTS = ['8.130.115.214', 'yourdomain.com', 'www.yourdomain.com']

urls.py 中添加

if settings.DEBUG:

import debug_toolbar

urlpatterns = [

path('debug/', include(debug_toolbar.urls)),

] + urlpatterns

开发环境静态文件服务

from django.conf.urls.static import static

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

重启 uWSGI(如果不明白,查看步骤四)

uwsgi --stop uwsgi.pid

uwsgi --ini uwsgi.ini

此时就在linux上可以运行python manage.py runserver

但是runserver 是开发服务器 效率太低

需要部署在正式服务器上

4、通过uwsgi来部署web应用

在项目根目录

pip install uwsgi

在项目根目录添加 uwsgi文件

touch uwsgi.ini

uwsgi.ini 配置文件:

uwsgi

#socket=外网ip:端口(使用nginx连接时,使用socket)

http=0.0.0.0:12000

项目根目录chdir=/var/www/项目名

wsgi所在目录

wsgi-file=项目名/wsgi.py

processes=4

threads=2

master=True

pidfile=uwsgi.pid

daemonize=uwsgi.log

启动 uwsgi --ini uwsgi.ini

(启动后根目录下会多出关于uwsgi的相关文件)

停止 uwsgi --stop uwsgi.pid

注意不能多次启动,如果不能正常进行可以进行以下操作:

ps -ef | grep uwsgi (查看进程)

强制杀死 :

uwsgi kill -9 进程号

在云服务器中要注意

添加云服务器的安全组/防火墙

TCP 12000/13000

5、部署nginx

将uwsig配置文件其中的http修改socket
socket=0.0.0.0:12000

sudo apt install nginx

/etc/nginx/sites-enabled

touch 项目名

vim 项目名

server {

Nginx监听端口

listen 0.0.0.0:13000;

location / {

include uwsgi_params;

转发uwsgi端口

uwsgi_pass 0.0.0.0:12000;

}

}

注意配置文件一定要删除空格重新部署格式,别问为什么,因为我踩过这个坑(因为你直接复制这个文件配置,里面可能会有特殊空格,程序可能会因为这个特殊空格报错)

6、动静分离:动态路由通过uwsgi转发 静态路由直接通过nginx转发

收集项目所需静态资源,完成请求动静分离

在项目根目录下新建 staticroot

sudo mkdir staticroot

cd staticroot

pwd

获取并复制当前路径,然后拷贝当前路径在settings.py中添加

STATIC_ROOT = "/var/www/项目名/staticroot"(引号中的内容为复制的pwd路径)

将所有应用用到的静态资源都拷贝到staticroot目录下

python manage.py collectstatic

修改nginx配置文件

location /static {

alias /var/www/django_site/staticroot;

}

修改后:

server {

listen 0.0.0.0:13000;

location / {

include uwsgi_params;

uwsgi_pass 192.168.13.31:12000;

}'

location /static {

alias /var/www/Django_view/staticroot;

}

}

重启nginx服务器

systemctl restart nginx

(13000端口: Nginx对外服务端口,用户直接访问

12000端口: uWSGI应用服务端口,仅供Nginx内部转发使用)

所以我们需要在浏览器访问13000端口号

附加 :想要配置mysql数据库

需要在linux中安装相关的mysql

创建数据库

create database 数据库名 charset=utf8;

create user '用户名'@'%' identified by '密码';

-- 授予权限

grant all on 项目名.* to 用户名@'%';

--刷新权限

flush privileges;

exit

--重新登陆

mysql -u 用户名 -p

select user();

看到有自己用户后

exit

回到项目下

python manage.py makemigrations

可能会出现没有安装数据库(python中)

首先安装系统依赖

sudo apt update

sudo apt install -y build-essential python3-dev default-libmysqlclient-dev pkg-config

再安装

pip install mysqlclient

python manage.py migrate

重启uwsgi

uwsgi --stop uwsgi.pid

uwsgi --ini uwsgi.ini

再修改settings.py中的DATABASES

DATABASES = {

'default': {

'ENGINE': 'django.db.backends.sqlite3',

'NAME': BASE_DIR / 'db.sqlite3',

}

'default': {

'ENGINE': 'django.db.backends.mysql',

'NAME': '数据库名',

'USER':'用户名',

'PASSWORD':'密码',

}

}

总结:

走过以上流程后基本不会再有问题,如果有,别担心推荐你终极"杀器"

问问ai

相关推荐
Polar__Star2 小时前
如何结合计划任务实现自动定时备份任务配置_全自动化运维管理
jvm·数据库·python
weixin_580614007 小时前
如何提取SQL日期中的年份_使用YEAR或EXTRACT函数
jvm·数据库·python
2301_813599557 小时前
SQL生产环境规范_数据库使用最佳实践
jvm·数据库·python
李可以量化7 小时前
QMT 量化实战:用 Python 实现线性回归通道,精准识别趋势中的支撑与压力(下)
python·qmt·量化 qmt ptrade
a9511416427 小时前
Go 中通过 channel 传递切片时的数据竞争与深拷贝解决方案
jvm·数据库·python
Dxy12393102167 小时前
Python 使用正则表达式将多个空格替换为一个空格
开发语言·python·正则表达式
我学上瘾了7 小时前
Spring Cloud的前世今生
后端·spring·spring cloud
qq_189807037 小时前
如何修改RAC数据库名_NID工具在集群环境下的改名步骤
jvm·数据库·python
zhangchaoxies8 小时前
如何检测SQL注入风险_利用模糊测试技术发现漏洞
jvm·数据库·python
Luca_kill8 小时前
MCP数据采集革命:从传统爬虫到智能代理的技术进化
爬虫·python·ai·数据采集·mcp·webscraping·集蜂云