项目环境: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是一款轻量级的网页服务器、反向代理服务器。
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
Anaconda安装好之后,Django的安装就比较方便了,使用pip3进行安装:
[root@...] # pip3 install django
Anaconda安装好之后,uwsgi的安装就比较方便了,使用pip3进行安装:
[root@...] # pip3 install uwsgi
这里我是使用的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.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的配置文件,一般为/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 #这种方式好像需要配置一下
如果没用到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的配置也还需要多加学习才不会因为一些小问题而无所适从。
本篇记录仅供参考,如有问题,我会尽力解答与更正。
a
--
123456789
更改id为3
--
test
更改id为2
--
commentor
伪造名称???
--
hhh
伪造名称???
--
yayay