uwsgi快速入门(代码片段)

A-L-Kun A-L-Kun     2023-01-13     477

关键词:

uwsgi 快速入门

一、 概述

1、 简单介绍

WSGI(Web Server Gateway Interface),定义了web服务器(nginx、apache、iis等)和 web应用(或者将web框架,flask、django等)之间的接口规范。也就是说,只要 web服务器和 web应用都遵守WSGI协议,那么 web服务器和 web应用就可以随意的组合。

uwsgi的启动可以把参数加载命令行中,也可以是配置文件 .ini, .xml, .yaml 配置文件中,个人用的比较多得是 .ini 文件。

通过uwsgi --help可以查看得到:

-x|--xmlconfig                         load config from xml file
-x|--xml                               load config from xml file
--ini                                  load config from ini file
-y|--yaml                              load config from yaml file
-y|--yml                               load config from yaml file

2、 环境配置

使用 pip 进行安装

pip install uwsgi

二、 第一个 WSGI 应用

1、 运行

让我们从一个简单的 "Hello World" 开始,创建文件 index.py,代码如下:

def application(env, start_response):
    start_response(\'200 OK\', [(\'Content-Type\',\'text/html\')])
    return [b"Hello World"]

WSGI Python 加载器将会搜索的默认函数 application

接下来我们启动 uWSGI 来运行一个 HTTP 服务器,将程序部署在HTTP端口 8080上:

uwsgi --http :8080 --wsgi-file index.py

2、 添加并发

默认情况下,uWSGI 启动一个单一的进程和一个单一的线程。

你可以用 --processes 选项添加更多的进程,或者使用 --threads 选项添加更多的线程 ,也可以两者同时使用。

uwsgi --http :9090 --wsgi-file index.py --master --processes 4 --threads 2

以上命令将会生成 4 个进程, 每个进程有 2 个线程。

如果你要执行监控任务,可以使用 stats 子系统,监控的数据格式是 JSON:

uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

我们可以安装 uwsgitop(类似 Linux top 命令) 来查看监控数据:

pip install uwsgitop

三、 结合 Web 服务器使用

1、 Flask

这里可以使用配置文件来支持 Flask 运行。

[uwsgi]
# 监听的端口号
socket = localhost:5000   
# 开启主进程
master = true
# 项目文件路径
chdir = /root/www/          
# 项目启动文件
wsgi-file = app.py      
# flask 实例名称
callable = app 
# 项目的进场数量
processes = 4 
# 项目的线程数量
threads = 2   
# 查看监控数据
stats = localhost:9191    
# 主进程的 pid  # 如:uwsgi --reload uwsgi
pidfile = uwsgi.pid        
# 日志文件
daemonize = /var/log/uwsgi/uwsgi.log 
# 允许用内嵌的语言启动线程,这将允许你在app程序中产生一个子线程
enable-threads = true
# socket 权限
chmod-socket = 666
# 指定虚拟环境位置
home = .venv

启动运行:

uwsgi -d --ini yourfile.ini  # 开启服务

2、 Django

uwsgi 的配置文件

[uwsgi]
socket = localhost:5000
master = true
chdir = /root/temp/django/CRM
wsgi-file = /root/temp/django/CRM/CRM/wsgi.py
processes = 4
threads = 2
daemonize = /var/log/uwsgi/uwsgi.log 
pidfile = uwsgi.pid
chmod-socket = 666
enable-threads = true
stats = localhost:9191  
home = .venv

启动运行:

uwsgi -d --ini yourfile.ini  # 开启服务

3、 Nginx配置

这里使用 flask 的为一个示例

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events 
    worker_connections 1024;


http 
    log_format  main  \'$remote_addr - $remote_user [$time_local] "$request" \'
                      \'$status $body_bytes_sent "$http_referer" \'
                      \'"$http_user_agent" "$http_x_forwarded_for"\';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;
    upstream flaskservice
    	server localhost:5000;
	
    	 
    server 
		#SSL 默认访问端口号为 443
        listen 443 ssl;
        #请填写绑定证书的域名
        server_name steve1.cn;
        #请填写证书文件的相对路径或绝对路径
        ssl_certificate  cert/steve1.cn_bundle.crt;           
        #请填写私钥文件的相对路径或绝对路径
        ssl_certificate_key cert/steve1.cn.key;           
        ssl_session_timeout 5m;
        #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        #请按照以下协议配置
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
		# 实现下载站点
        location /download 
            root /root/www;
            autoindex on;
            autoindex_localtime on;
        
        # 静态资源通过 Nginx 来分发
        location ~/.*\\.(html|htm|js|css|ico|png|jpg|gif|svg|txt) 
           root /root/www/static;

        
        # 动态资源通过 Flask 来分发,同时使用了 uwsgi
        location / 
            include uwsgi_params;
            uwsgi_pass flaskservice; 
        

        # 错误页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html 
            root   html;
        
    
    server 
        listen 80;
        #请填写绑定证书的域名
        server_name steve1.cn; 
        # 把http的域名请求转成https
        location / 
            rewrite ^/ https://$host$request_uri permanent;
        
    

javagcm快速入门(代码片段)

查看详情

pythongooglecalendarapipython快速入门(代码片段)

查看详情

json快速入门(代码片段)

查看详情

javascript表格快速入门(代码片段)

查看详情

markdownangular2快速入门(代码片段)

查看详情

markdownelasticsearch,快速入门,码头工具(代码片段)

查看详情

markdown快速+graphql入门体验(代码片段)

查看详情

applescript快速入门(代码片段)

AppleScript快速入门AppleScript顾名思义是苹果开发的一套脚本语言,利用AppleScript在macOS系统上可以对其他程序进行操作,点击按钮、发送消息、模拟自动化执行功能,比如可以打开浏览器,清空回收站等等一些操作,是一个非常有... 查看详情

springmvc--springmvc介绍快速入门快速入门流程(代码片段)

...pringMVC是Spring的一个后续产品,是Spring的一个子项目2.快速入门2.1需求客户端发起请求,服务器端接收请求,执行逻辑并进行视图跳转。2.2开发步骤说明:2.2.1导入SpringMVC相关坐标pom 查看详情

servlet快速入门(代码片段)

...到,那么这个类就必须直接或间接的实现Servlet接口2.Servlet快速入门创建web模块。编写普通java文件实现Servlet。publicclassmainServletimplementsServlet/****/privateServ 查看详情

rabbitmq快速入门(代码片段)

...概念BrokerVirtualhostConnectionChannelExchangeQueueBinding工作模式JMS快速入门生产者Moudle消费者Moudle测试MQ概述MQ全称MessageQueue(消息队列),是在消息 查看详情

markdown快速入门(代码片段)

markdown快速入门1.代码块语法://代码块语法​```Java​```shell2.标题://标题语法#1级标题##2级标题###3级标题####4级标题#####5级标题######6级标题!**注意:'#'与标题之间需要空格隔开**1级标题2级标... 查看详情

面向对象快速入门(代码片段)

...属性------变量:静态的,也就是对象下面的变量  对象快速入门案例://构造函数functionCreatPerson(name,sex)this.name=name;this.sex=sex;//对象原型方法:prototype式关键字,相当于所有创建的对象都包含该方法CreatPe 查看详情

快速入门rabbitmq(代码片段)

...异步通讯1.1.1.同步通讯1.1.2.异步通讯1.2.技术对比:2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现2.5.总结3.SpringAMQP3.1.BasicQueue简单队列模型3.1.1.消息 查看详情

kafka快速入门(代码片段)

...Kafka官网的Quickstart,主要面向没有使用过kafka、但想快速入门的同学。Kafka快速入门下载先下载kafka压缩包,并解压。下载地址:https://kafka.apache.org/downloads然后解压并切换目录:>tar-xzfkafka_2.11-1.1.0.tgz>cdkafka_2.11 查看详情

elasticsearch快速入门(代码片段)

...de/cn/elasticsearch/guide/current/index.html)而且是中文的Elastic的快速入门1、基础概念面向文档,JSON作为序列化格式,ElasticSearch的基本概念索引(名词):   如前所述,一个 索引 类似于传统关系数据库中的一个  查看详情

pandas高级数据分析快速入门之二——基础篇(代码片段)

Pandas高级数据分析快速入门之一——Python开发环境篇Pandas高级数据分析快速入门之二——基础篇Pandas高级数据分析快速入门之三——统计分析篇Pandas高级数据分析快速入门之四——表内、表间数据处理篇Pandas高级数据分析快速入... 查看详情

springboot快速入门(代码片段)

01-内容Spring概述、快速入门SpringBoot配置SpringBoot整合02-SpringBoot概述SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻... 查看详情