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