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配置完毕。

你可能感兴趣的:(2020-11-25 uwsgi托管django项目)