【场景篇】

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

【寻思篇】

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

  1. <uwsgi>
  2. <wsgi-file>/home/yxgly/code/doraemon/DsBag/GET_DATA/Get_Data_Api.py</wsgi-file>
  3. <callable>app</callable>
  4. <socket>/tmp/uwsgi1.sock</socket>
  5. <stats>/tmp/stats.socket1</stats>
  6. <master/>
  7. <enable-threads>true</enable-threads>
  8. <workers>1</workers>
  9. <threads>1</threads>
  10. <processes>1</processes>
  11. </uwsgi>
  1. uwsgi -x {xml} -d /tmp/uwsgi.log

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

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

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

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

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

  1. server {
  2. listen 8888;
  3. server_name _;
  4.  
  5. location /get_data {
  6. include uwsgi_params;
  7. uwsgi_pass unix:///tmp/uwsgi1.sock;
  8. }
  9.  
  10. location /get_info {
  11. include uwsgi_params;
  12. uwsgi_pass unix:///tmp/uwsgi2.sock;
  13. }
  14.  
  15. location /get_class {
  16. include uwsgi_params;
  17. uwsgi_pass unix:///tmp/uwsgi3.sock;
  18. }
  19. ……………………………………
  20.  
  21. access_log logs/access_8888.log main;
  22. }

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

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

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

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

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

  1. uwsgi_modifier1 value 30 means:
  2.  
  3. 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交互的页面,答案就在此)

  1. 重要的事情说三遍!
  2.  
  3. Note: ancient uWSGI versions used to support the so called uwsgi_modifier1 30 approach. Do not do it. it is a really ugly hack
  4.  
  5. Note: ancient uWSGI versions used to support the so called uwsgi_modifier1 30 approach. Do not do it. it is a really ugly hack
  6.  
  7. 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“了!

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

  1. [uwsgi]
  2. socket = 127.0.0.1:3031
  3. ; mount apps
  4. mount = /app1=app1.py
  5. mount = /app2=app2.py
  6. ; rewrite SCRIPT_NAME and PATH_INFO accordingly
  7. manage-script-name = true

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

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

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

  1. shell 实战 -- 基于一个服务启动,关闭,状态检查的脚本

    功能说明: check:检查服务状态,在开启,关闭,状态检查时都会用到这个函数,所以封装起来放到最前面 start:开启服务 stop:关闭服务 fstop:强制关闭 status:检查服务状态 ru ...

  2. spring web.xml配置服务启动后执行文件

    <bean id="readXmlService" class="com.xxx.xxx.readXmlServiceImpl" init-method= ...

  3. ipv6禁用导致rpcbind服务启动失败实例

    ipv6禁用导致rpcbind服务启动失败实例     昨天在做服务器磁盘分区扩容的时候出现过一个服务启动的问题,在此记录.情景再现:前天晚上申请做磁盘扩容,得到批准后,昨天早上5点开始做停机调整维护 ...

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

    Eureka的wiki上有一句话,大意是一个服务启动后最长可能需要2分钟时间才能被其它服务感知到,但是文档并没有解释为什么会有这2分钟.其实这是由三处缓存 + 一处延迟造成的. 首先,Eureka对H ...

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

    情景是这样的.. 网页打开一个数据列表..数据要求实时从其他多个平台上获取.. 所以就有了一个Web页面..还有个WinService的服务来定时获取这些数据... 问题来了.. 发现Service有 ...

  6. MTK(android init.rc) 写一个开机启动的服务

    在开机往往我们想要做一些初始化的操作,这时候可以使用init.rc文件来实现,当然书写一个开机启动的服务也需要规范的. 假设是C程序,则需要准备C程序的源码,在我的例程中是一个在开机完成(androi ...

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

    JavaWeb 服务启动时,在后台启动加载一个线程. 目前,我所掌握的一共有两种方法,第一种是监听(Listener),第二种是配置随项目启动而启动的Servlet. 下面对这两种方法做一简单的介绍, ...

  8. Swoole 启动一个服务,开启了哪些进程和线程?

    目录 概述 代码 小结 概述 Swoole 启动一个服务,开启了哪些进程和线程? 为了解决这个问题,咱们启动一个最简单的服务,一起看看究竟启动了哪些进程和线程? 然后结合官网运行流程图,对每个进程和线 ...

  9. 讲一个linux服务启动报错问题排查

    例子 首先我们在/usr/lib/systemd/system目录下创建一个服务文件,写下服务启动任务配置.下面我以prometheus的node_exporter为例 vim /usr/lib/sy ...

随机推荐

  1. MFC读写配置文件

    void CFileTextDoc::OnIniread() { // TODO: Add your command handler code here CString strStudName;   ...

  2. 常用LINUX脚本汇总(1)

    1.查看磁盘使用空间 df -hl 2.查看文件或者文件夹大小 du -sh 文件(夹)名  查看文件大小  AIX系统为du -sg 3.查看当前用户下定时任务列表crontab -l 4.修改定时 ...

  3. openssl ans.1编码规则分析及证书密钥编码方式

    1 数据编码格式 openssl的数据编码规则是基于ans.1的,ans.1是什么 ? 先上高大上的解释 ASN.1(Abstract Syntax Notation One), 是一种结构化的描述语 ...

  4. 提示框的优化之自定义Toast组件之(三)Toast组件优化

    开发步骤: 在toast_customer.xml文件中添加一个图片组件对象显示提示图片 <?xml version="1.0" encoding="utf-8&q ...

  5. Android中使用shape来定义控件

    本文章转接于:http://kofi1122.blog.51cto.com/2815761/521605 Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对s ...

  6. vs2012 boost配置

    1.去www.boost.org下载最新的boost,我下载了boost_1_60_02.(我放在D:/cpp目录下)解压到当前文件夹3.打开VS2012->VS TOOLS->VS命令提 ...

  7. Oracle相关的知识点

    1. 如何在Oracle SQLPlus中执行SQL Script文件 以下面的格式在提示符中输入@{file name} SQL>@{file} 假设你要运行的文件的名字是script.sql ...

  8. Struts2体系结构图以及详解

    Strut2的体系结构如图所示: 一个请求在Struts2框架中的处理大概分为以下几个步骤: 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的过滤器(F ...

  9. (原创) mac 10.9.2 eclipse 的 CDT 的 异常的修复

    测试平台:macbook air 2012 , os x 10.9.2 , eclipse 4.3   在升级了 10.9 之后,eclipse 的CDT 无法正常使用了   异常表现:   1. 文 ...

  10. spring中连接池的配置

    在默认通过myeclipse生成的配置里,spring使用的是apache的dbcp连接池 <bean id="dataSource" class="org.apa ...