首先介绍下我的环境:python 3.7.2 + django 2.1.7 + nginx 1.21.1
17.1 Python环境部署
我们今天学习的内容是如何将Django项目部署到linux服务器上,我们部署的linux系统是centos7首先,我们先在linux上搭建我们的Python3环境:
在这里首先强调一下,Centos7系统自带的Python2我们不要删除,我们要做的是在Python2和python3并存。
- 安装Python3的依赖包
- 命令:
[root@localhost Desktop]# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y
Python3 环境安装
[root@xuegod63 ~]#mkdir python37 #创建python37文件夹
[root@xuegod63 ~]#cd python37/ #切换到python37文件夹
#下载官方网站的tgz入门
[root@xuegod63 ~]yum install wget #安装wget
[root@xuegod63python37]#wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz # 安装python3.7.2
[root@xuegod63 python37]# tar -xvJf Python-3.7.2.tar.xz #解包
[root@xuegod63 python37]编译安装 ./configure prefix=/usr/local/python3 make && make install
注意:如果出现提示需要模块的Error,关于在centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法
[root@xuegod63 python37]#yum install libffi-devel –y 然后再安装即可make install
然后设置python软连接,就像配置下windows下的path一个道理
[root@xuegod63 ~]# ln -s /usr/local/python3/bin/python3 /usr/bin/python
因为执行yum需要python2版本,所以我们还要修改yum的配置,执行:
[root@xuegod63 ~]#vim /usr/bin/yum
把#! /usr/bin/python修改为#!/usr/bin/python2
同理 vi /usr/libexec/urlgrabber-ext-down 文件里面的#! /usr/bin/python 也要修改为#! /usr/bin/python2
在第一阶段中我们已经安装过python3.7.2所以我们直接拿来用就ok了
1.python-devel
命令:yum -y install python-devel
安装运行必要版本:
2.获取windows下的必要环境安装
命令:python -m pip freeze > requests.txt
3.打开保存到桌面的requests.txt文档 修改没必要的安装包
4.修改没必要的第三方模块并传递给linux中
安装好所有依赖:python37 -m pip install -r requests.txt(python37 是我linux下的解释器)
17.1.2 运行项目
1.修改项目settings配置
在配置 uwsgi 时需要更改项目 settings.py 中的设置,更改项目如下:
DEBUG = True
ALLOWED_HOSTS = ['*']
静态文件重定位 STATIC_ROOT = os.path.join(BASE_DIR,'static')
再进行静态文件的转移 在项目目录下进行: Python manage.py collectstatic 这一步的顺序很重要,否则路径会有问题。
但是到这里我们有个明显的问题,我们的mysql数据库指定的ip为127.0.0.1,数据存储在我的windows中(工作中常把数据存储到云服务中),所以说我们要修改settings.py中的数据库ip
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dbname',
'HOST':'192.168.1.28',#这是windows ip地址
'PORT':'3306',
'USER':'root',
"PASSWORD":'123456'
}
}
既然有网络交互的行为,我们把windows和linux下的防火墙全部关闭(在这里我就偷下懒,用的是windows本机数据库)
但是,明显我们linux还是没有访问权限所以说给当前IP访问权限(在windows系统下操作,如果数据库配置好请略过)
mysql> use dbname;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
[root@xuegod63 ~]# cd /opt/
[root@xuegod63 ~]# rz
[root@xuegod63 ~]# unzip OurBlog.zip
结果如下:
运行结果如下:
注意:如果出现这个错误:(下面我们会对到静态文件统一处理)
ERRORS:?: (staticfiles.E002) The STATICFILES_DIRS setting should not contain the STATIC_ROOT setting.
STATIC_ROOT=os.path.join(BASE_DIR,"static/") #错误
STATIC_ROOT=os.path.join(BASE_DIR,"/static/") #正确
17.2 python uwsgi
上面我们已经完成了python+Django环境的部署,接下来我们需要了解python 的uwsgi框架。接下来我们需要了解python 的uwsgi模块。
Python manager.py runserver, 这是一款适合开发阶段使用的服务器,只支持最高200的并发,显然不适合在生产中使用。我们在生产环境当中,通常会用到apache或者nginx服务器作为Django的生产服务器。今天我们以nginx为例子。但是在学习部署之前,我们首先要掌握在Django和nginx之间的一个程序,就是wsgi,web服务器网关接口,英文叫, Web Server Gateway Interface 缩写叫WSGI,是Python应用程序或框架和web服务器之间的一种接口。我们今天部署用的是uwsgi模块,首先安装
pip3 install uwsgi
然后配置环境变量
命令:ln /usr/local/python3.7/bin/uwsgi /usr/bin/uwsgi
注意标红的地方是你的python路径
Django和WSGI的结合
我们把我们准备好的Django项目存放到/opt/下
然后尝试使用uwsgi启动Django项目
在这里我们要关注到之前大家一直忽视的一个文件了
紧接着修改OurBlog中的settings.py文件
DEBUG = Fasle
ALLOWED_HOSTS = ['*']
静态文件重定位 STATIC_ROOT = os.path.join(BASE_DIR,‘/var/www’)
再进行静态文件的转移 在项目目录下进行: Python manage.py collectstatic 这一步的顺序很重要,否则路径会有问题。
我们把静态文件迁移到/var/www中
这个就是我们项目的uwsgi文件
uwsgi --http :8080 --chdir /opt/OurBlog/ --wsgi-file OurBlog/wsgi.py --master --processes 4 --threads 2 --static-map=/static=/var/www
然后发起访问
17.3 django+nginx+uwsgi
上面我们用命令启动了uwsgi,但是体验不太好,所以我们在这里使用ini文件启动uwsgi服务器
在项目同等级目录下创建script目录
然后在当中编写uwsgi.ini文件,内容如下
[uwsgi]
socket = 127.0.0.1:9090 #在这个地方我们就写死
chdir=/opt/OurBlog
http= :8080
module=OurBlog.wsgi
master = true
processes=2
threads=2
max-requests=2000
chmod-socket=664
static-map = /static = /var/www
static-map = /media = /opt/OurBlog/media #配置静态文件
vacuum=true
daemonize = /opt/script/uwsgi.log
然后启动uwsgi服务
uwsgi --ini uwsgi.ini(脚本名称)
然后可以正常访问
警告:操作到这一步的时候可能你会获取不到media和static以及文章,我们需要修改/opt/OuBlog/OurBlog/urls.py如下:
from django.contrib import admin
from django.urls import path, include,re_path
from django.conf.urls import url
from django.views.static import serve
from OurBlog.settings import MEDIA_ROOT
import xadmin
from django.conf.urls.static import static
from OurBlog import settings
from Article.views import *
urlpatterns = [
path('xadmin/', xadmin.site.urls),
url(r'cheditor/',include('ckeditor_uploader.urls')),
url(r'^$',index),
url('index/',index),
url('myArticle/',myArticle),
url('myPicture/',myPicture),
url('aboutMe/',aboutMe),
url('article/',articleDetail),
url('vue/',vuePageData),#这一行提上来
url(r'^static/(?P<path>.*)$',serve,{'document_root': settings.STATIC_ROOT}, name='static'), # 添加这行
url(r'^media/(?P<path>.*)$' ,serve, { 'document_root' : settings.MEDIA_ROOT})
]
17.3.2 安装nginx服务器
我们直接安装nginx是没有的,所以,需要我们wget
命令:wget -c https://nginx.org/download/nginx-1.12.2.tar.gz
解压
命令:tar -zxvf nginx-1.12.2.tar.gz && cd nginx-1.12.2
自定义配置
命令:./configure \
编译安装
命令:make && make install
然后配置环境变量
命令:cd /usr/local/ nginx
配置软连接
命令:ln sbin/nginx /usr/bin/nginx
启动nginx查看效果
进行nginx配置,(配置nginx.conf,配置之前进行备份)
[root@xuegod63 var]# cd /usr/local/nginx/conf/
[root@xuegod63 conf]# ls
备份(重要)
[root@xuegod63 conf]# cp nginx.conf nginx.conf.bak
[root@xuegod63 conf]# ls
然后开始配置
只在server中配置
server {
listen 80;
server_name localhost;
charset utf-8;
access_log off;
location / {
include uwsgi_params; #nginx加载uwsgi模块
uwsgi_connect_timeout 30; #连键超时时间
uwsgi_pass 127.0.0.1:9090; #nginx对应的uwsgi socket文件
}
location /static {
alias /opt/OurBlog/static/; #静态文件路径
#index index.html index.htm; #首页
}
location /media {
alias /opt/OurBlog/media/;
}
运行代码:
#去除uwsgi进程
[root@xuegod63 conf]# killall -9 uwsgi
#重新加载uwsgi服务
[root@xuegod63 conf]# uwsgi --ini /opt/script/uwsgi.ini
nginx重新加载
[root@xuegod63 conf]# /usr/local/nginx/sbin/nginx -s reload
如果在重启nginx中出现错误如下:
执行:
[root@xuegod63conf]#/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
再次执行就OK了