服务器部署个人Django web项目【腾讯云】

Django项目部署【腾讯云】

相关博文

配置过程中遇到的问题

脚本配置

依赖配置

1. 准备工作

1.1 购买云服务器

腾讯云服务器,操作系统:Centos 7.6

1.2 连接服务器工具选择

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. 问题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. 数据库修改
  1. 登录数据库
mysql -u root -p
ps:如果权限不足报错,可以修改文件用户组:“chgrp 组名 文件或目录”到当前用户组下,
可用:“groups 用户名”查看当前用户所属用户组
  1. 修改密码
mysql > use mysql;
mysql > update user set password=password('新密码') where user='root';
mysql > exit;
  1. 修改编码格式:
#查看:
show variables like "%char%";
#修改:
set names utf8;
  1. 重启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 文件
  1. 配置ALLOWED_HOSTS
    ALLOWED_HOSTS列表为了防止黑客入侵,只允许列表中的ip地址访问
ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '你的服务器的公网IP','域名(如果有的话)']
  1. 数据库连接修改为服务器对应的数据库
DATABASES = [
	'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '',		#dbName
        'USER': '',		#user name
        'PASSWORD': '',	
        'HOST': '',		#本地-localhost,远程ip
        'POST': '',		#端口号,一般为3306
    }
] 
  1. 静态文件
#setting.py
STATIC_URL = '/static/'
STATIC_ROOT = 'static'
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "/static/"),
]
  1. 修改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'),
  1. 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
  1. 安装
pip install uwsgi
  1. 配置
[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
  1. 安装
#要添加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
  1. 配置
#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; 
	}
}

  1. 说明
  • /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
  1. 安装
yum install screen
  1. 命令
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 & 命令启动

  1. >log.file 即输出重定向到log.file文件,即输出内容不打印到屏幕上,而是输出到log.file文件中
  2. 2>&1 是将标准出错重定向到标准输出,即将标准出错和标准输出都输出到log.file文件中
  3. 最后一个&, 是让该命令在后台执行
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项目配置,但还存在很多问题,后续会持续更新,并分享部署过程中遇到的问题,作为记录和分享。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值