如何在阿里云Ubuntu服务器通过uWSGI和Nginx部署Django项目教程

小编我一直认为Django的项目部署是一个学习难点,也是学习Django过程中必需要跨过去的一个坎,毕竟生产环境和本地单机环境有很大的不同,在本地运行很好的项目在云服务器上不一定运行得很好。生产环境中要不仅需要更多地考虑安全因素,还要考虑网站以后应对大流量的能力。网上Django的部署的教程很多,但坑也比较多,没有一个完美的。今天小编我决定亲自动手写篇在阿里云Ubuntu服务器上部署Django项目的教程,采用的是经典的uWSGI+Nginx架构组合,完全可以胜任中大型Django项目的开发。本教程里面的uWSGI和Nginx配置都是可以复用的,注意收藏哦。

如何在阿里云Ubuntu服务器通过uWSGI和Nginx部署Django项目教程

 

uWSGI+Nginx+Django工作原理

nginx作为服务器前端,接受客户端所有的请求,统一来管理。Nginx把所有的静态请求自己处理(静态文件处理是nginx的强项),然后把所有非静态请求通过uwsgi传递给Django,由Django来处理,从而完成一次web请求。

 

部署环境

阿里云服务器Ubuntu 16.04版 (Linux),Python 3.X。如果你是首次购买阿里云服务器,你应该做如下事情:

 

1. 配置安全组

2. 设置远程连接密码 - 重启服务器

3. 本地安装FileZilla通过SSH连接服务器 (相当于FTP,以便于上传和查看文件。

 

同时你还需要知道购买服务器的公网IP,便于后续通过互联网直接查看项目是否已经部署成功。

 

第一步 升级Python和PIP

刚购买的ubuntu 16.04服务器自带Python还是2.7版的, pip版本为8,需要先使用如下命令升级Python和PIP版本。

sudo apt-get install python3.5 # 安装python

sudo apt-get install python3-pip # 安装python 3-pip

sudo rm /usr/bin/python # 删除python 2.7版本

sudo ln -s /usr/bin/python3.5 /usr/bin/python  # 将python链接到最新3.5版的

pip3 install upgrade -- pip # 升级pip

pip3 -- version #查看pip版本

 

第二步 创建用户

阿里云给你的默认登录用户是root,而且是没密码的。建议先创建个人用户,我们这里以enka为例。创建好后,你会发现/home/目录里多一个enka文件夹。注意刚创建的enka用户没有sudo权限,你必需先赋予它sudo权限才便于执行后面命令。

 

• 创建用户: adduser enka, 连续输入密码两次。

•赋予sudo权限: sudo vim /etc/sudoers或visudo , 追加一行enka ALL=NOPASSWD: ALL。按ESC切入命令行,这里要用:wq!来写入保存

•切换用户到enka: su – enka

 

第三步 创建虚拟环境

每个独立项目都有自己的依耐性。在创建一个Django项目前,我们应该创建一个虚拟环境,把django安装在虚拟环境里。这不是建议,还是必需。连续输入以下项目命令后,你会发现/home/enka/目录下多了一个子目录Env,专门用于存放虚拟环境信息。

 

•sudo pip install virtualenv virtualenvwrapper

•echo"export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.bashrc
•echo"export WORKON_HOME=~/Env" >> ~/.bashrc

•echo"source /usr/local/bin/virtualenvwrapper.sh">> ~/.bashrc

•source ~/.bashrc

 

本例中我们不仅安装了virtualenv,还安装了virtualenvwrapper,并将配置信息输入到.bashrc文件里了。这里.bashrc隐藏文件是用来存储并加载你的终端配置和环境变量的。现在你可以使用如下命令创建,终止和切换虚拟环境了,这样比使用virtualenv的source /bin/venv/activate等命令来**和管理一个虚拟环境方便多了。

 

•mkvirtualenv myproject  #创建一个myproject的虚拟环境

•deactivate #退出虚拟环境

•workon myproject1 #切换到myproject1的虚拟环境

 

第四步 安装Django

使用mkvirtualenv myproject命令创建一个叫myproject的虚拟环境后,你就可以把Django安装在这个虚拟环境里了。

• pip install django #安装django

 

Django安装好后,cd进入/home/enka目录使用sudo mkdir myproject命令创建一个叫myproject的文件夹(建议与虚拟环境名保持一致,与本地Django项目名保持一致)。这个项目文件夹地址是/home/enka/myproject, 里面将存放django代码,此时可以通过git clone在线获取项目代码,也可以通过FileZilla将本地项目代码上传到这里。(注: 如果你没有现成项目代码,你还可以通过使用django-admin.py startproject myproject在线创建一个项目。)

 

项目代码到位后,连续输入以下命令,然后访问公网ip地址:8080,你应该就可以看到你的django项目已经上线啦。

• pip install -r requirements.txt  #安装依赖文件

• python manage.py createsuperuser #创建超级用户

• python manage.py makemigrations

• python manage.py migrate #生产数据表

• python manage.py collectstatic #搜集静态文件

• python manage.py runserver 0.0.0.0:8080

 

注意, 运行项目前请确保你已经在settings.py里设置STATIC_ROOT= os.path.join(BASE_DIR, "static/")和ALLOWED_HOSTS= ['your_server_domain_or_IP']。

 

 

第五步 安装uWSGI,并将其加入系统服务

第四步中我们还是使用django的runserver命令来运行服务器的,我们现在来安装uWSGI并使其做服务器。使用deactivate命令退出虚拟环境后,使用pip安装uwsgi。随后再使用workon myproject命令进入虚拟环境,在虚拟环境中再安装uwsgi一遍,并测试uwsgi是否安装成功。(注: uwsgi需要安装两遍哦.)

 

• pip install uwsgi # 安装uwsgi

• uwsgi -- version # 查看版本

 

uWSGI安装成功后,你可以使用如下命令启动Django项目myproject,退出时可以使用Ctrl+C退出。

• uwsgi --http :8080 --home /home/enka/Env/myproject --chdir /home/enak/myproject -w myproject.wsgi

 

这个命令太长,很难记住。一个更好的方法是配置uwsgi,并将其加入系统服务。这样每次启动uwsgi服务时,自动调用配置文件的设置。在终端连续输入以下命令,创建myproject.ini文件,存放uwsgi配置信息。

 

• sudomkdir -p /etc/uwsgi/sites

• cd /etc/uwsgi/sites

• sudo nano myproject.ini

 

myproject.ini文件配置内容如下,这个设置是可以复用的。如果你要复用,你只需要修改project名和base即可。

[uwsgi]

project = myproject # 项目名

uid = www-data # nginx 默认用户名

gid = www-data # nginx默认用户组

 

base = /home/enka # 根目录

chdir = %(base)/%(project)  #项目目录

home = %(base)/Env/%(project) #虚拟环境目录

module = %(project).wsgi:application #对应wsgi文件

master = true  #主进程

processes = 2 #同时进程数

socket = /run/uwsgi/%(project).sock #对应sock文件名

chown-socket = %(uid):www-data #指定socket用户与用户组

chmod-socket = 660 #指定socket用户读写执行权限

vacuum = true #每次重启是否清理

 

现在我们需要把uwsgi加入到系统服务,这样我们就可以通过使用sudo systemctl start uwsgi 来启动uwsgi服务了。

•sudo nano /etc/systemd/system/uwsgi.service

 

uwsgi.service文件内容如下,采用的是Emperor模式。

[Unit]

Description=uWSGIEmperor service

 

[Service]

ExecStartPre=/bin/bash -c 'mkdir-p /run/uwsgi; chownwww-data:www-data /run/uwsgi'

ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites

Restart=always

KillSignal=SIGQUIT

Type=notify

NotifyAccess=all

 

[Install]

WantedBy=multi-user.target

 

第六步 安装与设置Nginx

使用如下命令安装Nginx,并创建配置文件。

•sudo apt-get install nginx # 安装nginx

•sudo nano /etc/nginx/sites-available/myproject #创建myproject配置信息

配置文件如下所示,标红部分需要换成你自己的项目信息。

server {

 

listen 80;

server_name your_ip_or_your_domain;

location = /favicon.ico { access_log off; log_not_found off; }             

  

location /static/  {

root /home/enka/myproject/;

} #设置静态文件根目录

 

location /media/  {

root /home/enka/myproject/;

}  #设置媒体文件根目录

 

location / {

include uwsgi_params;                               

uwsgi_pass     unix:/run/uwsgi/myproject.sock;

}  #如果非静态或媒体文件,交由uwsgi处理

 

}

 

设置好配置文件后,连续使用如下4个命令,访问公网IP你就应该能看到你的项目能成功运行啦。

• sudo ln -s /etc/nginx/sites-available/myproject  /etc/nginx/sites-enabled # 创建链接

• sudo nginx –t #检查nginx语法

• sudo systemctl restart nginx #重启nginx服务

• sudo systemctl restart uwsgi #重启uwsgi服务

 

参考资料

https://www.digitalocean.com/community/tutorials/how-to-serve-django-applications-with-uwsgi-and-nginx-on-ubuntu-16-04

 

小结

本文介绍了如何在阿里云Ubuntu服务器上通过uWSGI和Nginx部署Django项目,并分享了可以复用的uwsgi和nginx配置信息。然而我们并没有介绍如何使项目在生产环境中更安全,比如关闭DEBUG,把SECRET_KEY和数据库的密码变为环境变量,而不是简单放在settings.py文件里。我们下次将专门介绍,欢迎关注。

 

大江狗

2019.3.1

如何在阿里云Ubuntu服务器通过uWSGI和Nginx部署Django项目教程