文档章节

Nginx + uWSGI + Flask + Vhost

lanybass
 lanybass
发布于 2012/06/11 14:37
字数 659
阅读 2790
收藏 17

1.准备工作
先装好nginx virtualenv flask uwsgi等。
nginx配置路径/etc/nginx
virtualenv路径 /opt/pyenv/
装有flask的一个env /opt/pyenv/flask0.8/
两个虚拟主机目录 /var/pywww/app1 /var/pywww/app2

2.配置
/etc/nginx/conf.d/virtual.conf

server {
    listen       80;
    server_name  app1.mydomain.com;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:9090; #uwsgi运行的主机和ip,后面我们会在本机的9090端口上运行uwsgi进程
        uwsgi_param UWSGI_PYHOME /opt/pyenv/flask_0.8; #运行python脚本的virtualenv路径
        uwsgi_param UWSGI_CHDIR /var/pywww/app1; #网站根目录
        uwsgi_param UWSGI_SCRIPT main:app; # 本例以根目录下的main.py中的app对象作为一个callble让uwsgi调用
    }
}

server {
    listen       80;
    server_name  app2.mydomain.com;
    location / {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:9090;
        uwsgi_param UWSGI_PYHOME /opt/pyenv/flask_0.8;
        uwsgi_param UWSGI_CHDIR /var/pywww/app2;
        uwsgi_param UWSGI_SCRIPT test:apppp; #同理,本例以根目录下的test.py中的apppp对象作为一个callble让uwsgi调用
    }
}

3.建立测试用的flask入口
/var/pywww/app1/下建立main.py

from flask import Flask 


app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello app1!"

/var/pywww/app2/下建立test.py

from flask import Flask  

apppp = Flask(__name__)

@apppp.route("/")
def sadfa():
    return "Hello app2!"

4.运行并访问

运行uwsgi:
uwsgi -s :9090 -M -p 4 --vhost --no-site
启动nginx:
service nginx start

-s 后为ip:port
并发4个线程:uwsgi -s :9090 -p 4
主控制线程+4个线程:uwsgi -s :9090 -M -p 4
执行超过30秒的client直接放弃:uwsgi -s :9090 -M -p 4 -t 30
限制内存空间128M:uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 
#--limit-as 这个参数好像有点问题,如果启动不了,日志显示“/operator.so: failed to map segment from shared object: Cannot allocate memory unable to load app 0” 的话,就把这个参数去掉
服务超过10000个req自动respawn:uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000
后台运行:uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log
--no-site: do not import site.py on startup
为了让多个站点共享一个uwsgi服务,必须把uwsgi运行成虚拟站点:uwsgi -s :9090 -M -p 4 -t 30 --limit-as 128 -R 10000 -d uwsgi.log --vhost
还有 --uid 和 --chroot 两个参数自己参考其他资料使用

这样只用开一套uwsgi进程,就可以运行app1.mydomain.com和app2.mydomain.com两个域名下的两套程序。nginx根 据域名不同,发送不同的uwsgi参数给监听在9090端口上的uwsgi进程,uwsgi指定路径找到对应的程序,用指定的virtualenv,执行 指定的入口callble,将请求参数传入。

在uwsgi启动参数加上--pidfile=/tmp/project-master.pid
用kill发送重启信号,这样更新过的程序就能生效了:kill -TERM `cat /tmp/project-master.pid`
更多的信号参见:http://projects.unbit.it/uwsgi/wiki/uWSGISignals

欲了解详情,请参考uWSGI Example以及Nginx+uWSGI配置详解Nginx+uWSGI 部署 Django 应用

© 著作权归作者所有

lanybass

lanybass

粉丝 85
博文 46
码字总数 15052
作品 0
渝中
技术主管
私信 提问
加载中

评论(9)

啦啦啦拉拉
啦啦啦拉拉
部署好麻烦啊
lanybass
lanybass 博主

引用来自“yoory29”的评论

多个站点,启用多个uwsgi服务是不是很浪费资源??
或者会不稳定 ?
启动一个uwsgi本来就可以增加很多线程数,为毛要开多个服务? 开多个的服务话,浪费倒是有点,不过应该不会不稳定。
yoory29
yoory29
多个站点,启用多个uwsgi服务是不是很浪费资源??
或者会不稳定 ?
gengv2007
gengv2007
好文!
b
boymarco

引用来自“lanybass”的评论

引用来自“boymarco”的评论

引用来自“lanybass”的评论

引用来自“boymarco”的评论

按照这个配置下来,启动报错:
2013/09/29 11:48:46 [error] 5424#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: app1.mydomain.com, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:9090", host: "127.0.0.1"

你这是nginx的错误吧。你要看uwsgi的错误日志
启动uwsgi加上参数: -d uwsgi.log
然后看uwsgi.log里面的错误,一般是代码的问题

uwsgi日志里面只有这种错误:
-- unavailable modifier requested: 0 --

你没有安装python3版本吧。我说的环境是python2.6/2.7。
你是ubuntu还是centos ?
uwsgi是通过pip 还是 apt-get/yum 安装的?尝试另一种方式安装下。
附上我百度到的两个结果:
1.要安装uwsgi-plugin-python,并且uwsgi启动时候添加--plugin python
2.可以尝试依次删除nginx和uwsgi(记得备份部分需要的配置文件),然后再依次使用apt-get/yum方式安装nginx和uwsgi,然后再按照本文所叙述方式进行配置。

问题原因是ubuntu 12.04上apt-get的nginx的版本太低的缘故,升级到最新版本解决
lanybass
lanybass 博主

引用来自“boymarco”的评论

引用来自“lanybass”的评论

引用来自“boymarco”的评论

按照这个配置下来,启动报错:
2013/09/29 11:48:46 [error] 5424#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: app1.mydomain.com, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:9090", host: "127.0.0.1"

你这是nginx的错误吧。你要看uwsgi的错误日志
启动uwsgi加上参数: -d uwsgi.log
然后看uwsgi.log里面的错误,一般是代码的问题

uwsgi日志里面只有这种错误:
-- unavailable modifier requested: 0 --

你没有安装python3版本吧。我说的环境是python2.6/2.7。
你是ubuntu还是centos ?
uwsgi是通过pip 还是 apt-get/yum 安装的?尝试另一种方式安装下。
附上我百度到的两个结果:
1.要安装uwsgi-plugin-python,并且uwsgi启动时候添加--plugin python
2.可以尝试依次删除nginx和uwsgi(记得备份部分需要的配置文件),然后再依次使用apt-get/yum方式安装nginx和uwsgi,然后再按照本文所叙述方式进行配置。
b
boymarco

引用来自“lanybass”的评论

引用来自“boymarco”的评论

按照这个配置下来,启动报错:
2013/09/29 11:48:46 [error] 5424#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: app1.mydomain.com, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:9090", host: "127.0.0.1"

你这是nginx的错误吧。你要看uwsgi的错误日志
启动uwsgi加上参数: -d uwsgi.log
然后看uwsgi.log里面的错误,一般是代码的问题

uwsgi日志里面只有这种错误:
-- unavailable modifier requested: 0 --
lanybass
lanybass 博主

引用来自“boymarco”的评论

按照这个配置下来,启动报错:
2013/09/29 11:48:46 [error] 5424#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: app1.mydomain.com, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:9090", host: "127.0.0.1"

你这是nginx的错误吧。你要看uwsgi的错误日志
启动uwsgi加上参数: -d uwsgi.log
然后看uwsgi.log里面的错误,一般是代码的问题
b
boymarco
按照这个配置下来,启动报错:
2013/09/29 11:48:46 [error] 5424#0: *1 upstream prematurely closed connection while reading response header from upstream, client: 127.0.0.1, server: app1.mydomain.com, request: "GET / HTTP/1.1", upstream: "uwsgi://127.0.0.1:9090", host: "127.0.0.1"

Linux搭建Python web环境(nginx + flask + uwsgi)

去年的时候,就曾使用Nginx+Flask+uwsgi搭建过python的web环境。但在最近搭建的时候,又去网上找了一遍教程,所以打算写一篇笔记做下记录。 在搭建之前,有必要了解下发送一个请求的整个流程...

liuchungui
2018/05/14
0
0
flask+uwsgi+supervisor+nginx在局域网服务器上部署实践

flask可以快速的搭建http服务,但是为了搭建网站还是需要web服务器和相关监控管理操作,一套flask、uwsgi、supervisor、nginx是较好的完整解决方案。 本文对自己学习做一个记录,以一个简单的...

zoulala
2018/09/05
159
0
python + flask + uwsgi + gevent + nginx 环境搭建(非阻塞)

Flask是Python中一个微型的Web开发框架。在debug 模式 或 单纯的 uwsgi模式下,flask是阻塞模式的,也就是说一次只能效应一个请求,或者在uwsgi 开启多进程,响应已知的请求个数;我们这里使...

dchuang
2015/08/09
4.8K
0
在 Ubuntu 上使用 Nginx 部署 Flask 应用

我职业生涯的大部分都在使用微软的架构,最近我决定走出技术的舒适区,步入开源软件世界。我现在日常工作的项目是一个RESTful服务,这个服务需要在主流硬件上运行,且能够按照需要进行水平拓...

greatghoul
2013/09/26
52.7K
18
nginx + django + uwsgi 安装配置

安装uwsgi 推荐手动安装 wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz cd uwsgi python uwsgiconfig.py --build cd nginx cp uwsgi_params /usr/local/nginx/conf/ 配置uws......

Yisen
2013/01/18
592
0

没有更多内容

加载失败,请刷新页面

加载更多

lopatkin俄大神Windows精简版系统 安装教程 简单版

1.制作U盘启动盘 或 安装pe到电脑 下载微pe工具箱.(为什么用这个呢,因为这个无毒,无广告,无后门.其它pe在安装完系统会安装一堆木马,垃圾软件,后门什么的) pe制作工具下载http://www.wepe.com...

xiaogg
18分钟前
3
0
【0917】Linux shell基础知识2

【0917】Linux shell基础知识2 8.7/8.8 shell变量 8.9 环境变量配置文件 8.10 shell特殊符号cut命令 8.11 sort_wc_uniq命令 8.12 tee_tr_split命令 8.13 shell特殊符号 一、shell变量 1、使用...

飞翔的竹蜻蜓
20分钟前
3
0
管理角色认知-新晋管理常常犯的错

背景 管理是一门实践科学,从知道到做到,需要长时间的刻意练习,提前知道那些坑,可以提前规避。 坑1:被动执行 现象: 不主动找活干,等上级派活; 上级有了安排,指望上级替他决定实现方案...

春天spring
22分钟前
4
0
MongoDB4.0.2集群搭建

MongoDB4.0.2集群搭建 2019.02.01 01:02 619浏览 MongoDB4.0.2集群搭建 根据对象存储平台Django+MongoDB+Ceph的需求,现搭建部署一个十节点的MongoDB集群,主要以下关键点: 根据最新版本Mon...

linjin200
25分钟前
4
0
面试官问你B树和B+树,就把这篇文章丢给他

原文链接:面试官问你B树和B+树,就把这篇文章丢给他 1 B树 在介绍B+树之前, 先简单的介绍一下B树,这两种数据结构既有相似之处,也有他们的区别,最后,我们也会对比一下这两种数据结构的区...

欧阳思海
29分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部