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

栏目: Python · 发布时间: 5年前

内容简介:本文来自于州的先生在线教程《七天实战入门Django》第七天的课程,更多原创在线教程点击此处进行学习:州的先生在线教程在本地机器上完成Django项目的开发之后,我们就需要将其部署到服务器上。今天我们就来学习一下如何将 Django 网站部署在 Ubuntu 服务器上。

本文来自于州的先生在线教程《七天实战入门Django》第七天的课程,更多原创在线教程点击此处进行学习:州的先生在线教程

在本地机器上完成Django项目的开发之后,我们就需要将其部署到服务器上。

今天我们就来学习一下如何将 Django 网站部署在 Ubuntu 服务器上。

考虑到很多人没有云服务或者是本地服务器,在此我们在本地计算机通过 VirtualBox 安装 Ubuntu 虚拟机来模拟实现一个远程服务器。

文章目录

  • 一、安装 Ubuntu 虚拟机
  • 二、安装基本软件和服务
    • 安装 Ubuntu 的 SSH 服务
    • 使用 Xshell 连接虚拟机
    • 安装 Python 和 Django
    • 将项目文件上传到虚拟机
  • 四、使用进程守护管理工具——Supervisor
    • 生成 Supervisord 配置文件
    • 添加程序信息到 Supervisord 配置文件中

一、安装 Ubuntu 虚拟机

将 VirtualBox 安装好之后,从 163 的开源镜像站上下载 Ubuntu 16.04 的服务器版本 iOS 镜像文件,如下图所示:

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

下载完成之后,打开 VirtualBox 软件,新建一个虚拟机,如下图所示:

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

新建完成之后,在虚拟机的设置中添加下载好的 iOS 镜像文件,如下图所示:

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

然后启动虚拟机,如下图所示:

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

选择第一项进行 Ubuntu 的安装,接下来根据提示选择和等待安装完成,如下图所示:

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

设置主机名,如下图所示:

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

设置用户名,如下图所示:

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

设置用户密码,如下图所示:

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

等待安装完成,如下图所示:

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

安装完成,如下图所示:

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

重启之后,我们的 Ubuntu 就启动了,如下图所示:

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

输入用户名和密码就进入了系统界面,如下图所示:

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

二、安装基本软件和服务

为了便于本地与虚拟机之间的通信,我们使用 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

结果显示,如下图所示:

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

我们就可以使用这个 IP 地址通过 Xshell 来连接 Ubuntu 虚拟机。

使用 Xshell 连接虚拟机

打开 Xshell 软件,新建一个连接,选择 SSH 协议,主机填写为虚拟机的 IP 地址,端口号填写为 22,如下图所示:

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

然后切换到用户身份验证栏,填写虚拟机的用户名和密码,如下图所示:

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

确认之后,单击连接,就可以通过 SSH 连接上虚拟机,如下图所示:

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

同时可以单击菜单栏的 Xftp 按钮进入到文件传输界面,如下图所示:

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

安装 Python 和 Django

在 Ubuntu 16 这个版本中,默认集成了 Python 3.5 的环境,在终端输入“python3”,可以进入到 Python 3 的 Shell 中,如下图所示:

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

但是我们发现,Python 下便捷的包管理工具 pip 并没有自带安装,如下图所示:

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

所以我们使用 apt-get 对其进行安装,以方便安装其他的第三方模块:

sudo apt-get install python-pip3

在安装好 Python 的包管理工具——pip 3 之后,我们就可以快速地按照 Django 模块了:

pip3 install django

接着安装用于处理图片验证码的 Pillow 模块:

pip3 install Pillow

安装好两个模块之后,就可以来处理我们的项目文件了。

将项目文件上传到虚拟机

在上一小节介绍了可以通过 Xftp 进入到文件传输界面进行文件的上传和下载,在这里,我们就借助这个功能将项目文件上传全部到虚拟机上,以进行测试和部署,如下图所示:

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

在项目文件全部上传到虚拟机之后,我们进入到项目目录,运行 Django 的测试服务器,看看网站运行是否正常:

python3 manage.py runserver 0.0.0.0:8000

启动之后,我们在本机浏览器访问虚拟机的地址,最后出现的网页和在本地计算机运行的网页是一样的,如下图所示:

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

这说明 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

结果如下图所示

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

配置 Uwsgi 文件

Uwsgi 可以通过命令行进行启动 Web 应用也可以通过调用配置文件来启动 Web 应用,为了便于部署,我们使用配置文件。

首先我们在 videolearn 目录下新建一个名为 video_uwsgi.ini 的文件,如下图所示:

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

然后打开文件,将一下代码写入进去:

# 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

结果如下图所示:

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

Uwsgi 启动 Django 项目后,打开 http://192.168.56.102:8001/,也是访问正常的,如下图所示:

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

四、使用进程守护管理工具——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

出现下面的提示,表示启动成功,如下图所示:

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

然后再通过 supervisorctl 调用配置文件启动程序:

sudo supervisorctl -c /home/ubuntu/supervisord.conf

出现如下图所示内容,表示程序运行成功:

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

我们打开网站,也是正常显示状态。

同时,还有更多的命令选项 supervisorctl 供我们使用,比如:

查看程序状态:

sudo supervisorctl -c /home/ubuntu/supervisord.conf status

其会显示 supervisord.conf 中所有程序的状态,如下图所示:

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

重启程序

sudo supervisorctl -c /home/ubuntu/supervisord.conf restart video

使用 restart 选项后接程序名,也可以使用 restart all 重启所有程序,如下图所示:

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

停止程序:

sudo supervisorctl -c /home/ubuntu/supervisord.conf stop video

使用 stop 后接程序名,也可以使用 stop all 停止所有程序,如下图所示:

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

五、使用 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 欢迎页面,如下图所示:

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

这说明 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 网站了,如下图所示:

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

这样,我们的网站就完成了 Uwsgi + Nginx 的部署,并借助supervisor实现了进程守护。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

高效前端:Web高效编程与优化实践

高效前端:Web高效编程与优化实践

李银城 著 / 机械工业出版社 / 2018-3-15 / 89.00元

这不是一本单纯讲解前端编程技巧的书,而是一本注重思想提升和内功修炼的书。 全书以问题为导向,精选了前端开发中的34个疑难问题,从分析问题的原因入手,逐步给出解决方案,并分析各种方案的优劣,最后针对每个问题总结出高效编程的最佳实践和各种性能优化的方法。 全书共7章,内容从逻辑上大致可以分为两大类: 第一类,偏向实践,围绕HTML、CSS、JavaScript等传统前端技术,以及PW......一起来看看 《高效前端:Web高效编程与优化实践》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具