2020-11-25 uwsgi托管django项目

这两天参加会务筹备耽误了进度,昨晚上花了3小时配置成功,趁热打铁把过程梳理一下。梳理思路时突然发现了一个悖论,一晚上的忙活其实只有一半有用,先把这个悖论写在最前面。

linux上的uwsgi是一个可执行程序,通过配置文件加载django应用。这和apache服务器的mod_wsgi不一样,mod_wsgi是apache的一个模块,由apache加载运行,并不独立于apache,而uwsgi是独立于nginx服务器的,nginx服务器只是通过反向代理转发指定端口的请求到uwsgi。既然uwsgi可以独立运行并监听端口,通过nginx再转发一道意义何在呢?对于把django作为后台纯粹提供rest api接口的架构而言,这一道转发确实多此一举。如果django不仅提供数据,也进行前端渲染和提供静态资源,那这一道转发就必不可少,因为uwsgi只适合处理动态请求,静态资源由nginx直接管理更合适。django的python manage.py collectstatic命令就是用来收集项目的静态资源,为uwsgi+nginx动静分离准备的。

好了,对于我而言,django仅仅用作动态数据接口,所有静态资源和前端渲染都交由vue框架完成,将vue部署到nginx就可以,无需通过nginx再配置一个端口用来转发请求给uwsgi。而有一种情况要与此区分,那就是vue向后台django发起的ajax请求属于跨域,需要通过nginx配置反向代理,将vue所在端口下的某个目录(如/api)转发到uwsgi端口。细品一下就可以发现这和前面所说的情况并不一样。关于如何配置vue的ajax代理转发,将在下一篇日志中再表。

下面进入主题,包括uwsgi安装、测试和配置运行,以及ubuntu的启动项管理。nginx安装、配置、反向代理和vue托管请等待下一篇日志。

安装uwsgi有两种方式,一种是用系统的apt包管理工具进行安装,sudo apt install uwsgi,这种方式安装的uwsgi还需要搭配uwsgi-plugin-python,不推荐这种方式。第二种是用pip3安装,若直接在python主环境下安装,则无法加载虚拟环境下django项目的依赖包,应该在项目所在的虚拟环境下pip3 install uwsgi,如果使用pycharm开发工具创建的虚拟环境,可直接在其terminal下手动安装,或者在pycharm的项目管理中搜索uwsgi并安装。pip3默认的境外源速度很慢,安装中途经常断开连接,可切换成国内清华大学的源,方法有三如下。

1. 可通过增加-i参数实现单次切换源,pip3 install xxxx -i https://pypi.tuna.tsinghua.edu.cn/simple/

2. 也可在~/.pip/pip.config中进行配置(无论pip或pip3),在主目录下新建这个隐藏的.pip文件夹,在该文件夹下新建pip.config文件,并写入[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple

3. 如果使用pycharm的项目管理来安装依赖包就简单了,在项目管理的python interpreter中点击+添加依赖包,在弹出的搜索列表最下方点击Manage Repositories按钮,将清华大学的pip源地址https://pypi.tuna.tsinghua.edu.cn/simple/粘贴进去即可。

安装好uwsgi就可以进行简单的测试,uwsgi相当于一个小型动态服务器,编写一段如下的python函数,保存为test.py,pycharm terminal中输入uwsgi --http :8000 --wsgi-file test.py回车,即可监听8000端口的http协议,并返回test.py中函数的处理结果。注意这里是--http,因为要通过浏览器进行访问测试,浏览器访问127.0.0.1::8000,可看到返回值“Hello World”。测试初步成功。

def application(env, start_response):

    start_response('200 OK', [('Content-Type', 'text/html')])

    return [b"Hello World"]

然后再测试uwsgi托管django项目(比刚才那个test.py函数更接近目的地一步)。在pycharm的terminal中按ctrl+C结束刚才的托管,释放8000端口。然后在terminal中输入如下命令。其中--http :8000指定监听8000端口http协议,--chdir参数切换路径到项目目录下(与manage.py同目录),--wsgi-file参数指定wsgi.py文件的位置,--stats参数指定了uwsgi启动后的状态监视页面。成功执行后可通过浏览器访问localhost:8000,django欢迎页面如约而至。也可访问localhost:9191,查看uwsgi的状态。

uwsgi --http :8000 --chdir /home/pucharmprojects/djangoproject/yoursite --wsgi-file yoursite/wsgi.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

这种手工输入一大堆参数启动的方式很不优雅,实际操作时是将参数写入配置文件,uwsgi可以通过配置文件启动。这也就是我们要达到的终极目的。在manage.py同目录下,新建一个uwsgi.ini配置文件(名字可随便取),将刚才的命令行参数写入配置文件中,如下所示。其中module参数需要解释一下,其等价于刚才命令行参数中的--wsgi-file,yoursite.wsgi的意思可以理解为yoursite/wsgi.py。其它还有很多参数可查看此处文档,是不是眼花缭乱,不看也罢,下面几个参数暂时够用了。这里有一个被注释掉的socket参数,我这里使用的http参数,uwsgi运行后可通过浏览器测试,对于提供ajax数据接口,配置成http就可以。若通过nginx配置socket转发指定端口报文时,则需要配置成socket才行(详细区别可参考此处链接)。

[uwsgi]

http  = :8888

#socket = :8888

chdir          =/home/pucharmprojects/djangoproject/yoursite

module          = yoursite.wsgi

master          = true

processes      = 4

threads        = 2

vacuum          = true

buffer-size = 65536

py-autoreload  = 1      # 触发重载 (只在开发测试时使用,正式部署后关闭重载,发挥缓存作用)

stats          = 127.0.0.1:9191

在pycharm的terminal中输入uwsgi --ini uwsgi.ini,浏览器访问localhost:8888,是不是看到django熟悉的欢迎页了。

下面配置uwsgi随系统启动。不要担心又是一堆控制台指令,可爱的ubuntu已经默认集成了启动项图形化管理工具(英文名是startup applicatons,如果系统加载了汉化包,名字是“启动应用程序”,别学我骑驴找马半天啊)。打开这个工具,添加一个启动项,命令框输入如下指令。

/home/你的账户/PycharmProjects/.../venv/bin/uwsgi --ini /home/你的账户/PycharmProjects/.../uwsgi.ini

这里的uwsgi是虚拟环境下安装的uwsgi,注意不要用主环境的uwsgi。--ini参数指定刚才编辑的配置文件。为了确保指令有效性,ctrl+alt+t打开系统终端,将你的这段指令复制粘贴到终端中执行一下,如果成功则开机启动也没问题。别忘了关闭刚才打开的端口,否则端口冲突。至此,django+uwsgi配置完毕。

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