uwsgi学习笔记与踩坑

2020年09月08日 未雨晴空 2评论 451阅读 0喜欢

uwsgi参数详解

  • chdir=/data/blog/
    项目所在路径在app加载前切换到当前目录, 指定运行目录

  • module=blog.wsgi:application
    加载一个项目里的WSGI模块同时启动文件的名称不需要加上.py

  • home=/xxx/python3
    设置python或者虚拟环境(virtualenv)路径。个人建议使用virtualenv来设置虚拟环境的路径(home|virtualenv|env|配置一个就行了)

  • virtualenv=/xxx/env/blog
    设置python或者虚拟环境(virtualenv)路径。个人建议使用virtualenv来设置虚拟环境的路径(home|virtualenv|env|配置一个就行了)

  • venv=/xxx/env/blog
    设置python或者虚拟环境(virtualenv)路径。个人建议使用virtualenv来设置虚拟环境的路径(home|virtualenv|env|配置一个就行了)

  • master=true
    启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于重启所有的uwsgi进程。

  • processes=2
    启动的工作进程数(根据你服务器的配置去设定一般cpu数*2)

  • threads=4
    线程数(一般processes * 2)

  • socket=127.0.0.1:8000(可以指定8个socket选项)

      使用nginx时需要配置socket
      socket文件配置,则socket文件内容如下:
      -s 127.0.0.1:8000
      -s 127.0.0.1:8001
      socket参数配置127.0.0.1:8000这样就会监听到网络套接字
      [uwsgi]
      ...
      socket = 127.0.0.1:8000
      socket = 127.0.0.1:8001
    
  • socket-timeout=600
    设置间隔socket超时时间

  • wsgi-file=/root/test.py
    指定wsgi文件路径,启动时加载该文件(一般测试uwsgi时用到)

  • chmod-socket=666
    给socket文件配置访问权限

  • enable-threads=true
    允许用内嵌的语言启动线程。这将允许你在app程序中产生一个子线程

  • vacuum=true
    当服务器退出的时候自动清理环境,删除unix socket文件和pid文件

  • pidfile=/var/run/uwsgi.pid
    指定pid文件的位置,记录主进程的pid号

  • reload-merc=8
    设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长秒数。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了reload-mercy配置的如8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)

  • harakiri=600
    一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)

  • max-requests=5000
    为每个工作进程设置请求数的上限。当一个工作进程处理的请求数达到这个值,那么该工作进程就会被回收重用,可以使用过该选项来防止内存泄漏。

  • listen=100
    设置socket的监听队列大小(默认:100)

  • daemonize=/xxx//xxx/uwsgi.log
    守护uWSGI日志文件路径

  • disable-logging=true
    不记录请求信息的日志。只记录错误以及uWSGI内部消息到日志中

  • log-maxsize=50000000
    以固定的文件大小(单位KB),切割日志文件。如上方log-maxsize = 50000000 就是50M一个日志文件

  • buffer-size=32768
    设置请求内容的最大值 (排除request-body),这一般映射到请求头的大小。默认情况下,它是4k。如果你接收到了一个更大的请求 (例如,带有大cookies或者查询字符串),那么你也许需要增加它。它也是一个安全度量,所以调整为你的应用需要,而不是最大输出。

  • http=xxx.xxx.xxx.xxx:8000
    在指定地址上添加一个http路由器/服务器,如果直接使用uwsgi,那么就可以直接通过服务器的IP地址:端口号来访问

  • http-timeout=600
    设置内部http socket超时时间

更多的参数请看uwsgi核心选项

uwsgi安装与测试

  • 安装uwsgi
      pip install uwsgi
    
  • 测试uwsgi

      # test.py
      def application(env, start_response):
          start_response('200 OK', [('Content-Type','text/html')])
          return [b"Hello World"] # python3
          #return ["Hello World"] # python2
    
      uwsgi --http :8000 --wsgi-file test.py
    
  • 浏览器访问:http://example.com:8000

排坑

  • 坑一
    如果通过supervisor来管理uwsgi,那么需要注意选项daemonizelog-maxsize就不要再配置了,不然就会报错"FATAL FAIL"啥的错误。
  • 坑二
    如果完成了nginx+uwsgi+django的配置,但是有时候访问有的页面(注意是有的页面)会提示502 bad gateway查看nginx的日志是这样的一行:Upstream prematurely closed connection while reading upstream...
    出现这种情况可能是django处理请求时间很长,导致请求还没发出去,就被干掉了,这个时候可以调整harakiri或者socket-timeout参数的值,我自己现在的博客项目之前遇到就是这样就解决的。
  • 坑三
    如果没有设置log-maxsize,则会出现supervisor管理当前项目的日志只会输出到err.log里面

后续如果踩到新坑会再添加到该页面

参考资料

  1. tony
    2020-09-08 23:09:10

    强!

    回复
    1. 2020-09-08 23:09:34

      多谢夸奖。也有许多地方做不好。共同进步,朋友。

      回复

发表评论 取消回复

电子邮件地址不会被公开。

请输入以http或https开头的URL,格式如:https://oneisall.top