1、python环境部署
2、python uwsgi
3、django + nginx + uwsgi
一、Python环境部署
如何将Django项目部署到linux服务器上,我们部署的linux系统是centos7
首先,我们先在linux上搭建我们的Python3环境:
在这里首先强调一下,Centos7系统自带的Python2我们不要删除,我们要做的是在Python2和Python3并存。
安装Python3的依赖包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make -y
Python3 环境安装
创建python37文件夹
# mkdir python37
切换到python37文件夹
# cd python37/
安装wget
yum install wget
安装 Python3.7.2
wget https://www.python.org/ftp/python/3.7.2/Python-3.7.2.tar.xz
解包
tar -xvJf Python-3.7.2.tar.xz
python37编译安装
./configure prefix=/usr/local/python3 make && make install
注意:
如果出现提示需要模块的Error,关于在centos下安装python3.7.0以上版本时报错
ModuleNotFoundError: No module named '_ctypes’的解决办法:
yum install libffi-devel –y
然后再安装即可make install
然后设置python软连接,就像配置下windows下的path一个道理
ln -s /usr/local/python3/bin/python3 /usr/bin/python
因为执行 yum 需要 python2 版本,所以我们还要修改yum的配置,执行:
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了
安装python-devel
yum -y install python-devel
安装运行必要版本:
1.获取windows下的必要环境
python -m pip freeze > requests.txt
2. 打开保存到桌面的 requests.txt 文档 修改没必要的安装包
3. 修改没必要的第三方模块并传递给 linux 中
安装好所有依赖:
python37 -m pip install -r requests.txt
运行项目:
1.修改项目settings配置
在配置uwsgi 时需要更改项目 settings.py 中的设置,
更改项目如下:
DEBUG = True
ALLOWED_HOSTS = ['*']
但是到这里我们有个明显的问题,我们的 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 下的防火墙全部关闭
但是,明显我们 linux 还是没有访问权限所以说给当前IP访问权限
mysql> use dbname;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
# cd /opt/
# rz
# 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/") #正确
二、Python的uwsgi框架
上面我们已经完成了 python+Django 环境的部署,接下来我们需要了解 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 = False
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
然后发起访问。
三、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]
chdir=/opt/OurBlog #项目目录module=OurBlog.wsgi:application #指定项目的application
socket=/opt/script/uwsgi.sock #指定sock的文件路径
workers=5 #进程个数
pidfile=/opt/script/uwsgi.pid
http=192.168.1.89:8000 #指定IP端口
static-map=/static=/opt/OurBlog/static #指定静态文件
uid=root #用户
gid=root #组
master=true #启用主进程
vacuum=true #自动移除unix Socket和pid文件当服务停止的时候
enable-threads=true #启用线程
thunder-lock=true #序列化接受的内容,如果可能的话
harakiri=30 #设置自中断时间
post-buffering=4096 #设置缓冲
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),:wq
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})]
如果还是出不来样式,请重启 uwsgi
# killall -9 uwsgi
# uwsgi --ini uwsgi.ini次刷新就OK了
安装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,配置之前进行备份)
# cd /usr/local/nginx/conf/
# ls
备份
# 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 /var/www; #静态文件路径
#index index.html index.htm; #首页
}
location /media {
alias /opt/OurBlog/media/;
}
运行代码:
去除uwsgi进程
# killall -9 uwsgi
重新加载uwsgi服务
# uwsgi --ini /opt/script/uwsgi.ini
nginx重新加载
# /usr/local/nginx/sbin/nginx -s reload
如果在重启nginx中出现错误如下:
执行
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf
/nginx.conf
再次执行就OK了
总结:
1. python环境部署
2. python uwsgi
3. django+nginx+uwsgi