简述uwsgi使用一个服务启动多个文件的用法

【场景篇】

  为了节省端口的占用,将N个flask应用服务——每个对应一个文件(web.py、django也一样)合并为一个端口服务来启用

【寻思篇】

  通常的做法:每个文件配置一个xml 或者 ini文件,然后依次启动uwsgi(uwsgi -x {xml文件名}),形如:

<uwsgi>
     <wsgi-file>/home/yxgly/code/doraemon/DsBag/GET_DATA/Get_Data_Api.py</wsgi-file>
     <callable>app</callable>
     <socket>/tmp/uwsgi1.sock</socket>
     <stats>/tmp/stats.socket1</stats>
     <master/>
     <enable-threads>true</enable-threads>
     <workers>1</workers>
     <threads>1</threads>
     <processes>1</processes>
</uwsgi>
uwsgi -x {xml} -d /tmp/uwsgi.log

但这样会导致启动的uwsgi太多,不便于管理。

  稍高级一点的用法,可以使用“皇帝”(emperor),具体用法:将所有的xml统一放到一个目录里(例如:放到这个目录下 mysgi_conf),进行一并启动:

uwsgi --emperor mysgi_conf/ --logto /tmp/uwsgi.log

这样启动了之后,每个文件都有有个与之对应的socket文件

然后在nginx上配置多条location来做好走向,形如:

server {
        listen       8888;
        server_name  _;

        location /get_data {
                include uwsgi_params;
                uwsgi_pass unix:///tmp/uwsgi1.sock;
        }

        location /get_info {
                include uwsgi_params;
                uwsgi_pass unix:///tmp/uwsgi2.sock;
        }

        location /get_class {
                include uwsgi_params;
                uwsgi_pass unix:///tmp/uwsgi3.sock;
        }
        ……………………………………

        access_log  logs/access_8888.log main;
        }

但这种会出现种种错误,若是只配置“location /" 就会正常,但我的“需求”是在一个端口下(8888)做好所有的事情……

找谷哥、度娘……找到了一篇

https://jawher.me/2012/03/16/multiple-python-apps-with-nginx-uwsgi-emperor-upstart/

坑爹的是按照他指导的样子去做,还是不奏效

与此同时,更让我困惑的是文中所提到的“uwsgi_modifier1”的用法,我又没有完全“领会”明白,最后搜到了这样一段解释,就算稍微明白了一些。

uwsgi_modifier1 value 30 means:

Standard WSGI request followed by the HTTP request body. The PATH_INFO is automatically modified, removing the SCRIPT_NAME from it.

【解决篇】

在网上搜了很多关于这个问题的解决思路,但是没有找到一个“合适”的答案(百变不离其中的都是抄来抄去,没有任何一个奏效的)

于是 决定还是阅读更权威的官方文档

http://uwsgi-docs.readthedocs.io/en/latest/Nginx.html (这一篇介绍与nginx交互的页面,答案就在此)

重要的事情说三遍!

Note: ancient uWSGI versions used to support the so called “uwsgi_modifier1 30” approach. Do not do it. it is a really ugly hack

Note: ancient uWSGI versions used to support the so called “uwsgi_modifier1 30” approach. Do not do it. it is a really ugly hack

Note: ancient uWSGI versions used to support the so called “uwsgi_modifier1 30” approach. Do not do it. it is a really ugly hack

简言之,不要用“uwsgi_modifier1“了!

再看上下文,发现了个更有“意思”的用法

[uwsgi]
socket = 127.0.0.1:3031
; mount apps
mount = /app1=app1.py
mount = /app2=app2.py
; rewrite SCRIPT_NAME and PATH_INFO accordingly
manage-script-name = true

大家看到这里也知道如何搞定了吧……

对,最后的样子就是这样子??

依葫芦画瓢

[uwsgi]
mount = /get_data=/home/yxgly/code/doraemon/DsBag/GET_DATA/Get_Data_Api.py
mount = /get_info=(此处省略,就不写了)
mount = /get_class=(此处省略,就不写了)
callable = app
manage-script-name = true
socket = /tmp/uwsgi_ini.sock

这里用的是ini格式的作为配置文件,所以启动方式稍微有些变化(当然,你也可以用xml来写)

uwsgi --ini myscg_conf.ini -d /tmp/uwsgi.log

然后只需在nginx层在配置一个‘/‘ 的location即可。

形如:

server {
        listen       8888;
        server_name  _;

        location / {
                include uwsgi_params;
                uwsgi_pass unix:///tmp/uwsgi_ini.sock;
        }
        access_log  /app/Nginx/logs/access_8888.log main;
        }

然后就可以使用

http://{ip}:8888/get_data/……

http://{ip}:8888/get_info/……

http://{ip}:8888/get_class/……

来访问了。

若有更好的建议,欢迎留言,持续改进??

时间: 2024-08-02 18:09:39

简述uwsgi使用一个服务启动多个文件的用法的相关文章

用shell写一个服务启动脚本,速度get!

制作服务启动程序:(case+if)vi /etc/init.d/myprog #!/bin/bash#chkconfig:35 90 10#description:Startup script for myprog Servercase "$1" instart)if [ -f /opt/test ];thenecho "myprog服务已经启动 [失败]"elseecho "正在启动 myprog 服务 [确定]"touch /opt/tes

Oracle服务启动(bat文件)

新建txt文件 插入启动语句,我这里是11g,各位根据自己的版本修改为自己的名称,具体可以右键计算机->管理  找到oracle服务邮件属性,里面的名称 net start OracleServiceORCL  net start OracleOraDb11g_home1TNSListener 关闭语句 net stop OracleServiceORCL  net stop OracleOraDb11g_home1TNSListener 放在不同的txt中,全部修改后缀名为bat文件,然后双击

spring-eureka 源码解读----为什么一个服务最多两分钟被其他服务感知

Eureka的wiki上有一句话,大意是一个服务启动后最长可能需要2分钟时间才能被其它服务感知到,但是文档并没有解释为什么会有这2分钟.其实这是由三处缓存 + 一处延迟造成的. 首先,Eureka对HTTP响应做了缓存.在Eureka的"控制器"类ApplicationResource的109行可以看到有一行 String payLoad = responseCache.get(cacheKey); 1 的调用,该代码所在的getApplication()方法的功能是响应客户端查询某个

JavaWeb 服务启动时,在后台老板启动加载一个线程

avaWeb 服务启动时,在后台启动加载一个线程JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍,(Mark一下,防止以后急用又忘记了): 监听(Listener) 首先,我们创建一个监听的类,继承ServletContextListener,如下: 源码复制打印    package com.wxp.thread;    import javax

Web启动服务器上的某一个服务

情景是这样的.. 网页打开一个数据列表..数据要求实时从其他多个平台上获取.. 所以就有了一个Web页面..还有个WinService的服务来定时获取这些数据... 问题来了.. 发现Service有时会无故的停掉..给Web端的数据呈现造成困扰.. 又不想出现问题就跑到服务器上开启服务..想如何能够通过Web来控制这个服务的开启和关闭.. ~~~~~~~~~~~~~~~~~~~~~开整~~~~~~~~~~~~~~~~~~~~ 首先创建一个Bat批处理文件..不懂什么是批处理文件的进  http

react-native服务启动,运行项目到安卓模拟器

1.在CMD中进入要启动的项目下,输入react-native start,等待启动成功.成功之后再浏览器中访问http://localhost:8081/index.android.bundle?platform=android,如果可以访问,表示服务器端启动成功. 2.在上个服务启动的情况下,重新打开一个CMD,进入项目目录下,输入命令react-native run-android运行,第一次运行的时候会下载gradle,时间较长,成功之后,会在android模拟器中安装上,出现Welco

关于.net服务启动注册到zookeeper,但是注册节点20分钟自动消失解决办法

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,作用简单描述就是相当于一个中介,服务提供者将服务注册到zk,服务调用者直接从zk获取,zk的作用就是协调 最近碰到公司iis服务启动了,然后该服务在zk成功注册节点并且provider有了节点,但是超过20分钟没有访问后,发现provider中的节点消失了,请教了开发知道,对于新增的服务器安装iis服务后,原来对于服务的应用程序池需要做3个操作才行. 如图1-1,需要在服务的应用程序池,选择服务-高级设置-禁用重叠回收[True

服务启动错误1053,一例解决方案(给用户添加NetworkService权限)

WIndows XP的服务中,有一个服务需要以NT  AUTHORITY/NetworkService用户启动,但怎么也启动不起来,使用本地系统帐户启动没有任何问题,但是换成NetworkService就启动不了,报“错误1053:服务没有及时相应启动或控制请求”.找不到解决方案,我在另一台电脑上好好的,怎么到了这台电脑就不行了呢? 后来,寻到一个网页(转)用户 'nt authority/network service' 登录失败,对阿,这两台电脑硬盘分区格式不一样,那台能用的是Fat32分区

安装VisualSVN Server 报&quot; Service &#39;VisualSVN Server&#39; failed to start. &quot; 服务启动失败

安装VisualSVN Server 报"Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for more details"错误.原因是启动"VisualSVN Server"失败 2 咱们先来看一下这个服务在哪,计算机-右键-管理或者系统服务-在服务里面可以看到一个"VisualSVN Server"项,状