文档章节

Nginx + uWSGI + Flask + Vhost

lanybass
 lanybass
发布于 2012/06/11 14:37
字数 659
阅读 2802
收藏 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
172
0
python + flask + uwsgi + gevent + nginx 环境搭建(非阻塞)

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

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

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

greatghoul
2013/09/26
53.4K
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
594
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部