Django项目部署--Nginx+uwsgi记录

项目环境: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的配置也还需要多加学习才不会因为一些小问题而无所适从。
本篇记录仅供参考,如有问题,我会尽力解答与更正。

你可能感兴趣的:(Django开发)