项目环境:Django2.1、Python3.6.0(基于Anaconda4.3.0)
操作系统:阿里云CentOS7
部署环境:nginx/1.12.2、uwsgi/2.0.17.1
注:接下来的操作均在root身份下进行


Django自带的服务器只适用于调试时使用,项目正式发布时需要一个更加稳定的服务器,Apache和Nginx都可以,本文将在阿里云服务器上基于Nginx和uwsgi部署Django项目,服务器端操作系统为CentOS7。


WSGI是Web服务器(如nginx)与应用服务器(如uWSGI)通信的一种规范。uWSGI实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器。uwsgi是一种线路协议,是uWSGI服务器自有的协议。 Nginx是一款轻量级的网页服务器、反向代理服务器。

一、部署前准备

1.1 安装Anaconda

Anaconda中已经集成了很多Python的包及其依赖,Python的环境使用Anaconda进行搭建比较方便。首先可以在本地将Anaconda对应版本下载下来,接下来通过xftp将安装本传输至远程主机上。我下载的安装包为:Anaconda3-4.3.0-Linux-x86_64.sh
接下来进入Anaconda安装包所在的目录位置,我将安装包放在了/root目录下(我对Linux的目录还不是特别了解,后面的路径均可以自己根据情况自己确定),接下来进入到该目录下并执行如下命令:

cd /root  
bash Anaconda3-4.3.0-Linux-x86_64.sh  

安装过程中可以选择安装路径,我将Anaconda安装在了/usr目录下。
安装完成后可以将其Anaconda加入环境变量(#后面均为注释):

vim ~/.bashrc    #打开.bashrc文件  
#在该文件末尾加入一行   export PATH=/usr/anaconda3/bin:$PATH  
#此处路径与自己安装Anaconda的目录有关,保存后退出  
source ~/.bashrc     #文件保存后使配置立即生效  

Anaconda这样应该就配置好了,可以测试一下,在终端输入:

[root@...] # python --version  
Python 3.6.0 :: Anaconda 4.3.0 (64-bit)  

安装好Anaconda后的pip3还需要更新,可以使用如下命令:

[root@...] # pip3 install --upgrade pip  

1.2 安装Django

Anaconda安装好之后,Django的安装就比较方便了,使用pip3进行安装:

[root@...] # pip3 install django  

1.3 安装uwsgi

Anaconda安装好之后,uwsgi的安装就比较方便了,使用pip3进行安装:

[root@...] # pip3 install uwsgi  

1.4 安装nginx

这里我是使用的lnmp的集成安装包安装的,网上的教程也很多,可以参考一下。
注:Centos默认会把nginx安装在/usr/local/nginx/ 目录下

二、项目迁移

Django项目迁移我遇到的最大问题是静态文件的处理,因为本地调试使Django项目中中的DEBUG设置为True,这样Django会自己寻找静态文件。可是项目上线后需要关闭DEBUG模式,这就需要手动设置一下了。
首先把项目传输至服务器,我将项目文件夹放在/home目录下。
项目上线时,首先需要在项目的settings.py中进行如下修改:

#以下语句在项目的settings.py中可以找到,并做相应修改  
DEBUG = False     # 关闭调试模式  
ALLOWED_HOSTS = ['*']   # 设置允许访问的主机  

静态文件的处理我参考了:https://blog.csdn.net/wjy397/article/details/51610872
仍然需要在项目的settings.py中进行修改:

# BASE_DIR是项目根目录  
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  
# STATIC_URL设为项目的静态文件绝对路径  
# 这里网上一般说配置为'/static/',不过我这样的话访问静态资源会404,大家可以自己试一试  
STATIC_URL = '/home/PersonalBlogSite/static/'  
# STATIC_ROOT要写为项目下静态文件目录的绝对路径  
#STATIC_ROOT 是在部署静态文件时所有的静态文静聚合的目录  
STATIC_ROOT =  os.path.join(BASE_DIR,'static')  

配置完成并保存好之后,收集静态文件,在项目根目录下执行如下命令:

python manage.py collectstatic  
# 静态文件将全部集中在STATIC_ROOT下  

注意项目的文件夹下的权限至少为755,否则静态资源可能无法访问,可以在项目目录下执行如下语句:

cd /home/PersonalBlogSite     # 这是我的项目目录  
chmod -R 755 ./  

我的项目使用的数据库为Django自带的sqlite,如果使用其他的数据库需要将数据库也迁移至云端,该部分内容可以参考其他教程。

三、uwsgi配置

uwsgi的配置方式很多,我只介绍我使用的方法。
在项目的根目录下新建一个文件uwsgi.ini,并写入以下内容,需根据自己实际项目内容进行修改(#后的内容删除):

[uwsgi]  
socket=127.0.0.1:8997       #与nginx通信的socket端口号  
chdir=/home/PersonalBlogSite   #项目根目录  
wsgi-file=PersonalBlogSite/wsgi.py #项目中wsgi.py文件的目录,相对于项目根目录  
processes=4  
threads=2  
master=True  
pidfile=uwsgi.pid  
daemonize=uwsgi.log  

uwsgi的启动方式为,在项目根目录下执行:

uwsgi --ini uwsgi.ini  

uwsgi的结束方式为:

#我使用的方式是查找到pid并直接kill  
[root@...]# ps -ef | grep uwsgi  
root 4482 1  0 10:27 ...  
root 4961 4482 0 16:50 ...  
root 4962 4482 0 16:50 ...  
root 4963 4482 0 16:50 ...  
root 4964 4482 0 16:50 ...  
root 5041 4873 0 16:54 pts/0  00:00:00 grep --color=auto uwsgi  
[root@...]# kill -9 4482  
# 另一种方式为先进入uwsgi.pid所在的文件夹,然后执行以下命令  
uwsgi --stop uwsgi.pid  

四、Nginx配置

打开nginx的配置文件,一般为/usr/local/nginx/conf/nginx.conf,并在server中添加如下内容:

server {  
    listen 80       #监听的端口  
    root /          #nginx的根目录  
     charset utf-8;  
     location / {  
        include uwsgi_params;  
        uwsgi_pass 127.0.0.1:8997; #与uwsgi配置的socket端口号一致  
    }  
    location  /static/ {  
        autoindex on;  
        root /home/PersonalBlogSite/;     #静态文件目录  
    }  
    #访问svg文件需要添加如下内容  
    location ~ \.(eot|otf|ttf|woff|svg|woof2)$ {  
        add_header  Access-Control-Allow-Origin *;  
    }  
}  

nginx的启动:

/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf  
或  
service nginx start   #这种方式好像需要配置一下  

nginx的关闭:

# 可以查找到进程然后kill,与之前介绍的uwsgi结束方式类似  
service nginx stop   #这种方式好像需要配置一下  

五、mdeditor的配置

如果没用到django-mdeditor的话这里可以跳过。
配置好之后我发现之前使用的django-mdeditor失效了,其CSS和JS均加载不出来,我发现是URL不对,我手动在根目录下的static目录中新建了一个mdeditor文件夹,并把static文件下的内容全部复制了一份放在mdeditor文件下,这样便可以正确加载mdeditor了。
但是仍然存在一个问题,就是上传图片失效,并且加载不出来图片,其原因还是URL错了。我把项目中的settings.py与media相关的配置语句改了一下:

MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')   #这里没有改动  
MEDIA_URL = '/home/PersonalBlogSite/uploads/'    #这里改为了与MEDIA_ROOT相同的目录  

六、项目启动

首先启动nginx:

service nginx start  

接下来启动uwsgi,进入项目根目录下执行:

uwsgi --ini uwsgi.ini  

此时服务应该就正常启动了,因为我使用的是80端口,所以接下来在浏览器中直接输入 http://域名或ip地址/项目URL 应该便可以访问项目了。

心得体会

本次Django项目部署在加载静态资源时花费了特别多的时间,我想提醒大家可以注意一下浏览器中资源加载时出现的错误提示。nginx服务器部署好之后,是可以根据URL访问到服务器中的任何存在资源的,我的问题大多是配置文件没有配置好的原因,我之前nginx服务器的根目录没有修改,我直接将nginx服务器的目录改为了根目录进行测试,这样可能不太好,但是项目跑通了。现在我发现django的配置可能也还有一些需要学习的地方,关于nginx的配置也还需要多加学习才不会因为一些小问题而无所适从。
本篇记录仅供参考,如有问题,我会尽力解答与更正。

评论

还没有登陆?评论请先登陆注册

还没有评论,抢个沙发吧!

 联系方式 contact me

Github
Email
QQ
Weibo