当前位置: 首页>编程语言>正文

在线部署python项目___django的示范

注意事项

-   本地开发环境,在把项目代码上传到云服务器之前;要在本地进行足够的测试;而且,要把所有连接本地的一些配置,都要改为线上环境的;在项目中,写死的路径、连接,一定要统一的放到配置文件中。`d:\xx\xxx\xx.txt`
-   尽量避免出现中文路径和中文文件名。包括一些特殊字符。

本地调通,我从码云拉下代码以后重新改了一下配置

local_settings.py

# -*- coding = utf-8 -*-
import os
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

ALLOWED_HOSTS = ["*"]
DEBUG = True
# 静态文件收集目录
STATIC_ROOT = "/root/data/allstatic/"
# sqlite3
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

# MySQL配置
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.mysql',
#         'NAME': 'day13',  # 你的数据库名称
#         'USER': 'root',  # 你的数据库用户名
#         'PASSWORD': '123',  # 你的数据库密码
#         'HOST': "127.0.0.1",  # 你的数据库主机,留空默认为localhost
#         'PORT': '3306',  # 你的数据库端口
#     }
# }

CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379",  # 安装redis的主机的 IP 和 端口
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
            "CONNECTION_POOL_KWARGS": {
                "max_connections": 1000,
                "encoding": 'utf-8'
            },
            "PASSWORD": "admin123"  # redis密码
        }
    }
}

在线部署python项目___django的示范,在线部署python项目___django的示范_redis,第1张

为了开发简单,用的是sqlite,一般会用mysql

数据库迁移

#数据不可以太多
python manage.py dumpdata > data.json

或者用mysql的命令:
mysql -hlocalhost -u root -p databasename -d day13 > day13.sql;

https://www.cnblogs.com/cloudwas/p/13072749.html
需要注意的是mysql导出的命令自带创建数据库的命令,navicat只导出数据。所以用navicat,首先要创建库,使用库以后进行loads xxx.sql

修改配置

# -*- coding = utf-8 -*-
import os
from pathlib import Path

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# sqlite3
# DATABASES = {
#     'default': {
#         'ENGINE': 'django.db.backends.sqlite3',
#         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
#     }
# }

# MySQL配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day13',  # 你的数据库名称
        'USER': 'root',  # 你的数据库用户名
        'PASSWORD': 'root123',  # 你的数据库密码
        'HOST': "127.0.0.1",  # 你的数据库主机,留空默认为localhost
        'PORT': '3306',  # 你的数据库端口
    }
}

终端输入

# 登录到MySQL中
create database day13 CHARSET utf8mb4 COLLATE utf8mb4_bin;

pip install pymysql

# 然后在settings.py同级目录添加
import pymysql

pymysql.install_as_MySQLdb()

线上环境准备

硬件要求:一个云服务器,配置要求:2核2G内存,带宽,阿里1M;腾讯300M/400M都行;硬盘40G+;系统是cnetos7.x(7.3/7.5/7.6)。

哥们这里租的是华为云

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_02,第2张

分享xshell

推荐用xshell,可以花十块钱去淘宝买。或者用其他终端,比如tabby。
设置防火墙
systemctl stop firewalld.service# 查看防火墙状态
systemctl status firewalld.service
# 关闭防火墙
systemctl stop firewalld.service
# 禁止开机启动防火墙
systemctl disable firewalld.service
# 启动防火墙
systemctl start firewalld.service
# 防火墙随系统开启启动
systemctl enable firewalld.service
# 关闭selinux,提高了系统的安全性,但关闭它可以释放系统资源,提高服务器的性能,避免一些程序的兼容性问题等等
[root@r ~]# sed -i.ori 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
sed -i.ori 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

在线部署python项目___django的示范,在线部署python项目___django的示范_nginx_03,第3张

放开安全组

在线部署python项目___django的示范,在线部署python项目___django的示范_nginx_04,第4张

线上规划

mkdir data
cd data/

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_05,第5张

#上传文件
yum install lrzsz
rz day13.zip
unzip day13.zip

在线部署python项目___django的示范,在线部署python项目___django的示范_nginx_06,第6张

装python解释器

#这里我用的是3.10

#更新一下
yum update -y

#装依赖
yum install gcc zlib zlib-devel bzip2 bzip2-devel ncurses ncurses-devel readline readline-devel openssl openssl-devel xz lzma xz-devel sqlite sqlite-devel gdbm gdbm-devel tk tk-devel mysql-devel python-devel libffi-devel -y

更新openssl版本, 3.10更新了要求。3.9及其更早的版本不需要更新openssl

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_07,第7张

cd /usr/local/src


yum install openssl-devel bzip2-devel libffi-devel -y
yum groupinstall "Development Tools" -y


wget https://ftp.openssl.org/source/openssl-1.1.1q.tar.gz --no-check-certificate

tar -xzvf openssl-1.1.1q.tar.gz
cd openssl-1.1.1q


./config --prefix=/usr --openssldir=/etc/ssl --libdir=lib no-shared zlib-dynamic
#make和make install 比较花时间
make
make test
make install

openssl version

OpenSSL 1.1.1q  5 Jul 2022

which openssl

/usr/bin/openssl

cd /usr/local/src
#这里用华为云的源,下载更快
wget https://mirrors.huaweicloud.com/python/3.10.10/Python-3.10.10.tgz

tar -xzf Python-3.10.10.tgz
cd Python-3.10.10

#这两步比较花时间
./configure --enable-optimizations --with-openssl=/usr
make altinstall
#检查版本
python3.10

在线部署python项目___django的示范,在线部署python项目___django的示范_redis_08,第8张

在线部署python项目___django的示范,在线部署python项目___django的示范_redis_09,第9张

#pip设置国内源
pip3.10 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

cd
mkdir envs
cd envs/

pip3.10 install virtualenv
#设置虚拟环境
virtualenv venv
#激活
source /envs/venv/bin/activate

yum remove openssl-devel -y
pip install uwsgi


#下载依赖
cd /root/data/day13
pip install -r requirements.txt

在线部署python项目___django的示范,在线部署python项目___django的示范_nginx_10,第10张

nginx安装

yum update -y
yum -y install gcc gcc-c++ pcre pcre-devel  zlib zlib-devel openssl openssl-devel libxml2-devel libxslt-devel gd-devel GeoIP-devel jemalloc-devel libatomic_ops-devel perl-devel  perl-ExtUtils-Embed

cd /usr/local/src
wget https://nginx.org/download/nginx-1.24.0.tar.gz

tar -zxvf nginx-1.24.0.tar.gz


cd nginx-1.24.0
# 这种方式nginx的安装目录为/usr/local/nginx
./configure 
make && make install

或者

yum install nginx -y

nginx的安装目录中:

  • conf:存放nginx配置文件目录
  • logs:存放nginx日志目录
  • sbin:存放nginx可执行脚本目录
  • html:存放nginx的网站站点,静态资源的目录

知道主要的目录作用,我们也就可以启动nginx了。

#配置环境变量
echo "export PATH=/usr/local/nginx/sbin:$PATH" >> /etc/profile
source /etc/profile

cd /usr/local/nginx/sbin
#启动
nginx

# 查看nginx相关进程
ps -ef | grep nginx

# 查看NGINX监听的端口
netstat -tunlp | grep nginx

# 平滑重启nginx,也就是重新读取nginx的配置文件,而不是重启进程
nginx -s reload

在线部署python项目___django的示范,在线部署python项目___django的示范_redis_11,第11张

配置systemctl管理nginx

systemd 配置文件说明:

  • 每一个 Unit 都需要有一个配置文件用于告知 systemd 对于服务的管理方式
  • 配置文件存放于 /usr/lib/systemd/system/,设置开机启动后会在 /etc/systemd/system 目录建立软链接文件
  • 每个Unit的配置文件配置默认后缀名为.service
  • 在 /usr/lib/systemd/system/ 目录中分为 system 和 user 两个目录,一般将开机不登陆就能运行的程序存在系统服务里,也就是 /usr/lib/systemd/system
  • 配置文件使用方括号分成了多个部分,并且区分大小写
cat >/lib/systemd/system/nginx.service<<EOF
[Unit]     # 记录service文件的通用信息
Description=nginx    # Nginx服务描述信息
After=network.target    # Nginx服务启动依赖,在指定服务之后启动
[Service]    # 记录service文件的service信息
Type=forking    # 标准UNIX Daemon使用的启动方式
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]    # 记录service文件的安装信息
WantedBy=multi-user.target    # 多用户环境下启用
EOF
cat /lib/systemd/system/nginx.service

复杂黏贴这个

cat >/lib/systemd/system/nginx.service<<EOF
[Unit]   
Description=nginx    
After=network.target   
[Service] 
Type=forking  
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]    
WantedBy=multi-user.target   
EOF
cat /lib/systemd/system/nginx.service

如下命令输入

pkill nginx
systemctl daemon-reload
systemctl start nginx
systemctl status nginx
systemctl stop nginx

mysql安装

可以去装mariadb

装mysql:
服务端:
yum install mariadb-server -y

客户端:
yum install mariadb -y

启动:

systemctl start mariadb

设为开机启动:

systemctl enable mariadb

账号初始化:
登录:

mysql -u root -p

然后敲回车

root设置密码:

use mysql;

UPDATE user SET password=password('root123') WHERE user='root';

然后:
flush privileges;

源码装mysql

cd /usr/local
#下载
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz
#解压
xz -d mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz
tar -xvf mysql-8.0.36-linux-glibc2.12-x86_64.tar

#改名
mv mysql-8.0.36-linux-glibc2.12-x86_64 mysql

#mysql用户组、mysql用户

groupadd mysql
useradd -r -g mysql mysql
passwd mysql
#qwe123


#修改MySQL配置文件
/etc/my.cnf
#输入
cat >/etc/my.cnf<<EOF
[mysqld]

basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
# server_id = .....
socket = /tmp/mysql.sock
character-set-server = utf8
skip-name-resolve
log-error = /usr/local/mysql/data/error.log
pid-file = /usr/local/mysql/data/mysql.pid

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
EOF

#创建目录
mkdir data
chown -R mysql .
chgrp -R mysql .

在线部署python项目___django的示范,在线部署python项目___django的示范_nginx_12,第12张

yum install -y libaio
#初始化数据库
./bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

#执行完后查看初始密码:
vim /usr/local/mysql/data/error.log

feikKjRte0!P

#启动mysql服务
./support-files/mysql.server start

在线部署python项目___django的示范,在线部署python项目___django的示范_nginx_13,第13张

#修改root密码
./bin/mysql -uroot -pfeikKjRte0!P
#注意,我这个临时密码比较奇怪。!p给我看成参数了,也可以这么输入
./bin/mysql -uroot -p
feikKjRte0!P

#修改密码
alter user 'root'@'localhost' identified by 'root123';

操作

./support-files/mysql.server restart

./support-files/mysql.server stop

./support-files/mysql.server start

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_14,第14张

#设置远程连接
create user 'root'@'%' identified with mysql_native_password by 'root123';
grant all on *.* to 'root'@'%';
flush privileges;

mysql卸载

./support-files/mysql.server stop
find / -name mysql
rm -rf /var/lib/selinux/targeted/active/modules/100/mysql

#删除配置文件
rm -f /etc/my.cnf
rm -rf /etc/init.d/mysql.server
#删除用户组
userdel mysql
id mysql

redis

#yum安装
yum install redis -y
#修改配置,比如密码
vim /etc/redis.conf
#启动
systemctl start redis

systemctl restart redis
#开机自启:

systemctl enable redis

#源码安装

cd /usr/local/
wget http://download.redis.io/releases/redis-6.2.9.tar.gz
tar xzf redis-6.2.9.tar.gz
mv redis-6.2.9 redis

cd redis
make && make install

vim /etc/redis.conf
#写入
#前台启动,改后台启动
daemonize yes 
# 注意,生产中, 千万不要bind 0.0.0.0,不要将Redis暴露到外网环境,防止被人gongji
bind 0.0.0.0
#bind 127.0.0.1
requirepass admin123


redis-server /etc/redis.conf  
ps -ef|grep redis |grep -v grep

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_15,第15张

配置uwsgi

cd /root/data
mkdir script
mkdir logs
vim script/uwsgi.ini


[uwsgi]

# 填写订单项目的根目录
chdir=/root/data/day13/

# 填写与项目同名的目录,这是个相对路径,主要就是找到其内的wsgi.py这个文件
module=day13.wsgi

# 虚拟环境的根目录,也就是工作目录
home=/root/envs/venv/

# uwsgi的主进程,其他的uwsgi的进程都是这个主进程的子进程,当你kill时,杀掉的也是这个master主进程
master=true

# uwsgi并发时的工作进程的数量,官网的建议是:2 * cup核数 + 1
# 由这几个进程来分摊并发请求
processes=2

# 临时使用http,实际部署时,通过nginx反向代理,就要把http换成socket,这点别忘了改
http=0.0.0.0:8000
# socket=0.0.0.0:8000

# 当服务器退出时,自动删除unix socket文件和pid文件
vacuum=true

# 默认的请求的大小为4096,如果你接收到了一个更大的请求 (例如,带有大cookies或者查询字符串),那么超过4096的限制就会报错invalid request block size: 4547 (max 4096)...skip,所以我们这里提前调整下
# https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Options.html#buffer-size
buffer-size=32768

# uwsgi的日志文件,调试的时候别写
#logto=/root/data/logs/uwsgi.log

因为我这里用的是sqlite,所以升级一下。不然得报错

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_16,第16张

cd /usr/local/src
wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz  --no-check-certificate
tar -zxvf sqlite-autoconf-3420000.tar.gz
cd sqlite-autoconf-3420000
./configure
make && make install
export LD_LIBRARY_PATH="/usr/local/lib"

source /etc/profile

修改django源码

参考:

https://www.jianshu.com/p/e81d59ccb80d

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_17,第17张

测试一下

cd /root/data
/root/envs/venv/bin/uwsgi --ini ./script/uwsgi.ini

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_18,第18张

在线部署python项目___django的示范,在线部署python项目___django的示范_redis_19,第19张

因为我们没有用nginx代理静态资源,所以没有样式
# 临时使用http,实际部署时,通过nginx反向代理,就要把http换成socket,这点别忘了改
#http=0.0.0.0:8000
socket=0.0.0.0:8000
#相关命令
# 相对路径启动,指定配置文件启动后端
uwsgi --ini ./uwsgi.ini    # 启动
    # 启动时会生成两个文件,分别为:
    # PID文件 标识这个程序所处的状态
    # SOCK文件  用来和其他程序通信的
uwsgi --stop uwsgi.pid    # 停止
uwsgi --reload uwsgi.ini   # 重置

nginx静态资源

#settings.py中有类似的字段
STATIC_ROOT = "/root/data/allstatic/"

cd data/
echo "yes"|python3 ./day13/manage.py collectstatic

在线部署python项目___django的示范,在线部署python项目___django的示范_redis_20,第20张

#这里我用的yum install nginx
vim /etc/nginx/nginx.conf
#个人的配置习惯不同,
#这里/root/data/allstatic/是root的权限,所以
user  root;
#根据个人的情况适当调整
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    

    server {
        listen       80;
        server_name  localhost;
        charset utf-8;
        gzip on;
        gzip_static on;
        gzip_min_length 1k;
        gzip_vary on; 
        gzip_proxied any;
        gzip_comp_level 9;
        gzip_buffers 4 16k;
        gzip_http_version 1.0;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/jpeg image/gif image/png image/svg+xml;
        # 所有访问80端口的请求,都转发给8000端口的服务器,即uwsgi服务
        location / {
            include uwsgi_params;
            uwsgi_pass 0.0.0.0:8000;
        }
        location /static {
        #注意带上斜杠
            alias /root/data/allstatic/;
        }
    }
}
cd /root/data
/root/envs/venv/bin/uwsgi --ini ./script/uwsgi.ini



#后台运行
cd /root/data
#把日志写到/dev/null, 最后的&表示后台运行
/root/envs/venv/bin/uwsgi --ini ./script/uwsgi.ini >/dev/null 2>&1 &

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_21,第21张

在线部署python项目___django的示范,在线部署python项目___django的示范_mysql_22,第22张

ssl配置

域名备案和解析

网站部署,最好的是要有个备案好的域名,然后让其域名和你的云服务器进行域名解析,这样我们可以通过域名访问我们的云服务器了。

购买域名

购买域名,一般原则是你买个哪个厂家的云服务器,就也买哪个厂家提供的域名。

域名备案

买完了域名,然后就要去其官网找域名备案功能,备案这个流程顺利的话需要十天半个月的。

整个备案过程也是很麻烦的,大概的流程就是填写备案申请。让你提交啥材料你就提交啥材料,然后提交到云服务器厂家审核,有问题的话会有小姐姐电话联系你说你哪里需要修改,然后你就修改之后,继续提交申请,继续审核,然后这个云服务器厂家审核通过了,会给你发短信提醒:

总之域名备案是个比较麻烦的步骤,比较费时费力。

作者暂时没搞过,可以自行搜索

域名解析

这一步相当于让域名和你云服务器的公网ID做个映射,让外部访问域名就能解析到你的云服务器公网IP上去。

备案成功之后,登录云服务器控制台,找到域名解析,将备案好的域名和你的服务器进行解析,腾讯云是这个地址:https://console.cloud.tencent.com/cns。

ssl证书申请并上传到服务器

这里以腾讯云服务器为例,去腾讯云官网申请免费证书,这个地址:https://console.cloud.tencent.com/ssl

下载到本地后,直接将压缩包上传到云服务器

nginx中配置证书

配置参考腾讯云官网:https://cloud.tencent.com/document/product/400/35244?from_cn_redirect=1

注意,云服务器中的安全组注意放开443端口。

拿到证书的绝对路径

server {
    #SSL 默认访问端口号为 443
    listen 443 ssl; 
    #请填写绑定证书的域名
    server_name www.xxxx123.cc; 
    #请填写证书文件的相对路径或绝对路径
    ssl_certificate /root/cert/xxx.crt; 
    #请填写私钥文件的相对路径或绝对路径
    ssl_certificate_key /root/cert/xxx.key; 
    ssl_session_timeout 5m;
    #请按照以下协议配置
    ssl_protocols TLSv1.2 TLSv1.3; 
    #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
    ssl_prefer_server_ciphers on;

}

server {
    listen 80;
    #请填写绑定证书的域名
    server_name www.xxxx123.cc; 
    #把http的域名请求转成https
    return 301 https://$host$request_uri; 
}

完事之后:

nginx -t

nginx -s reload

https://www.xamrdz.com/lan/5vy1961410.html

相关文章: