基于Nginx 和 uwsgi 搭建 Django部署上线环境

实现原理图:


原理图

环境:阿里云 ECS CentOS 7.2 64位
安装:

  • python3
  • python虚拟环境
  • django
  • uwsgi
  • nginx

安装Python3

不动现有的Python2环境安装Python3
下载Python3

wget https://www.python.org/ftp/python/3.6.1/Python-3.6.1.tgz

解压Python3

tar -zxvf Python-3.6.1.tgz

进入目录

cd Python-3.6.1

安装到指定目录(本次指定路径/usr/local/python3
新建文件夹

mkdir -p /usr/local/python3

配置安装路径

./configure --prefix=/usr/local/python3

编译

make

安装

make install

环境配置,让python3命令即输即用
建立python3的软链

ln -s /usr/local/python3/bin/python3 /usr/bin/python3

并将/usr/local/python3/bin加入PATH:

vim ~/.bash_profile

配置环境变量

修改完毕,执行命令,让修改生效:

source ~/.bash_profile

检查Python3是否安装成功:

python3 -V

安装Python3虚拟环境

为啥要安装虚拟环境:

在一个 Python 环境下开发时间越久、安装依赖越多,就越容易出现依赖包冲突的问题。为了解决这个问题,开发者们开发出了 virtualenv,可以搭建虚拟且独立的 Python 环境。这样就可以使每个项目环境与其他项目独立开来,保持环境的干净,解决包冲突问题。

安装 virtualenv,执行命令即可:

pip3 install virtualenv

创建项目的虚拟环境:

virtualenv venv(虚拟环境名称)

执行后,在本地会生成一个与虚拟环境同名的文件夹,包含 Python 可执行文件和 pip 库的拷贝,可用于安装其他包。默认情况下,虚拟环境中不会包含也无法使用系统环境的global site-packages。比如系统环境里安装了 requests 模块,在虚拟环境里import requests会提示ImportError。如果想使用系统环境的第三方软件包,可以在创建虚拟环境时使用参数–system-site-packages

可以自己指定虚拟环境所使用的 Python 版本,前提系统中已经安装了该版本:

virtualenv -p /usr/bin/python2.7 venv

使用虚拟环境
进入虚拟环境目录,启动虚拟环境。

source venv/bin/activate

看到(venv)表示已经进入虚拟环境。

虚拟环境标识

退出虚拟环境:

deactivate

如果项目开发完成后想删除虚拟环境,直接删除虚拟环境目录即可。

安装Django

在虚拟环境中执行命令即可:

pip install django

本次重点介绍Django如何上线部署,Django相关知识不做具体介绍。
新建Django项目:

django-admin startproject 项目名

安装uwsgi

在虚拟环境中执行命令即可:

pip install uwsgi

现在重点来啦,上面那么多都只是基本的环境配置。下面的是知识点,部分也是难点,笔者在这个地方被困了很久,所以一定要弄得时候写个博文记录下来。

配置uwsgi

当前目录下创建test.py文件

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World" #国际惯例,helloworld

运行代码:

uwsgi --http :9111 --wsgi-file test.py

报错:

-bash: uwsgi: command not found

遇到这个情况怎么办?肯定不能放弃,干就行啦。
通过pip安装的组件,执行命令文件在python源目录下的bin目录中,所以解决方案:
执行命令:

ln -s /your-python-dir/bin/* /usr/bin/*

*代表你你需要添加的执行命令uwsgi,故障排除,然后继续执行:

uwsgi --http 0:8000 --wsgi-file test.py

成功后提示:

*** Starting uWSGI 2.0.17.1 (64bit) on [Fri Nov 23 12:12:30 2018] ***
compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-28) on 22 November 2018 09:21:34
os: Linux-3.10.0-514.26.2.el7.x86_64 #1 SMP Tue Jul 4 15:04:05 UTC 2017
nodename: iZhp31ku43vn2fbp1dk355Z
machine: x86_64
clock source: unix
pcre jit disabled
detected number of CPU cores: 1
current working directory: /home/ruanfumin
detected binary path: /usr/local/python3/bin/uwsgi
*** WARNING: you are running uWSGI without its master process manager ***
your processes number limit is 1880
your memory page size is 4096 bytes
detected max file descriptor number: 65535
lock engine: pthread robust mutexes
thunder lock: disabled (you can enable it with --thunder-lock)
uWSGI http bound on 0:8000 fd 4
spawned uWSGI http 1 (pid: 11058)
uwsgi socket 0 bound to TCP address 127.0.0.1:34451 (port auto-assigned) fd 3
Python version: 3.6.1 (default, Nov 22 2018, 17:05:27)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-28)]
*** Python threads support is disabled. You can enable it with --enable-threads ***
Python main interpreter initialized at 0xaa2120
your server socket listen backlog is limited to 100 connections
your mercy for graceful operations on workers is 60 seconds
mapped 72920 bytes (71 KB) for 1 cores
*** Operational MODE: single process ***
WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0xaa2120 pid: 11057 (default app)
*** uWSGI is running in multiple interpreter mode ***
spawned uWSGI worker 1 (and the only) (pid: 11057, cores: 1)

访问一下IP地址,本机就是127.0.0.1:8000,服务器就是服务器ip:8000
浏览器看到:
Hello World
终端会提示:

[pid: 11057|app: 0|req: 1/1] 183.206.12.47 () {42 vars in 829 bytes} [Fri Nov 23 12:13:17 2018] GET / => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)

表明uwsgi配置ok,咱继续

直接使用Django跑一下项目,看能不能运行成功,由于Django是在阿里云服务器上,所以项目设置文件settings.py需要修改一下。

ALLOWED_HOSTS = ['*']

酱紫就可以访问了。咱跑一下试试:

python manage.py runserver 0:8000

Django成功运行

使用Uwsgi 跑 django项目

在项目(新建的测试项目testproject)路径下,执行:

uwsgi --http 0:8000 --module testproject.wsgi

解释:
--http 0:8000携带这个参数表明可以http访问,端口号是8000。
--module testproject.wsgi指定Django项目的wsgi文件。
参考Django官方文档:

uwsgi --chdir=/path/to/your/project \
    --module=mysite.wsgi:application \
    --env DJANGO_SETTINGS_MODULE=mysite.settings \
    --master --pidfile=/tmp/project-master.pid \
    --socket=127.0.0.1:49152 \      # can also be a file
    --processes=5 \                 # number of worker processes
    --uid=1000 --gid=2000 \         # if root, uwsgi can drop privileges
    --harakiri=20 \                 # respawn processes taking more than 20 seconds
    --max-requests=5000 \           # respawn processes after serving 5000 requests
    --vacuum \                      # clear environment on exit
    --home=/path/to/virtual/env \   # optional path to a virtualenv
    --daemonize=/var/log/uwsgi/yourproject.log      # background the process

再次访问:http://39.104.91.28:8000/
发现还是成功辣,真好。

终端显示图

在项目目录下新建uwsgi.ini文件,可以参考官方文档

[uwsgi]
#chidr用于指定自己的网站根目录(自行更改)
chdir =  /var/www/testproject
#module指定网站中APP的文件(自行更改)
module = testproject.wsgi
#home用于指定python的虚拟环境,即我们最初创建的虚拟环境位置(自行更改)
home = /var/www/venv
#master不用更改
master = true
#socket用于指定端口号,可以不更改
socket = :8000
#以下两个可以不用更改
chmod-socket = 666

文件里我们指定socket,让Nginx服务器通过这个socket处理uwsgi。

Nginx安装:
这个不细说了,直接yum命令就好:

yum install nginx

Nginx配置修改

进入Nginx配置目录,在/etc/nginx/下:

Nginx配置目录

我们修改nginx.conf文件:

upstream django_test { #加上_test,因为和原来的冲突了,这里备注下
    # server unix:///path/to/your/mysite/mysite.sock; # for a file socket
    server 127.0.0.1:8000; # for a web port socket (we'll use this first) 类似uwsgi端口
}

    server {
        listen       80;
        server_name  ruanfumin;


        location / {
            include uwsgi_params;
            uwsgi_pass django_test;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
        location /static {
        alias /var/www/first/static; # 加载你的静态文件
    }

    }

修改完,保存,重启Nginx服务器,然后再到Django项目目录下启动uwsgi服务:

uwsgi --ini uwsgi.ini

浏览器输入url访问:39.104.91.28:80
当然这次是80端口访问了,因为Nginx我们设置的嘛,你可以随意修改。

80端口访问成功图

注:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343