<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <h4>一、介绍</h4>
讯享网
WSGI(Web Server Gateway Interface),翻译为Python web服务器网关接口,即Python的Web应用程序(如Flask)和Web服务器(如Nginx)之间的一种通信协议。也就是说,如果让你的Web应用在任何服务器上运行,就必须遵循这个协议。
那么实现WSGI协议的web服务器有哪些呢?就比如uWSGI与gunicorn。两者都可以作为Web服务器。可能你在许多地方看到的都是采用Nginx + uWSGI(或gunicorn)的部署方式。实际上,直接通过uWSGI或gunicorn直接部署也是可以让外网访问的,那你可能会说,那要Nginx何用?别急,那么接来下介绍另一个Web服务器——Nginx
Nginx作为一个高性能Web服务器,具有负载均衡、拦截静态请求、高并发…等等许多功能,你可能要问了,这些功能和使用Nginx + WSGI容器的部署方式有什么关系?
首先是负载均衡,如果你了解过OSI模型的话,其实负载均衡器就是该模型中4~7层交换机中的一种,它的作用是能够仅通过一个前端唯一的URL访问分发到后台的多个服务器,这对于并发量非常大的企业级Web站点非常有效。在实际应用中我们通常会让Nginx监听(绑定)80端口,通过多域名或者多个location分发到不同的后端应用。
其次是拦截静态请求,简单来说,Nginx会拦截到静态请求(静态文件,如图片),并交给自己处理。而动态请求内容将会通过WSGI容器交给Web应用处理;
Nginx还有其他很多的功能,这里便不一一介绍。那么前面说了,直接通过uWSGI或gunicorn也可以让外网访问到的,但是鉴于Nginx具有高性能、高并发、静态文件缓存、及以上两点、甚至还可以做到限流与访问控制,所以选择Nginx是很有必要的;
这里可以说明,如果你选择的架构是:Nginx + WSGI容器 + web应用,WSGI容器相当于一个中间件;如果选择的架构是uWSGI + web应用,WSGI容器则为一个web服务器
二、实际部署:
1. Nginx + uWSGI
1.1 配置uWSGI:
我们现在虚拟环境下安装好uWSGI:
讯享网
安装完成之后我们在项目的目录下(即你实际创建的Flask项目目录,在本文所指的项目目录都假设为/www/demo)创建以.ini为扩展名的配置文件。在设置与Nginx交互的时候有两种方式:
第一种是通过配置网络地址,第二种是通过本地的.socket文件进行通信。需要注意的是,不同的交互方式下,Nginx中的配置也会有所不同
如果采用的是第一种网络地址的方式,则将之前创建uwsgi.ini配置文件添加如下的配置内容:
这里的wsgi-file参数所指的run.py其实是启动文件,你也可以使用manage.py。不过我通常习惯创建一个这样的文件,可以直接运行该文件来启动项目:
讯享网
保存好配置文件后,就可以通过如下的命令来启动应用了:
如果你采用的是第二种本地socket文件的方式,则添加如下的配置内容:
讯享网
可以看到,其实与网络地址的配置方式只有socket参数的配置不同,在这里填写好路径名和文件名并启动uWSGI后,将会自动在改目录下生成nginx_uwsgi.socket文件,这个文件就是用来与Nginx交互的。
1.2 配置Nginx
首先我们来通过apt安装Nginx:
安装完成之后,我们cd到/etc/nginx/的目录下(可能由于不同系统导致不同的Nginx发行版缘故,目录有所差别,在此只针对Ubuntu中的发行版的Nginx),可以看到Nginx的所有配置文件。
其中nginx.conf文件为主配置文件,可以用来修改其全局配置;sites-available存放你的配置文件,但是在这里添加配置是不会应用到Nginx的配置当中,需要软连接到同目录下的sites-enabled当中。但是在我实际操作的过程中中,当我在sites-available修改好配置文件后,会自动更新到sites-enabled。如果没有的话,则需要像上述的操作那样,将修改好的配置文件软链接到sites-enabled当中
在上边说到,配置uWSGI有两种与Nginx交互的方式,那么选择不同的方式的话在Nginx的配置也会有所不同:
第一种:网络配置方式:
讯享网
在每次完Nginx配置文件内容后,需要通过如下的命令来重启Nginx:
第二种:socket文件方式:
与上边的配置内容大体相同,只是在配置uwsgi_pass不是反向代理给网络地址,而是通过socket文件进行交互,我们只需要指定之前设置的路径和文件名即可:
讯享网
2. Nginx + Gunicorn
2.1 配置Gunicorn:
首先先在虚拟环境下安装Gunicorn:
安装完成后,我们来创建以.py结尾的配置文件,这里我参考了Jiyuankai的GitHub关于Gunicorn的配置文件内容:
讯享网
需要注意的是要在配置文件的同层目录下创建log文件,否则运行gunicorn将报错。添加完配置内容并保存为gconfig.py文件后,我们就也可以通过gunicorn来运行Flask应用了:
2.2 配置Nginx:
和uWSGI的任意一种配置方法类似,只是在location中的配置有所不同:
讯享网
通过Gunicorn的Nginx配置中,我们只需要通过proxy_pass参数反向代理给运行在http://localhost:5000/上的Gunicorn

三、守护进程
1. nohup:
如果你熟悉Linux命令,你应该知道在Linux中后台运行可以通过nohup命令,例如我们要让gunicorn在后台运行,我们只需要运行nohup命令:
讯享网
这样你就可以关闭连接服务器的终端,还能通过你的浏览器访问到你的Flask应用了!
2. supervisor
但是nohup运行的后台程序并不能够可靠的在后台运行,我们最好让我们的后台程序能够监控进程状态,还能在意外结束时自动重启,这就可以使用一个使用Python开发的进程管理程序supervisor。
参考:https://www.cnblogs.com/Dicky-Zhang/p/6171954.html
首先我们通过apt来安装supervisor:
安装完成后,我们在/etc/supervisor/conf.d/目录下创建我们控制进程的配置文件,并以.conf结尾,这样将会自动应用到主配置文件当中,创建后添加如下的配置内容:
讯享网
命令行将显示:demo: added process group,然后我们来启动这个demo进程:
讯享网
当然你也直接在命令行输入supervisorctl进入supevisor的客户端,查看到当前的进程状态:
通过stop命令便可以方便的停止该进程:
讯享网

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/159008.html