前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ubuntu Django + Uwsgi + Nginx 的生产环境部署

ubuntu Django + Uwsgi + Nginx 的生产环境部署

作者头像
py3study
发布2020-03-03 10:27:42
2.6K0
发布2020-03-03 10:27:42
举报
文章被收录于专栏:python3python3

一、概述

使用runserver可以使我们的django项目很便捷的在本地运行起来,但这只能在局域网内访问,如果在生产环境部署django,就要多考虑一些问题了。比如静态文件处理,安全,效率等等,本篇文章总结归纳了一下基于uwsgi+Nginx下django项目生产环境的部署

uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作用是与uWSGI服务器进行交换。

要注意 WSGI / uwsgi / uWSGI 这三个概念的区分。

  • WSGI是一种通信协议。
  • uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
  • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

uwsgi协议是一个uWSGI服务器自有的协议,它用于定义传输信息的类型(type of information),每一个uwsgi packet前4byte为传输信息类型描述,它与WSGI相比是两样东西。

准备条件

默认ubuntu已经有了python3,但是pip没有安装。

代码语言:javascript
复制
apt-get install -y python3-pip

安装虚拟环境

代码语言:javascript
复制
pip3 install virtualenv

创建虚拟环境

代码语言:javascript
复制
sudo mkdir /virtualenvs
cd /virtualenvs
sudo /usr/local/bin/virtualenv -p /usr/bin/python3 --no-site-packages venv

安装django

代码语言:javascript
复制
/virtualenvs/venv/bin/pip3 install django

二、运行django项目

创建django项目

代码语言:javascript
复制
root@ubuntu:~# mkdir /www
root@ubuntu:~# cd /www/
root@ubuntu:/www# /virtualenvs/venv/bin/django-admin startproject mysite1
root@ubuntu:/www# cd mysite1/
root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/python manage.py startapp blog
root@ubuntu:/www/mysite1# mkdir static

编辑配置文件

代码语言:javascript
复制
root@ubuntu:/www/mysite1# vim mysite1/settings.py

允许监听所有IP,注意:'*'必须用引号包起来

代码语言:javascript
复制
ALLOWED_HOSTS = ['*']

原生启动方式

代码语言:javascript
复制
/virtualenvs/venv/bin/python manage.py runserver 0.0.0.0:8000

访问页面

http://192.168.10.104:8000/

效果如下:

三、基于uwsgi+django的实现

安装uwsgi

代码语言:javascript
复制
/virtualenvs/venv/bin/pip3 install uwsgi

使用命令启动uwsgi

先关闭上面启动的Django项目,使用Ctrl+c,就可以取消。

第一步:进入django项目

代码语言:javascript
复制
cd /www/mysite1/

第二步:命令测试启动

代码语言:javascript
复制
/virtualenvs/venv/bin/uwsgi --http 0.0.0.0:8000 --file mysite1/wsgi.py --static-map=/static=static

参数说明:

--http 这个就和runserver一样指定IP 端口

--file 这个文件就里有一个反射,如果你在调用他的时候没有指定Web Server就使用默认的

    注意:mysite1是一个相对路径。--file它的绝对路径是/www/mysite1/mysite1/wsgi.py

--static 做一个映射,指定静态文件。

此时,访问http://192.168.10.104:8000/

如果访问正常,表示项目启动成功

uwsgi配置文件

使用Ctrl+c,取消uwsgi启动。

第一步:在django项目同级目录创建uwsgi目录,用于存放相关文件

代码语言:javascript
复制
cd /www/mysite1mkdir uwsgi

项目结构如下:

代码语言:javascript
复制
mysite1/
├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── mysite1
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── uwsgi
└── static

第二步:进入script目录,创建一个uwsgi.ini文件

代码语言:javascript
复制
cd /www/mysite1/uwsgi
vim uwsgi.ini

编辑uwsgi.ini文件内容如下:

代码语言:javascript
复制
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /www/mysite1
# Django's wsgi file
module          = mysite1.wsgi
# the virtualenv (full path)
home            = /virtualenvs/venv
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 1
# pid file
pidfile         = /www/mysite1/uwsgi/uwsgi.pid
# The address and port of the monitor
http            = :8000
# clear environment on exit
vacuum          = true
#The process runs in the background and types the log to the specified log file
daemonize       = /www/mysite1/uwsgi/uwsgi.log

注意几个很重要的参数

chdir 项目目录,写绝对路径

module Django的 wsgi 文件,表示mysite1/wsgi.py

home 虚拟环境目录,写绝对路径

daemonize 进程在后台运行,并将日志打到指定的日志文件

启动django项目

代码语言:javascript
复制
root@ubuntu:~# cd /www/mysite1/
root@ubuntu:/www/mysite1# /virtualenvs/venv/bin/uwsgi --ini uwsgi/uwsgi.ini 
[uWSGI] getting INI configuration from uwsgi/uwsgi.ini

查看文件

代码语言:javascript
复制
root@ubuntu:/www/mysite1# ll uwsgi/
总用量 20
drwxr-xr-x 2 root root 4096 8月  10 11:47 ./
drwxr-xr-x 6 root root 4096 8月  10 11:27 ../
-rw-r--r-- 1 root root  717 8月  10 11:41 uwsgi.ini
-rw-r----- 1 root root 2021 8月  10 11:47 uwsgi.log
-rw-rw-rw- 1 root root    6 8月  10 11:47 uwsgi.pid

刷新页面,查看访问是否正常。

uwsgi 常用的启动命令

代码语言:javascript
复制
uwsgi --ini uwsgi.ini # 启动
uwsgi --reload uwsgi.pid # 重启
uwsgi --stop uwsgi.pid # 关闭

四、Nginx代理uwsgi

安装nginx

代码语言:javascript
复制
apt-get install -y nginx

编辑配置文件

代码语言:javascript
复制
cd /etc/nginx/sites-enabled
vim mysite1.conf

内容如下:

代码语言:javascript
复制
server {
    listen 8000;
    server_name localhost;

    # 指定项目路径uwsgi
    location / {
        include uwsgi_params; # 导入一个Nginx模块他是用来和uWSGI进行通讯的
        uwsgi_connect_timeout 30; # 设置连接uWSGI超时时间
        uwsgi_pass unix:/www/mysite1/uwsgi/mysite1.sock; # 指定uwsgi的sock文件所有动态请求就会直接丢给他
    }

    # 指定静态文件路径
    location /static/ {
        alias /www/mysite1/static/;
    }

}

更改uwsgi配置

改为socket方式

代码语言:javascript
复制
cd /www/mysite1/uwsgi
vim uwsgi.ini

内容如下:

代码语言:javascript
复制
[uwsgi]

# Django-related settings
# the base directory (full path)
chdir           = /www/mysite1
# Django's wsgi file
module          = mysite1.wsgi
# the virtualenv (full path)
home            = /virtualenvs/venv
# process-related settings
# master
master          = true
# maximum number of worker processes
processes       = 1
# pid file
pidfile         = /www/mysite1/uwsgi/uwsgi.pid
# socket file path (full path)
socket          = /www/mysite1/uwsgi/mysite1.sock
# clear environment on exit
vacuum          = true
#The process runs in the background and types the log to the specified log file
daemonize       = /www/mysite1/uwsgi/uwsgi.log

重新加载uwsgi

代码语言:javascript
复制
/virtualenvs/venv/bin/uwsgi --reload uwsgi.pid

加载nginx配置文件

代码语言:javascript
复制
nginx -s reload

查看端口,8000已经为nginx接管了

代码语言:javascript
复制
root@ubuntu:/etc/nginx/sites-enabled# netstat -anpt|grep 8000
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      18895/nginx -g daem
tcp        0      0 192.168.10.102:8000     192.168.10.105:52556    ESTABLISHED 19135/nginx: worker
tcp        0      0 192.168.10.102:8000     192.168.10.105:52557    ESTABLISHED 19135/nginx: worker

刷新页面,效果同上!

进入目录 /www/mysite1/static ,放一张图片 girl.jpg

访问图片

代码语言:javascript
复制
http://192.168.10.102:8000/static/girl.jpg

效果如下:

本文参考链接:

https://cloud.tencent.com/developer/article/1176271

https://www.jianshu.com/p/07458e99198a

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
    • 准备条件
      • 安装虚拟环境
      • 安装django
  • 二、运行django项目
    • 创建django项目
      • 三、基于uwsgi+django的实现
        • 安装uwsgi
          • 使用命令启动uwsgi
            • uwsgi配置文件
              • 启动django项目
              • 四、Nginx代理uwsgi
                • 安装nginx
                  • 编辑配置文件
                    • 更改uwsgi配置
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档