Nginx + uWSGI + Flask + Vhost

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 应用

转载于:https://my.oschina.net/lanybass/blog/61896

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值