Ubuntu+uWSGI+Nginx+supervisor实战部署Django应用

本文来自于州的先生在线教程《七天实战入门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实现了进程守护。

猜你也喜欢

发表评论

电子邮件地址不会被公开。