本文来自于州的先生在线教程《七天实战入门Django》第七天的课程,更多原创在线教程点击此处进行学习:州的先生在线教程
在本地机器上完成Django项目的开发之后,我们就需要将其部署到服务器上。
今天我们就来学习一下如何将 Django 网站部署在 Ubuntu 服务器上。
考虑到很多人没有云服务或者是本地服务器,在此我们在本地计算机通过 VirtualBox 安装 Ubuntu 虚拟机来模拟实现一个远程服务器。
一、安装 Ubuntu 虚拟机
将 VirtualBox 安装好之后,从 163 的开源镜像站上下载 Ubuntu 16.04 的服务器版本 iOS 镜像文件,如下图所示:
下载完成之后,打开 VirtualBox 软件,新建一个虚拟机,如下图所示:
新建完成之后,在虚拟机的设置中添加下载好的 iOS 镜像文件,如下图所示:
然后启动虚拟机,如下图所示:
选择第一项进行 Ubuntu 的安装,接下来根据提示选择和等待安装完成,如下图所示:
设置主机名,如下图所示:
设置用户名,如下图所示:
设置用户密码,如下图所示:
等待安装完成,如下图所示:
安装完成,如下图所示:
重启之后,我们的 Ubuntu 就启动了,如下图所示:
输入用户名和密码就进入了系统界面,如下图所示:
二、安装基本软件和服务
为了便于本地与虚拟机之间的通信,我们使用 Xshell 和 Xftp 软件作为远程连接 Ubuntu 虚拟机的工具。
安装 Xshell 和 Xftp
在官网下载并按照好 Xshell 和 Xftp。
安装 Ubuntu 的 SSH 服务
在启动的虚拟机终端下,使用 apt-get 安装 SSH 服务:
sudo apt-get install openssh-server
然后启动 SSH 服务:
sudo /etc/init.d/ssh start
这样,我们的 Ubuntu 虚拟主机就能够通过 SSH 供其他计算机进行访问了。
查看一下虚拟机的 IP 地址:
ifconfig
结果显示,如下图所示:
我们就可以使用这个 IP 地址通过 Xshell 来连接 Ubuntu 虚拟机。
使用 Xshell 连接虚拟机
打开 Xshell 软件,新建一个连接,选择 SSH 协议,主机填写为虚拟机的 IP 地址,端口号填写为 22,如下图所示:
然后切换到用户身份验证栏,填写虚拟机的用户名和密码,如下图所示:
确认之后,单击连接,就可以通过 SSH 连接上虚拟机,如下图所示:
同时可以单击菜单栏的 Xftp 按钮进入到文件传输界面,如下图所示:
安装 Python 和 Django
在 Ubuntu 16 这个版本中,默认集成了 Python 3.5 的环境,在终端输入“python3”,可以进入到 Python 3 的 Shell 中,如下图所示:
但是我们发现,Python 下便捷的包管理工具 pip 并没有自带安装,如下图所示:
所以我们使用 apt-get 对其进行安装,以方便安装其他的第三方模块:
sudo apt-get install python-pip3
在安装好 Python 的包管理工具——pip 3 之后,我们就可以快速地按照 Django 模块了:
pip3 install django
接着安装用于处理图片验证码的 Pillow 模块:
pip3 install Pillow
安装好两个模块之后,就可以来处理我们的项目文件了。
将项目文件上传到虚拟机
在上一小节介绍了可以通过 Xftp 进入到文件传输界面进行文件的上传和下载,在这里,我们就借助这个功能将项目文件上传全部到虚拟机上,以进行测试和部署,如下图所示:
在项目文件全部上传到虚拟机之后,我们进入到项目目录,运行 Django 的测试服务器,看看网站运行是否正常:
python3 manage.py runserver 0.0.0.0:8000
启动之后,我们在本机浏览器访问虚拟机的地址,最后出现的网页和在本地计算机运行的网页是一样的,如下图所示:
这说明 Django 项目在 Ubuntu 上也是测试运行成功的。
如果出现静态文件 404
如果项目运行之后,很多图片和视频不显示,打开发现这个文件都报 404 的错误,那么可能是文件名编码导致的。
在 Windows 下,中文文件名基本上都是 gb2312 编码格式,而 Ubuntu 上默认为 UTF-8 编码格式,所以如果遇到这种情况,我们需要将文件名的编码转换为 UTF-8:
首先,安装 Convmv 工具:
sudo apt-get install convmv
安装完成之后,运行如下命令:
convmv -f GB2312 -t UTF-8 -r --notest /home/ubuntu/videolearn/
其中,/home/ubuntu/videolearn/ 是 Django 项目的文件夹路径,按照自己的项目位置进行改动。
这样运行之后,就不会出现中文文件报 404 错误了。
三、安装 Uwsgi
在上一节 Django 网站在 Ubuntu 虚拟机上测试运行成功,但是我们却不可能使用 Django 自带的测试服务器来运行我们的网站,因为其性能实在是太差了。
在此选用 Uwsgi 作为 Django 项目运行的服务器。
安装 Uwsgi
首先,使用 pip 命令安装 Uwsgi:
pip3 install uwsgi
结果如下图所示
配置 Uwsgi 文件
Uwsgi 可以通过命令行进行启动 Web 应用也可以通过调用配置文件来启动 Web 应用,为了便于部署,我们使用配置文件。
首先我们在 videolearn 目录下新建一个名为video_uwsgi.ini
的文件,如下图所示:
然后打开文件,将一下代码写入进去:
# video_uwsgi.ini file
[uwsgi]
# Django-related settings
http = :8001
# the base directory (full path)
chdir = /home/ubuntu/videolearn
# Django s wsgi file
module = videolearn.wsgi
master = true
processes = 1
threads = 2
python-autoreload = 1
在上述代码中,我们通过:
- socket 参数指定了项目运行在 8000 端口上;
- chdir 参数指定了项目的位置;
- module 参数指定了项目的 wsgi 服务接口文件;
- processes 参数指定了为项目分配一个进程;
- threads 参数指定了为项目分配两个线程;
- python-autoreload 参数指定项目文件有改动时自动重启。
然后我们就可以使用 Uwsgi 命令来启动 Django 项目了,在终端运行以下代码:
uwsgi --ini /home/ubuntu/videolearn/video_uwsgi.ini
结果如下图所示:
Uwsgi 启动 Django 项目后,打开 http://192.168.56.102:8001/,也是访问正常的,如下图所示:
四、使用进程守护管理工具——Supervisor
在上一节中,使用 Uwsgi 命令直接通过 Uwsgi 配置文件来运行我们的网站。这在测试环节中是可行的,但是在正式的部署环节中却不能这样做,一方面之前的命令是显式地通过控制台来运行这个 Uwsgi 进程,一旦退出 Uwsgi 的控制台,相应的网站也就关闭了;另一方面如果隐式地在后台运行 Uwsgi,一旦我们的服务出现异常,导致网站启动或运行失败,我们也不能方便的对网站进行关闭或重启。
因此,需要一个能够守护 Uwsgi 进程的工具,用来管理 Uwsgi 进程,进而管理我们的网站运行。
在这里,我们使用 Python 下著名的 Linux/Unix 进程守护工具——Supervisor 来实现这一需求。
安装 Supervisor
因为 Supervisor 只支持 Python 2,而我们安装的 Ubuntu 16 中没有默认安装 Python 2 ,所以首先在 Ubuntu 中安装 Python 2 :
sudo apt-get install python-minimal
接着安装 Python 2 的 pip 工具:
sudo apt-get install python-pip
最后,使用 pip 安装 Supervisor:
sudo pip install supervisor
生成 Supervisord 配置文件
Supervisor 安装完成之后,默认是没有配置文件的,但是我们也不需要向 Uwsgi 一样自己创建配置文件。使用echo_supervisord_conf
命令就可以生成一个 Supervisor 的配置文件:
echo_supervisord_conf > /home/ubuntu/supervisord.conf
在此,我在 /home/ubuntu/ 路径下生成了一个名为 supervisord.conf 的配置文件。
添加程序信息到 Supervisord 配置文件中
Supervisor 配置文件中必须包含一个或多个 program 的配置信息,以便 Supervisor 知道应该启动和控制哪些程序,但是默认生成的 Supervisor 配置文件中并没有 program 的内容,我们需要按需自行添加。
打开 supervisord.conf 文件,在文件的最后添加以下语句并保存:
[program:video]
command=uwsgi --ini /home/ubuntu/videolearn/video_uwsgi.ini
directory=/home/ubuntu/videolearn
startsecs=0
stopwaitsecs=0
autostart=true
autorestart=true
其中,
- 第一行表示设置一个名为 video 的 program,可以通过这个名称来控制这个 program;
- 第二行表示程序运行的命令,在这里我们设置的是 Uwsgi 通过 Uwsgi 配置文件启动 Django 项目的命令;
- 第三行表示程序的目录;
- 第四行表示程序在启动后需要保持的秒数,设置为 0 表示不需要保持;
- 第五行表示在指示程序停止运行后,需要等待的秒数,设置为 0 表示不需要等待;
- 第六行表示当 Supervisord 启动时,该程序自动启动;
- 第七行表示当 Supervisord 为运行状态时,程序自动重启。
运行 Supervisor
在编写好 supervisord.cof 配置文件后,我们就可以通过 Supervisor 来管理通过 Uwsgi 启动的 Django 项目了。
首先,通过 supervisord 命令启动 Supervisor:
sudo supervisord
出现下面的提示,表示启动成功,如下图所示:
然后再通过 supervisorctl 调用配置文件启动程序:
sudo supervisorctl -c /home/ubuntu/supervisord.conf
出现如下图所示内容,表示程序运行成功:
我们打开网站,也是正常显示状态。
同时,还有更多的命令选项 supervisorctl 供我们使用,比如:
查看程序状态:
sudo supervisorctl -c /home/ubuntu/supervisord.conf status
其会显示 supervisord.conf 中所有程序的状态,如下图所示:
重启程序
sudo supervisorctl -c /home/ubuntu/supervisord.conf restart video
使用 restart 选项后接程序名,也可以使用 restart all 重启所有程序,如下图所示:
停止程序:
sudo supervisorctl -c /home/ubuntu/supervisord.conf stop video
使用 stop 后接程序名,也可以使用 stop all 停止所有程序,如下图所示:
五、使用 Nginx
如果我们的机器上只有一个服务,那么到上一节止,Django 项目的部署就完成了。
但是如果我们的机器上部署了多个 Web 服务,每个 Web 服务都需要使用 80 端口;或者我们的 Web 服务需要进行负载均衡等功能的配置,那么就还需要使用到反向代理服务器 Nginx。
在此,我们使用 Nginx 的端口代理转发功能,来简单介绍 Nginx 的使用。
安装 Nginx
首先,使用 apt 工具在 Ubuntu 虚拟机中安装上 Nginx:
sudo apt-get install nginx
启动 Nginx
Nginx 安装完成之后,就可以通过 service 命令进行启动了:
sudo service nginx start
如果启动成功,不会有任何提示,这时候,我们可以在浏览器输入虚拟机的 IP 地址进行访问,可以看到默认的 Nginx 欢迎页面,如下图所示:
这说明 Nginx 运行成功了。
创建 uwsgi_params
在设置 Nginx 之前,我们先在 Django 项目的 manage.py 同级目录下创建一个名为uwsgi_params
文件,文件的内容为:
uwsgi_param QUERY_STRING $query_string;
uwsgi_param REQUEST_METHOD $request_method;
uwsgi_param CONTENT_TYPE $content_type;
uwsgi_param CONTENT_LENGTH $content_length;
uwsgi_param REQUEST_URI $request_uri;
uwsgi_param PATH_INFO $document_uri;
uwsgi_param DOCUMENT_ROOT $document_root;
uwsgi_param SERVER_PROTOCOL $server_protocol;
uwsgi_param REQUEST_SCHEME $scheme;
uwsgi_param HTTPS $https if_not_empty;
uwsgi_param REMOTE_ADDR $remote_addr;
uwsgi_param REMOTE_PORT $remote_port;
uwsgi_param SERVER_PORT $server_port;
uwsgi_param SERVER_NAME $server_name;
这个文件的作用在于 Nginx 可以匹配uwsgi_params
文件中的变量名,将接受到的相关请求交由 Uwsgi 来处理。
创建站点的 Nginx 配置文件
为了便利管理,我们不在 Nginx 默认的站点配置文件中添加站点的配置信息,而是在 manage.py 文件同级目录下新建一个名为video_nginx.conf
的 Nginx 配置文件,将以下配置信息写入文件中:
server {
listen 80 ;
server_name localhost;
charset UTF-8;
access_log /var/log/nginx/myweb_access.log;
error_log /var/log/nginx/myweb_error.log;
client_max_body_size 75M;
location / {
include /home/ubuntu/videolearn/uwsgi_params;
uwsgi_pass 127.0.0.1:8001;
uwsgi_read_timeout 60;
}
location /static {
expires 30d;
autoindex on;
add_header Cache-Control private;
alias /home/ubuntu/videolearn/static;
}
location /media {
alias /home/ubuntu/videolearn/media;
}
}
将站点 Nginx 配置文件链接到 Nginx 服务中
video_nginx.conf
文件编辑好之后,我们将这个文件通过软链接的形式添加到 Nginx 的 sites-enables 目录下,在命令行中运行一下命令:
sudo ln -s /home/ubuntu/videolearn/video_nginx.conf /etc/nginx/sites-enabled/video_nginx.conf
如此一来,Nginx 的启用的站点就有两个了:默认的欢迎页面和 Django 站点。
我们将默认的欢迎页面删除,进入到 Nginx 的 sites-enabled 路径下:
cd /etc/nginx/sites-enabled/
然后使用 rm 命令删除默认站点:
sudo rm -f default
修改 Uwsgi 配置文件
之前为了方便运行,我们的 Uwsgi 配置文件中是直接使用 Http 的方式指定端口进行运行的,但是如果使用 Nginx 进行代理转发,就得修改一下。将video_uwsgi.ini
文件中的:
http = :8001
修改为:
socket = :8001
完成这一步,再重启 Supervisor 中的 Video 应用和 Nginx 服务:
sudo supervisorctl -c /home/ubuntu/supervisord.conf restart video
sudo service nginx restart
刷新刚刚的页面,可以发现页面呈现的就是我们的 Django 网站了,如下图所示:
这样,我们的网站就完成了 Uwsgi + Nginx 的部署,并借助supervisor实现了进程守护。
文章版权所有:州的先生博客,转载必须保留出处及原文链接