django之项目部署到服务器(centos7+uwsgi+nginx+python3)

项目源码请点击这儿

先说如何将django部署到服务器吧。在之前我还是想说一下,因为我也是弄了好久,看了很多的博客、资料,但是就是没有成功。踩了很多坑之后,总结了一些问题的所在。其实服务器环境和别人的也没什么差别,主要都是一些细节的东西,但是别人的博客没有写出那些坑,那是因为人家没遇到,或者说人家觉得那样的是很基础的东西,所以就没说了。

今天我也来谈谈我部署的整个过程,不一定能让你真的完整的部署完,就像别人写他的博客的时候,至少人家用那种方法实现了,而我却失败了一样。所以我不能保证按照我这个一定会成功,因为可能有些地方我疏忽了,没有说。但是如果我的博客中有一些东西能对你有些启发、能帮助到你,那我就知足了。

 

一. 环境准备:
1. python3、pip3、数据库(我用到的是mysql)

服务器上默认的是python2,但是我要用的是python3,所以就先安装python3吧。这个可以去看这个教程:centos7安装python3,pip3,但是要注意一个问题,就是他里面将python默认指向python3的时候,只提到了要将/usr/yum文件的第一行的python改为你的python2对应的那个解析器,一般是python2,或者python2.7之类的。这个可以用命令ll /usr/bin/python*查看。
     


但是只修改了/usr/yum文件是不够的,还有一个文件,是/usr/libexec/urlgrabber-ext-down,使用vim打开,将首行的python改为python2.7就行了。
所以最终服务器上是这样的
    


2. Centos7(阿里云上买的服务器)


3. Django2


4. Git(git是管理仓库的一个东西,但是它处理管理仓库,还可以登录服务器,强烈推荐使用这个。当然还有putty等的软件)


5. 可以向服务器传文件的客户端,例如xftp,这个软件只需要连接上服务器之后,就可以拖动文件来在服务器之间互传文件了,很方便。当然,如果你不想用这个话,有连接服务器的客户端(比如上面说的git等),然后使用scp命令传文件也行,但是好像有点慢。

 

二. 将项目代码上传至服务器
1. 我想,你在这之前你得保证你得项目用python manage.py runserver是可以成功运行的,如图:
    
然后上传文件至一个合适的目录,注意,不要将项目传至/root,因为这个目录的权限太高。我是将项目传到/home目录下,我的我的项目名叫TestManage,所以上传之后,我的项目就在/home/TestManage下。

 

2. 然后修改settings.py文件。有几个地方需要修改

(1) DEBUG = False ,相信到现在你应该知道这样做的原因的了

(2) 数据库,比如你在本地的数据的密码和服务器上的数据库密码不同,那么你就要将相应的地方的密码改成服务器上的。比如这样,我的这种写法是因为我将数据库的密码写入环境变量了,所以这儿可以直接调用。你可以直接写你的密码

(3) 静态文件配置

增加如下代码,不过可能你在本地的时候,已经添加了STATICFILES_DITS这一项了,在这儿你只需要增加

STATIC_ROOT = os.path.join(BASE_DIR, 'allstatic')  # 这个地方你可以随便命名,到时候生成的静态文件目录名就是你设置的这个

如下

然后退出后执行python manage.py collectstatic,之后就会在当前目录生成一个新的目录,目录下就是你的所有静态文件(包括css,js,image等,还有一个admin相关的静态文件)。可能你会想,我的项目命名已经有静态文件了,为什么不直接用那个目录下的文件,而要执行这些命令将那些静态文件复制后来呢?

因为nginx找不到你的这个路径啊l。所以才要执行上面的操作,将静态文件收集到一个目录,然后在nginx配置中添加一下这个路径,nginx就可以识别到了。但是为什么不能直接将自己的静态文件的路径添加到nginx的配置中使用呢?我觉得可能是规范问题。首先,你写的静态文件的目录可能很乱,从收集到的静态目录我们也可以看到,路径分明,css,js,image在不同路径下,并且还有后台管理的静态文件。

 

三. 搭建环境


1. 关于虚拟环境是否需要

  • 首先,你可能看了一些教程说要安装虚拟环境,但少部分的人说可以不用。其实确实可以不用。
  • 说要用的是为了规范。例如,现在你的这个项目所需要的库有djagno2.1.5, python3,假如你现在的这个项目没有一个指定的虚拟环境,那么如果以后你又写了一个项目,要放在这个服务器运行,但是你之后的那个项目所依赖的是django1.7,那么你怎么办,两个项目的环境冲突了。所以就提出了要用虚拟环境(虚拟环境简单的理解就是一栋楼里的每一个房间一样,你可以在每一个房间安装不同的版本的django,或者其他的库。这些房间是可以独立的运行一个生产环境。而别的房间在干什么,不会对你当前的房间里的事产生影响)。
  • 那么说不需要的又是什么意思呢?那就是你保证你以后不会有冲突的项目,或者你只是初学django,想试试如何部署而已,并且该服务器是你个人所用,那么你就可以不用虚拟环境了。这个看你取舍吧。但是用虚拟环境也不麻烦的。


2. 更新yum,使用

yum update

这很重要。然后就是下载一下一些依赖的包,相信很多教程都说到了,你就按那些安装好依赖包就是了。


3. 安装虚拟环境。

先安装virtualenv,用命令。然后建立软链接  ln -s /usr/local/python3/bin/virtualenv /usr/virtualenv

pip install virtualenv
ln -s /usr/local/python3/bin/virtualenv /usr/virtualenv

 

4. 安装成功之后,还要安装两个包,我们要说的重点,nginx和uwsgi。

  • 安装nginx有两种方式,一种是直接使用命令yum install nginx,另一种是下载相应的压缩包,然后安装,也就是源码安装。我推荐用第二种方式,我也不知道具体的细节,反正我用了第一种之后,没有成功,并且我看到好多人都说用yum安装得到的那个包很老了。使用第二种方式安装请看centos7下安装nginx
  • 如果按照上面的步骤完成后,启动nginx,在本地的电脑上输入服务器的IP,能够显示下面的这个界面,那说明nginx安装没问题。事实上nginx的安装也不复杂,主要是uwsgi,和之后的配置问题。

  

  • 安装uwsgi,注意,这个时候,我还没有创建虚拟环境,也没有进入虚拟环境。也就是我这个时候安装的包是属于系统范围的,不是某个虚拟环境下的。使用命令就可以安装了。
pip install uwsgi

安装好之后,因为我们想在任意地方使用,所以你需要将uwsgi建立软连接。使用命令

ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi 

来建立软连接。建立成功之后,你可以使用命令ll /usr/bin/uwsgi查看是否成功。
  
当然了,第三步安装的nginx也要建立软链接的,使用命令

ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

来建立软连接
可以用命令ll /usr/nginx查看。
  

然后就要测试uwsgi
在任意路径下创建一个test.py文件,写入一下内容:

# test.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"  # 这是python2的写法
    Return [b“hello world”]  # 这是python3的写法,返回的是字节

根据你的python版本来选择要return什么。

 

  • 然后在test.py所在的目录下,使用以下命令
uwsgi --http :8001 --wsgi-file test.py

来测试uwsgi。敲完命令回车之后,你可以在本地的浏览器上输入你服务器的IP地址+8001来查看(例如192.168.41.16/8001),如果页面显示了hello world那么就说明成功了。

这儿有几个细节要注意,也是之前被坑了好久的问题,就是uwsgi测试不成功的原因

  • 首先,这个端口你可以随便选,但是不要用22,80之类的,这些端口是有特殊作用的。
  • 你选的这个端口你得保证已经加入安全组了。就是假如你是在阿里云买的服务器,那么你登录你的账号之后,在安全组那儿添加这个端口就可以了。我之前就是没有添加,然后uwsgi就一直测试不成功。

现在就要建立虚拟环境,并在虚拟环境中配置了。


5. 建立虚拟环境

之前的nginx,uwsgi,virtualenv都可以在任意目录下使用命令安装,因为他们会安装到默认的目录下的,我们可以不用管。现在建立虚拟环境就要考虑目录了。我是在/home下建立的虚拟环境,即分别执行两条命令

cd /home
cirtualenv env  # env是我命名的虚拟环境。

然后使用如下命令就可以进入虚拟环境了。

source env/bin/activate

成功之后是下面这样的。
   
你可以看到多了一个(env),这表示你进入了虚拟环境了。之后的所有操作我就不用再提了,都是在虚拟环境下。


6. 安装uwsgi

可能你会在其他教程里也看到了这样的操作,就是我们之前就已经装过了uwsgi,为什么又要再装一次。这个问题留到最后我会讲,你就先记得要都安装。安装命令也是一样的pip install uwsgi。
然后就是安装你这个项目所需要的那些库了。比如我用到了django2.1.5, requests, pymysql等,那么我就要安装这些库。注意,django的版本一定要和你项目里的那个一致。假如你的项目是你的电脑上写的,那么你可以在你本地的终端里查看django的版本。使用pip list命令
 
那么你在服务器安装的django也用这个版本。使用命令

pip install django==2.1.5

之后还需要将你的项目所有依赖的库都安装好。


7. 一切准备就绪,现在将你的项目上传到服务器

之前我说过了,我的项目名是TestManage,上传到/home目录。所以也就是这样的/home/TestManage
  
之后最重要的就是配置uwsgi和nginx了。首先你要保证你的nginx启动之后,可以在本地浏览器输入IP就可以看到那个界面,还有就是你的uwsgi测试那儿没有问题。然后在项目的根目录下(其实你可以在其他地方的,因为到时候我们只要到该uwsgi的配置文件下,使用命令uwsgi —ini+配置文件就可以启动了),反正就是这个目录不影响。先创建uwsgi文件,使用如下命令创建并编辑文件内容

vim mysite_uwsgi.ini  # 配置文件有多种写法,可以是.ini的,也有.xml等等,但是不同的后缀所写的代码是不一样的,我这儿介绍的是.ini这种写法

文件里写入如下内容

# mysite_uwsgi.ini
[uwsgi]  # 固定用法
chdir = /home/data/project/TestMange  # 项目根目录的路径
module = TestMange.wsgi  # 项目下同名目录下的wsgi.py文件。这个文件是创建django项目时就自带的。写法就是项目名.wsgi
home = /home/env  # 你要运行该项目的虚拟环境的目录
master = true
processes = 4  # 进程数
theads = 2  # 线程数
socket = :8001  # 开的端口,待会儿nginx的配置也要用到同样的端口号,不过这个端口号你可以自行选择,但是一定要假如了安全组的,否则不能用
chmod-sock = 666  # 文件的权限
vacuum = true
daemonize = mysite_uwsgi.log  # 启动该项目后,日志信息不在终端显示,而是写入该文件。该文件会自动创建的
logfile-chmod = 666 # 日志文件的权限权限不能太低,那样的话就无法写入了。

其他的参数就不一一说了,你可以看篇文章uwsgi常用参数介绍
配置完之后:wq退出。


然后去配置nginx,按照源码安装的话,你就是要进入/usr/local/nginx/conf目录。然后ls你就可以看到该目录下有一个叫nginx.conf的文件。里面有一些默认的东西。现在我们就在该目录下新建一个文件nginx.conf,在这儿之前,你要先删除原有的那个文件,但是保守起见,还是将其重命名吧,使用命令:mv nginx.conf nginx.conf.bak(一个小常识,.bak文件一般都是一个副本)。

cd /usr/local/nginx/conf
mv nginx.conf nginx.conf.bak

然后新建一个配置文件

vim nginx.conf

文件中写入以下内容:

# mysite_nginx.conf
worker_processes 1;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    
    upstream django {
        server 127.0.0.1:8001;  # 该端口号一定要和之前uwsgi的那个文件里的socket对应的端口一致。
    }
    server {
        listen 80;
        server_name 127.0.0.1:80;  # 这儿如果你有域名的话,就将127.0.0.1:80换成你的域名,没有的话就用这个。
        charset utf-8;
        
        location /media {
        alias /home/TestMange/media; # media是你项目中的一个目录,这个目录是用户上传文件保存的路径,如果你的项目中没有这个上传文件的需求,因此也没有这个目录,那么这一项你就可以不用配置。
        }
        
        location /static {
        alias /home/TestMange/allstatic;  #  静态文件的路径(注意,这儿的allstatic是执行了python manage.py collectstatic之后,自动产生的一个目录,该目录下收集了你项目中所有的静态文件。其实就是将你的静态文件复制了一遍过来)
        }
        
        location / {
            uwsgi_pass django;
            include /usr/local/nginx/conf/uwsgi_params; # yum安装的话,好像这个uwsgi_params文件没有的,需要去github上下,自行百度吧。不过如果你是用yum安装的话,你的nginx也不是在这个路径下。
        }
    }
}


然后:wq退出就可以了。现在,基本上已经配置完了。重新加载nginx。可以使用命令

# 在重新加载前,你可以先使用如下命令检查你的nginx配置文件有没有问题
nginx -t
# 如果执行上面的命令没有显示什么错误的话,就可以使用下面的命令来重新加载nginx了
nginx -s reload

(使用这个命令的前提是你的nginx已经建立了软链接。没有的话,你就去/usr/local/nginx/sbin/目录下,会看到一个nginx文件,使用命令./nginx -s reload也可以重新加载nginx

cd /usr/local/nginx/sbin/
./nginx -s reload

然后回到项目目录下,也就是你的uwsgi配置文件所在的目录。如果你的这个配置文件在其他地方,那你就回到那个目录就可以了。使用命令如下命令启动uwsgi配置文件,

uwsgi —ini mysite_uwsgi.ini  # 保证mysite_uwsgi.ini在当前目录,不在的话,请先切换到它所在的目录。

你就可以在本地电脑输入IP加你的项目名访问了。我不知道之前配置的那个8001端口,好像也不需要输入这个端口啊。例如我的TestManage项目下有一个叫blog的app,那么我输入ip/blog,就可以访问我的项目了。

 

四. 小结

1. 之前留了一个问题,就是为什么要安装两次uwsgi呢?

我们现在使用uwsgi --ini mysite_uwsgi.ini启动配置文件,这是在虚拟环境下的。也就是说我们的虚拟环境下安装了一个uwsgi。那如果下次我们重新登录服务器之后,要启动这个配置文件呢?还要重新进入一下虚拟环境,然后再使用这条命令吗,显然是很麻烦。所以我们在系统环境中安装了一个uwsgi,到时候直接使用命令就可以了,不必再进入虚拟环境。

2. 碎碎念。

完成这些所有的配置我们需要做到的东西:

1. django的settings.py的配置
2. nginx只在系统环境中安装了一次,但是uwsgi安装了两次(一次在系统环境,一次在虚拟环境)
3. 两个配置文件 nginx 和 uwsgi 各一个
4. 收集静态文件:python manage.py collectstatic # 前提是django的settings.py要设置好。
5. 端口,一定要假如安全组才能用
6. 收集完之后的静态文件路径allstatic,和用户文件上传路径media。这两个路径的权限问题,如果allstatic路径的权限不够,那么就会造成静态文件丢失的情况,因为没有读取权限嘛。如果medai路径的权限不够,那么用户就无法上传文件。而且我试过,静态文件路径设置成666,照样会有静态文件丢失的情况,所以我直接将该目录的权限改为777了。并且要该路径下的所有文件的权限都是777,不是只修改这个目录的权限。你可以使用命令
chmod -R 777 allstatic  # 这条命令将会使得该路径下的所有文件的权限都是777

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章