AliyunOS上Flask + uWSGI + Nginx 部署

知识引入

uWSGI是什么

Flask 开发中自带了 web server,通过 Werkzeug,我们可以搭建 WSGI 服务,运行我们的网站,但 Flask 是 Web 框架,并不是 Web 服务器,尽管 Werkzeug 很强大,但只能用于开发,不能用于生产,对于 Web 服务器,我们有更专业的选择,那就是 uWSGI。
uWSGI 是一个全站式的托管服务,它实现了应用服务器(支持多种编程语言)、代理、进程管理器、监视器。取名为 uWSGI 是因为它最早实现的是 Python 语言的 WSGI。
uWSGI 是 C 语言写的,性能比较高。uWSGI 包括四个部分:

  1. uwsgi协议
  2. web server 内置支持协议模块
  3. application 服务器协议支持模块
  4. 进程控制程序

uWSGI 是一个web服务器,实现了WSGI协议(Web Server Gateway Interface),uwsgi,http协议等,它可以接收和处理请求,发出响应等。所以不用Nginx,只用uWSGI也是可以的。

Nginx是什么

Nginx 是高效的 Web 服务器和反向代理服务器,可以用作负载均衡(当有 n 个用户访问服务器时,可以实现分流,分担服务器的压力),可以进行安全过滤,防DDOS攻击等。与 Apache 相比,Nginx 支持高并发,可以支持百万级的 TCP 连接,十万级别的并发连接,部署简单,内存消耗少,成本低,但 Nginx 的模块没有 Apache 丰富。
Nginx 支持 uWSGI 的 uwsgi 协议,因此我们可以将 Nginx 与 uWSGI 结合起来,Nginx 通过 uwsgi_pass 将动态内容交给 uWSGI 处理。

有了 uWSGI 还要 Nginx ?

最普遍的说法是 Nginx 对于处理静态文件更有优势,性能更好。其实如果是小网站,没有静态文件需要处理,只用 uWSGI 也是可以的,但加上 Nginx 这一层,优势可以很具体:
对于运维来说比较方便,如果服务器被某个 IP 攻击,在 Nginx 配置文件黑名单中添加这个 IP 即可,如果只用 uWSGI,那么就需要在代码中修改了。
另一方面,Nginx 是身经百战的 Web 服务器了,在表现上 uWSGI 显得更专业,比如说 uWSGI 在早期版本里是不支持 https 的,可以说 Nginx 更安全。
Nginx 的特点是能够做负载均衡和 HTTP 缓存,如果不止一台服务器,Nginx 基本就是必选项了,通过 Nginx,将资源可以分配给不同的服务器节点,只有一台服务器,也能很好地提高性能,因为 Nginx 可以通过 headers 的Expires or E-Tag,gzip 压缩等方式很好地处理静态资源,毕竟是 C 语言写的,调用的是 native 的函数,针对 I/O做了优化,对于动态资源来说,Nginx 还可以实现缓存的功能,配合 CDN 优化(这是 uWSGI 做不到的)。Nginx 支持epoll/kqueue 等高效网络库,能够很好地处理高并发短连接请求,性能比 uWSGI 不知道高到哪里去了。
如果服务器主机上运行了PHP,Python 等语言写的多个应用,都需要监听80端口,这时候 Nginx 就是必选项了。因为我们需要一个转发的服务。
所以说,Nginx 基本也是必选项。所以说虽然uWSGI本身就是一个web服务,这里再次引入Nginx就是为了把Nginx作为一个反向代理,这样,一些图片、js等静态资源就可以用Nginx提供服务,而其他的转发给uWSGI,这也是我们这套部署架构的最终目的。

操作

基本路径

项目路径

/var/www/py3env/project

虚拟Python环境路径

/var/www/py3env/venv

项目结构

├── config.py
├── exts.py
├── main.py
├── models.py

添加uWSGI配置文件uwsgi.ini

本人放在/var/www/py3envuwsgi.ini,根据自己的文件存放情况设置即可:

[uwsgi]

# uwsgi 启动时所使用的地址与端口
socket = 127.0.0.1:8000

# 指向网站目录
chdir = /var/www/py3env/project

# python 启动程序文件
wsgi-file = main.py

# python 程序内用以启动的 application 变量名
callable = app

# 进程数
threads = 2

参数说明:

  • socket:套接字通讯端口,相当于为外界留出一个uWSGI服务器的接口,负责与Nginx通信,但注意socket是无法直接通过http请求成功访问。
  • pythonpath:项目目录。
  • module:指定项目启动脚本名字,我们可以在本地用python run.py启动flask项目
  • callable:程序内启用的application变量名,一般而言都是app=Flask(name)的所以这里是app。
  • stats:获取uwsgi统计信息的服务地址
  • daemonize:使uWSGI进程在后台运行,并将日志打到指定的日志文件或者udp服务器.
  • processes:处理器个数。
  • threads:线程数。

processes和threads指出了启动uwsgi服务器之后,服务器会打开几个并行的进程,每个进程会开几条线程来等待处理请求,显然这个数字应该合理,太小会使得处理性能不好而太大则会给服务器本身带来太大负担。

启动uWSGI

uwsgi uwsgi.ini

或者不用uWSGI配置文件,直接用命令运行

uwsgi --socket 127.0.0.1:8008 --wsgi-file run.py --master --processes 4 --threads 2 --stats 127.0.0.1:9191

用Nginx,就可以配置uWSGI使用socket与Nginx通信。
即如果有Nginx在uWSGI之前作为代理的话应该配socket,而如果想让请求直接甩给uWSGI的话那么就要配http。
或者不用uWSGI配置文件,直接用命令运行

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

配置Nginx服务器

配置文件的路径不尽相同,centos上用yum安装时,一般配置文件在/etc/nginx/nginx.conf

只修改如下部分:

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  121.196.210.237;
        charset utf-8;
        #root         /var/www/webroot;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                include uwsgi_params;
                uwsgi_pass 127.0.0.1:8000;
                uwsgi_param UWSGI_PYTHON /var/www/py3env/venv/;
                uwsgi_param UWSGI_CHDIR /var/www/py3env/project/;
                uwsgi_param UWSGI_SCRIPRT main:app;
        }

    }

各参数说明:

  • listen:监听的端口
  • server_name:服务器名或IP
  • charset:字符集
  • access_log:Nginx服务器接收的请求日志,目录若不存在需要创建,否则Nginx报错
  • error_log:Nginx服务器记录的错误日志
  • include:导入的uWSGI配置
  • uwsgi_pass:需要和uWSGI的配置文件里socket项的地址相同,否则无法让uWSGI接收到请求。
  • uwsgi_param UWSGI_PYHOME:python的位置(虚拟环境下)
  • uwsgi_param UWSGI_CHDIR:项目根目录
  • uwsgi_param UWSGI_SCRIPT:启动项目的主程序(在本地上运行这个主程序可以在flask内置的服务器上访问你的项目)

调试

重启nginx服务器:

systemctl restart nginx.service

在Python虚拟环境下:

uwsgi uwsgi.ini

然后地址栏里访问:

http://你服务器的ip地址
访问效果
终端显示
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容