Django项目部署【腾讯云】
相关博文
- 【MySQL】CentOS7 64位安装mysql教程
- 【Django】配置日志
- 【Django】项目部署上线
- 【Django】启动django工程
- 【Django】nginx+uwsgi部署教程
- 【Django】开放端口
配置过程中遇到的问题
- 【Django】AttributeError: ‘str’ object has no attribute ‘decode’
- 【Django】连接数据库迁移mysqlcient版本问题
- 【Django】Linux安装mysqlclient提示mysql_config not found
- 【Django】关于command ‘gcc’ failed with exit status 1的报错
- 【Django】部署error:语言设置
- 【Django】解决Django Admin管理界面样式表(CSS Style)丢失问题
- 【Django】Debug=True时在服务器上直接运行Django项目,自带管理端后台样式缺失
脚本配置
依赖配置
1. 准备工作
1.1 购买云服务器
腾讯云服务器,操作系统:Centos 7.6
1.2 连接服务器工具选择
- 连接服务器工具:Putty.exe
百度网盘下载,提取码3eva - 传输文件工具:WinSCP(本机为windows系统)
1.3 Git配置
[…待更新…]
2. 系统环境
2.1 更新系统
sudo yum update
#非root用户加sudo,root用户不需要
2.2 更新python
1. 检查及版本更换
#大写"V",查看python版本
python -V
#查看是否已经安装python:
whereis python
#我需要使用的是python3.6,切换默认Python
mv /usr/bin/python /usr/bin/python.bak #备份原默认python
ln -s /usr/local/bin/python3.7 /usr/bin/python #将使用的python设为默认版本
#检查是否有pip:
whereis pip
#切换默认pip (我的已经有pip3.6 和 pip2.7):
mv /usr/bin/pip /usr/bin/pip.bak
ln -s /usr/local/bin/pip3.7 /usr/bin/pip
2. 相关问题
- 问题1:在切换python3.6后,使用yum命令报错,网上搜索原因:yum基于python2编写的,会出现语法兼容问题。
- 修改yum配置文件,将python版本指向以前的旧版本:
#vi /usr/bin/yum
#!/usr/bin/python2.7
- 修改urlgrabber-ext-down文件,更改python版本:
#vi /usr/libexec/urlgrabber-ext-down
#!/usr/bin/python2.7
2.3 安装MySQL
1. 准备
#检查是否安装Mysql
rpm -qa | grep mysql
#下载安装repo源:
1. 下载
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
2. 安装
sudo rpm -ivh mysql-community-release-el7-5.noarch.rpm
3. 安装包后会获得两个mysql的yum repo源:
/etc/yum.repos.d/mysql-community.repo
/etc/yum.repos.d/mysql-community-source.repo
4. 安装MySql
sudo yum install mysql-server
2. 数据库修改
- 登录数据库
mysql -u root -p
ps:如果权限不足报错,可以修改文件用户组:“chgrp 组名 文件或目录”到当前用户组下,
可用:“groups 用户名”查看当前用户所属用户组
- 修改密码
mysql > use mysql;
mysql > update user set password=password('新密码') where user='root';
mysql > exit;
- 修改编码格式:
#查看:
show variables like "%char%";
#修改:
set names utf8;
- 重启mysql:
service mysqld restart
3. 开启远程访问权限
GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "远程访问密码";
- 附: 在尝试远程连接但是连接失败,可能原因:mysql是开启了3306端口,但是服务器防火墙未开放3306端口,开启端口后即可远程访问。
2.4 防火墙管理:
查看防火墙状态, 管理开放需要用的端口:
// 查看防火墙状态
systemctl status firewalld
// 没开启防火墙:
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
// 开启防火墙:
systemctl start firewalld
// 关闭防火墙:
systemctl stop firewalld
// 开放默认端口(3306):
firewall-cmd --permanent --zone=public --add-port=3306/tcp (临时)
firewall-cmd --permanent --zone=public --add-port=3306/tcp --permanent(永久)
// 开启后会提示 success
// 再次查看状态有:Warning: ALREADY_ENABLED: 3306:tcp 说明端口已经开启。
3 项目部署
到这一步,前面的准备工作基本上差不多了,可以尝试使用数据库工具远程连接,看是否配置成功;
下一步就是将win10上的django项目部署到服务器上了。目前我尝试的主要有两种部署方式:
① 依赖于Django自带的部署功能
② Nginx + uWSGI 部署
下面会依次说明。
1. 自带部署功能
1. 修改setting.py 文件
- 配置ALLOWED_HOSTS
ALLOWED_HOSTS列表为了防止黑客入侵,只允许列表中的ip地址访问
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '你的服务器的公网IP','域名(如果有的话)']
- 数据库连接修改为服务器对应的数据库
DATABASES = [
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '', #dbName
'USER': '', #user name
'PASSWORD': '',
'HOST': '', #本地-localhost,远程ip
'POST': '', #端口号,一般为3306
}
]
- 静态文件
#setting.py
STATIC_URL = '/static/'
STATIC_ROOT = 'static'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "/static/"),
]
- 修改urls.py,添加一下部分,确保将Debug设置为False时能读取到静态文件
#urls.py
#关闭调试后读取静态文件
from django.views import static
from django.conf import settings
from django.conf.urls import url
#Debug = False时用以读取静态文件
url(r'^static/(?P<path>.*)$', static.serve,
{'document_root': settings.STATIC_ROOT}, name='static'),
- ps:没使用nginx 代理静态文件,会存在Django自带管理端样式找不到的情况。
#解决方法
python manage.py collectstatic #将xadmin样式生成到static
2. 代码拷贝
方式WinSCP,直接选择复制即可
[ps: 或者通过github拉取代码,后续更新]
3. 环境安装及运行
生成及使用依赖文件
pip freeze > requirements.txt #生成依赖文件
pip install -r requirements.txt #快速安装相关依赖
4. 运行项目
python manage.py runserver 0.0.0.0:8000
// 说明:
// 8000:开通访问权限的端口号,这样外网才能访问
// python:我之前将默认python指向python3.6,此处直接使用python即可,没有需要使用python3.n
提示以下内容说明项目启动成功:
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
August 24, 2020 - 13:55:40
Django version 2.2, using settings '项目名称.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
2. Nginx + uWSGI部署
1. uWSGI
- 安装
pip install uwsgi
- 配置
[uwsgi]
#使用HTTP访问的端口号, 使用这个端口号是直接访问了uWSGI, 绕过了Nginx
http = 127.0.0.1:8080
#与外界连接的端口号, Nginx通过这个端口转发给uWSGI
socket = 127.0.0.1:8081
#项目所处绝对路径
chdir = /home/MrRC/app1/rcblog
#Django wsgi路径
wsgi-file = rcblog/wsgi.py
#是否使用主线程,最大进程数,每个进程线程数
master = true
processes = 1
threads = 2
#目录下文件改动时自动重启
touch-reload = /home/MrRC/app1/rcblog
#保存主进程 pid 文件
pidfile = uwsgi.pid
2. Nginx
- 安装
#要添加CentOS 7 EPEL存储库
sudo yum install epel-release
#安装nginx
sudo yum install nginx
#运行Nginx
sudo systemctl start nginx
#可能会用到的命令:重启,停止,启动,替换Nginx配置后需要重启nginx服务
service nginx restart
service nginx stop
service nginx start
- 配置
#the upstream component nginx needs to connect to
upstream django {
#for a file socket
#for a web port socket (we'll use this first)
server 127.0.0.1:8001;
server 127.0.0.1:12138;
}
#configuration of the server
server {
listen 8000; #监听端口,可通过此端口访问服务
#the domain name it will serve for
server_name ; #服务器ip地址
charset utf-8;
#max upload size
client_max_body_size 75M;
#Django media
location /media {
alias /home/MrRC/app1/rcblog/uploads; #指向django的media目录
}
location /static {
alias /home/MrRC/app1/rcblog/static; #指向django的static目录
}
#Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include uwsgi_params;
}
}
- 说明
- /etc/nginx 是我这里的Nginx安装路径,这里面包含nginx.conf配置文件,可以在这里直接配置代理
- /etc/nginx/conf.d 或者自己新建一个特定的配置文件放到conf.d,效果一样
3. 启动项目
在项目路径下启动Django项目,访问nginx配置的端口,查看配置结果。
4. 配置日志文件
Django日志配置
#log
#log 首先创建日志存储路径.
log_path = os.path.join(BASE_DIR, "logs")
if not os.path.exists(log_path):
os.makedirs("logs")
logsDirs = ['All', 'Error', 'Info']
for filename in logsDirs:
log_path = os.path.join(BASE_DIR, "logs/" + filename)
if not os.path.exists(log_path):
os.makedirs("logs/" + filename)
#DJANGO_LOG_LEVEL=DEBUG
LOGGING = {
'version': 1, #保留字
'disable_existing_loggers': False, #禁用已经存在的logger实例
#日志文件的格式
'formatters': {
#详细的日志格式
'standard': {
'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
'[%(levelname)s][%(message)s]'
},
#简单的日志格式
'simple': {
'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
#定义一个特殊的日志格式
'collect': {
'format': '%(message)s'
}
},
#过滤器
'filters': {
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
#处理器
'handlers': {
'default': { #默认的
'level': 'DEBUG',
'class': 'logging.handlers.RotatingFileHandler', #保存到文件,自动切
'filename': os.path.join(BASE_DIR + '/logs/All/',
"{}_all.log".format(time.strftime('%Y-%m-%d-%H-%M').replace('-', ''))), #日志文件
'maxBytes': 1024 * 1024 * 50, #日志大小 50M
'backupCount': 3, #最多备份几个
'formatter': 'standard',
'encoding': 'utf-8',
},
'error': { #专门用来记错误日志
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler', #保存到文件,自动切
'filename': os.path.join(BASE_DIR + '/logs/Error/',
"{}_error.log".format(time.strftime('%Y-%m-%d-%H-%M').replace('-', ''))), #日志文件
'maxBytes': 1024 * 1024 * 50, #日志大小 50M
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
},
'collect_info': { #专门定义一个收集特定信息的日志
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', #保存到文件,自动切
'filename': os.path.join(BASE_DIR + '/logs/Info/',
"{}_info.log".format(time.strftime('%Y-%m-%d-%H-%M').replace('-', ''))),
'maxBytes': 1024 * 1024 * 50, #日志大小 50M
'backupCount': 5,
'formatter': 'simple',
'encoding': "utf-8"
}
},
'loggers': {
'django': { #默认的logger应用如下配置
'handlers': ['default'], #'console', 上线之后可以把'console'移除
'level': 'DEBUG',
'propagate': True, #向不向更高级别的logger传递
},
'info': {
'handlers': ['collect_info'],
'level': 'INFO',
'propagate': False,
},
'error': {
'handlers': ['error'],
'level': 'ERROR',
'propagate': False,
},
},
}
5. 后台挂起Django项目
1. 说明
使用putty连接云服务器,在终端关闭后,系统会发送一个SIGHUP(挂断信号),自动地终止在当前会话中运行的程序。
2. 解决方法:
2.1 nohup
nohup python manage.py runserver 0.0.0.0:8000 &
nohup command > myout.file 2>&1 & # 将日志输出到myout.file文件中
nohup command & # 会在当前目录下创建一个nohup.out文件,记录程序运行时在终端产生的输出
2.2 screen
- 安装
yum install screen
- 命令
screen [-S name] #打开新窗口[新窗口自定义命名]
screen -ls #查看screen开启的端口
screen -r xxx(id) #进入xxx会话
ctrl + a, d #保留会话,但关闭窗口,会话的进程会继续运行
ctrl + a, k #关闭会话,关闭窗口
exit #关闭会话,关闭窗口
ctrl + a, n/p #上/下切换窗口
2.3 python启动
使用 python manage.py runserver 0.0.0.0:8000 >log.file 2>1 &
命令启动
>log.file
即输出重定向到log.file文件,即输出内容不打印到屏幕上,而是输出到log.file文件中2>&1
是将标准出错重定向到标准输出,即将标准出错和标准输出都输出到log.file文件中- 最后一个&, 是让该命令在后台执行
2.4 脚本
1.开启脚本
#!/bin/sh
nohup python manage.py runserver 0.0.0.0:8000 &
2.查看端口
echo 'start MyPorjectApp ...'
pid=`ps -ef | grep 'runserver 0.0.0.0:8000' | grep -v "grep" | awk '{print $2}'`;
if [[ ${pid} > 1 ]]
then
echo 'start project success!';
else
echo 'start project fail!'
fi
3.关闭脚本(检索条件杀死对应进程)
#!/bin/sh
echo 'stop project...'
pid=`ps -ef | grep 'runserver 0.0.0.0:8000' | grep -v "grep" | awk '{print $2}'`;
if [[ ${pid} < 1 ]]
then
echo 'stop error: project is not run';
else
for id in $pid
do
kill -9 $id
done
echo 'stop project success!'
fi
5. 总结:
到此,已经完成基本可供外部访问的Django项目配置,但还存在很多问题,后续会持续更新,并分享部署过程中遇到的问题,作为记录和分享。