天天看点

【2019.05】Django在Ubuntu上部署 | Django+uWSGI+Nginx详细部署实例目录环境和准备配置项目路径和virtualenv虚拟运行环境配置Nginx配置uWSGI服务

引子:

需要将Django部署在服务器上,为微信小程序提供后台支持。虽然有着大量教程,但是其中给的配置文件的详细内容很模

糊。我比照着官方文档和多个教程才搞清楚所有流程。

目录

环境和准备

准备

环境

pip3 

virtualenv

 uWSGI

Nginx

配置项目路径和virtualenv虚拟运行环境

确定你Django项目放在哪

新建一个Python虚拟环境

配置Nginx

新建Nginx配置文件目录以及Nginx配置文件

创建配置文件目录

在deploy下创建 mysite_nginx.conf

在deploy下创建 uwsgi_params

应用Nginx配置文件(mysite_nginx.conf)

配置uWSGI服务

测试uWSGI是否可用

编辑关于Django项目(lsdemo)的uWSGI配置

最后,部署上线

环境和准备

准备

  • 一个可用的、简单的Django项目,如"Hello World!",最后用于测试环境是否搭建成功
  • 一个testuwsgi.py文件,用于测试uWSGI服务是否搭建好,文件内容在后面给出

环境

我使用的是阿里云轻量级服务器,系统是 Ubuntu16.04 x64

使用默认的Python3,版本是3.5.2

(由于使用Django2.0的原因,Python版本最低不要小于3.5.0)

首先,习惯性地对新服务器的包管理器进行更新

apt-get update
apt-get upgrade           

 如有需要,请在以下所有命令前加上 'sudo' 使用超级管理员权限运行  

pip3 

手动安装了pip3,命令如下:

apt-get install python3-pip           

virtualenv

# 使用pip3安装可以使得virtualenv创建环境时使用Python 3.5.2作为基环境
pip3 install virtualenv
# 查看是否已经安装好
pip3 list           

 uWSGI

pip3 install uwsgi           

Nginx

apt-get install nginx
# 这个时候访问服务器的IP地址会出现Nginx的欢迎界面,说明安装正常           

配置项目路径和virtualenv虚拟运行环境

确定你Django项目放在哪

首先大体看一下我的文件目录

/root/ls
        |--project
        |    |
        |    |--lsdemo                       # 项目文件夹
        |    |
        |    |--venv                         # 运行用python虚拟环境
        |
        |--deploy                            # 配置文件用文件夹
            |
            |--mysite_nginx.conf             # Nginx配置文件
            |
            |--uwsgi_params                  # Nginx关于配置Django用的参数文件
            |
            |--mysite_uwsgi                  # uwsgi关于Django的配置文件           

在你喜欢的、并且有足够操作权限的位置(像是~/、/var/www/),新建一个文件夹,并赋予权限

在下面,我会统一称之为工作目录

例如:

我的工作目录叫 ls

我的Django项目叫做 lsdemo

我的lsdemo将会放在 /root/ls/project/ 下

# 例如在/root下创建ls文件夹
# 接下来所有的配置文件和项目我都将会放在这个文件夹下进行演示
# 如果需要更改为其他目录,请务必自行配置好相应的配置文件中的路径
cd /root
mkdir ls
sudo chmod 777 /root/ls           

新建一个Python虚拟环境

cd /root/ls
# 创建一个project文件夹用于存放Django项目和虚拟的Python运行环境
mkdir project
cd project
# 新建一个虚拟环境venv
virtualenv venv           

配置Nginx

新建Nginx配置文件目录以及Nginx配置文件

创建配置文件目录

在工作目录中,新建一个deploy文件夹,用于存放Nginx的配置文件

cd /root/ls
mkdir deploy
cd deploy           

在deploy下创建 mysite_nginx.conf

首先是 mysite_nginx.conf

# 首先创建Nginx配置文件
touch mysite_nginx.conf

# 编辑mysite_nginx.conf文件
vim mysite_nginx.conf           

mysite_nginx.conf  文件内容:

# mysite_nginx.conf

events {
    worker_connections 1024;
}

http{

    # the upstream component nginx needs to connect to
    upstream django {
        # 监听内部地址 127.0.0.1:8080
        # 通过这个监听设置来对应uWSGI部署的8080端口
        server 127.0.0.1:8080;
    }

    # configuration of the server
    server {
        # http的监听端口,默认用80
        listen      80;
        # 普通填写localhost,如果需要使用域名,并已经将域名解析到该服务器,一定要重新填写为相应域名,并重载Nginx配置
        server_name localhost;
        charset     utf-8;

        # 使用默认值就好
        client_max_body_size 75M;   # adjust to taste

        # Django的media目录,根据实际的项目名称和目录进行设置,以我的为例
        location /media  {
            alias /root/ls/project/lsdemo/media;
        }

        location /static {
            alias /root/ls/project/lsdemo/static;
        }

        # Finally, send all non-media requests to the Django server.
        location / {
            uwsgi_pass  django;
            # 加载另一个所需要的Nginx关于Django的配置文件
            include     /root/ls/deploy/uwsgi_params;
        }
    }
}           

在deploy下创建 uwsgi_params

其次是 uwsgi_params

(没有后缀名,这个文件是官方给出的,注意与上个配置文件中所写配置的路径一致)

# 创建Nginx关于Django的配置文件
touch uwsgi_params

# 编辑uwsgi_params文件
vim uwsgi_params           

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配置文件(mysite_nginx.conf)

# 停止Nginx服务
/etc/init.d/nginx stop

# 使用自己的配置启动Nginx
sudo nginx -c /root/ls/deploy/mysite_nginx.conf

# 这个时候访问服务器IP地址,会出现502页面,说明配置生效
# 如果没有出现502 你应该检查你的配置,继续出现欢迎界面可不是个好兆头
# 出现502错误是因为我们还没有将Django通过uWSGI将访问地址映射到相应的端口,即Django还未部署           

配置uWSGI服务

测试uWSGI是否可用

在 /root/ls/project 下新建一个testuwsgi.py文件

# 创建testuwsgi.py,用于测试uWSGI服务
touch testuwsgi.py

# 编辑uwsgi_params文件
vim testuwsgi.py           

testuwsgi.py 内容如下: 

# testuwsgi.py
def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return [b"Hello World"] # python3
    #return ["Hello World"] # python2           

测试是否可以正常访问

uwsgi --http :8000 --wsgi-file /root/ls/project/testuwsgi.py           

访问 [服务器外网ip:8000]

显示 Hello World则是可以正常使用uWSGI服务

编辑关于Django项目(lsdemo)的uWSGI配置

首先在 /root/ls/deploy 下新建一个配置文件

cd /root/ls/deploy
touch mysite_uwsgi.ini           

编辑 mysite_uwsgi.ini文件,内容如下:

# mysite_uwsgi.ini file
[uwsgi]

# Django-related settings
# 填写Django项目的绝对路径
chdir           = /root/ls/project/lsdemo
# [Django项目名].wsgi
module          = lsdemo.wsgi
# 使用的虚拟运行环境的绝对路径
home            = /root/ls/project/venv

# process-related settings
# master 默认设置
master          = true
# 最大进程数,小项目推荐4个
processes       = 4
# the socket (use the full path to be safe
# socket          = /path/to/your/project/mysite.sock
# socket的端口填写一定要对应着Nginx配置文件中在内部环境中监听的端口,即127.0.0.1:8080 8080端口
socket = :8080
# ... with appropriate permissions - may be needed
# chmod-socket    = 664
# clear environment on exit
vacuum          = true           

准备好你的Django项目(我的lsdemo已经准备好在相应目录了)

最后,部署上线

记得所有配置文件准备好后,重载一下Nginx配置文件

uwsgi --ini /root/ls/deploy/mysite_uwsgi.ini           

参考文献:

https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/tutorials/Django_and_nginx.html

https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/Nginx.html

https://blog.csdn.net/weixin_39198406/article/details/79277580

https://blog.csdn.net/qq_41500222/article/details/82263239

https://www.cnblogs.com/qingspace/p/6838747.html

https://github.com/nginx/nginx/blob/master/conf/uwsgi_params

继续阅读