uwsgi似乎是目前部署python站点最方便的组件了。配置单一网站非常简单,参考Debian Lenny安装nginx+uwsgi可轻松完成。不过,同一个服务器部署多个站点就稍微复杂一点。经过一个晚上的折腾,终于配置成功。

这里的多站点是指使用同一Nginx和uwsgi主进程服务的多个站点,通常以域名区分。注意,不是使用多个uwsgi主进程实现。

首先,多站点需要Python的virtualenv支持。这个virtualenv很强大,基本作用是帮助我们隔离出一个干净的Python环境,例如,环境A安装了Django 0.9,环境B安装了Django 1.1,如果没有virtualenv,则需要自己管理这些包的路径。有了virtualenv,各个Python环境互不影响,多个站点使用各自的Python环境,同一组件的不同版本不会冲突。virtualenv的实现方式也很简单,就是复制一份完整的Python环境到单独的目录,并设置若干环境变量。一旦进入某一env,所有操作均在该目录下进行,不会影响其他env环境。所以virtualenv实乃开发必备的武器。

安装virtualenv需要root或sudo权限:

# easy_install virtualenv

然后,创建一个env环境:

# mkdir /srv/vpython

# cd /srv/vpython

# virtualenv --no-site-packages shici

现在,就创建了一个虚拟的Python环境,名为shici,加上--no-site-packages是告诉virtualenv不从系统Python的site-packages下复制第三方的包。

进入虚拟shici环境:

# cd /srv/vpython/shici

# source bin/activate

会看到提示符前面多了一个(shici)。现在运行python,可以看到sys.path已经更改为/srv/vpython/shici目录下的各个包。

运行easy_install安装需要的包,现在安装的包将全部安装到shici环境中,不影响系统Python环境和其他env环境。

装完需要的包后,用deactivate命令退出虚拟环境。

第二步,修改/etc/init.d/uwsgi启动脚本,以vhost模式启动:

#if [ -f /etc/default/uwsgi ] ; then

# . /etc/default/uwsgi

#fi

#DAEMON_OPTS="-s 127.0.0.1:9001 -C -M 4 -t 30 -A 4 -p 4 -d /var/log/uwsgi.log --pythonpath $PYTHONPATH --module $MODULE"

DAEMON_OPTS="-s 127.0.0.1:9001 -C -M 4 -t 30 -A 4 -p 4 -d /var/log/uwsgi.log --no-site --vhost"

uwsgi启动脚本可以从Linode网站下载,请参考Debian Lenny安装nginx+uwsgi一文。

/etc/default/uwsgi配置文件不再需要,因此注释掉相应的部分。

将原有的DAEMON_OPTS注释掉,再添加一行,参数为--no-site --vhost。

第三步,修改nginx配置文件,对www.shi-ci.com的配置为:

...

server {

listen 80;

server_name www.shi-ci.com;

charset utf-8;

access_log /srv/logs/access-www.shi-ci.com.log;

error_log /srv/logs/error-www.shi-ci.com.log;

location / {

include uwsgi_params;

uwsgi_param UWSGI_SCRIPT shici_app;

uwsgi_param UWSGI_PYHOME /srv/vpython/shici;

uwsgi_pass 127.0.0.1:9001;

}

location /static {

root /srv/www.shi-ci.com/html/;

}

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

}

...

参数UWSGI_PYHOME指定了虚拟env的Python环境目录,UWSGI_SCRIPT则是包含application的入口模块。这里配置的shici_app,uwsgi将在PYTHONPATH中搜索模块shici_app.py。

测试发现,直接修改虚拟Python环境的bin/activate文件来export PYTHONPATH似乎不起作用,这样我们的站点目录/srv/www.shi-ci.com/py就无法被uwsgi搜索到。一个曲线解决方案是在虚拟的shici Python环境中直接创建一个shici_app.py的文件,位于/srv/vpython/shici/lib/python2.5/目录下,内容如下:

#!/usr/bin/env python

# -*- coding: utf-8 -*-

import sys

sys.path.append('/srv/www.shi-ci.com/py')

from app import application

这个shici_app.py的作用就是先将网站目录添加到sys.path中,然后,从app模块导入application即可。app.py位于/srv/www.shi-ci.com/py/,里面有类似application=app.wsgifunc()的语句。

所以真正的站点入口文件位于/srv/www.shi-ci.com/py/app.py,但是由于虚拟Python环境默认不包含该目录,会导致uwsgi导入app模块失败,因此,编写一个shici_app的wrapper模块,位于虚拟环境/srv/vpython/shici/lib/python2.5/目录下,让uwsgi导入shici_app模块,就可以顺利导入app模块。

要添加第二个站点,重复上述步骤,创建一个新的env,安装必要的包,然后配置nginx即可。

最后,重启uwsgi和nginx生效。

python uwsgi_uwsgi的多站点配置相关推荐

  1. Apache多站点配置详解

    2019独角兽企业重金招聘Python工程师标准>>> 本人第一篇技术博客,主要是把我自己的笔记做一个整理,并对之前学习做一个回顾和总结,也分享给大家,共同提高,好了,闲话少说,进入 ...

  2. python3.6.2怎样安装,python 3.6.2 安装配置方法图文教程

    python 3.6.2 安装配置方法图文教程 Windows下Python(pip)环境搭建(3.6)图解,供大家参考,具体内容如下 1.下载最新的Python安装:3.6.2 2.安装时不要选择默 ...

  3. wamp找不到服务器,WampServer服务器多站点配置后打不开phpMyAdmin的解决办法

    WampServer服务器多站点配置后打不开phpMyAdmin的解决办法 (Forbidden You don't have permission to access / on this serve ...

  4. nginx多站点配置,以及隐藏index.php

    一.nginx多站点的配置 1.默认安装的nginx在/etc/nginx下,则执行以下命令 sudo mkdir /etc/nginx/conf.d 这个conf.d作为我们放置多站点的目录 图中的 ...

  5. 怎么检查python是否安装成功-检查python以及django是否安装配置成功

    首先说明下,我使用pycharm作为开发的IDE,在第一次创建django项目的时候,会自动安装django包的.(网上也有很多单独安装的方法),环境变量配置成功后,就是用下面的方法检测安装成功与否. ...

  6. nginx 多站点配置方法集合

    nginx 多站点配置方法集合 作者: 字体:[增加 减小] 类型:转载 时间:2011-06-28 我要评论 关于nginx的多站设置,其实和apache很相似,假设我们已经有两个域名,分别是:ww ...

  7. Python Scrapy 安装及相关配置

    本文仅供学习交流使用,如侵立删!demo下载见文末 Python Scrapy 安装及相关配置 环境 win10 Python:3.6.7 Scrapy:2.4.1 Python 安装

  8. python phpstudy_Java、python及phpstudy的环境配置

    由于重装了系统,电脑上啥都没了,正好借此机会写一些从空白开始配置新电脑,希望多踩一点坑,才能帮更多的人解决问题. 本文是小白向的,学习过程中看到一些教程缺胳膊少腿,可能会漏掉一些博主觉得easy但是是 ...

  9. PHP语言Yii框架,Yii框架多语言站点配置方法分析【中文/英文切换站点】

    本文实例讲述了Yii框架多语言站点配置方法.分享给大家供大家参考,具体如下: 这里假设我们要建立 中文/英文 切换的站点 1. 设置全局默认的语言 文件添加代码:protected/config/ma ...

最新文章

  1. 使用PHP连接LDAP服务器
  2. 几种搜索引擎算法的研究
  3. 【Qt】QModbusDevice类
  4. UE4学习-材质快捷键及材质帮助手册
  5. mysql5.7主从复制遇到的坑
  6. 六招让你成职场超男超女
  7. vsftp 简单教程
  8. 音频录制和Speech语音识别(ios10)
  9. python--multiprocessing多进程总结
  10. 【图像分割】基于matlab粒子群算法优化模拟退火算法图像分割【含Matlab源码 2020期】
  11. 家里两台电脑怎么共享文件_家里两台电脑怎么共享文件
  12. stm32—火焰传感器的初步使用
  13. ARM Aarch32 中 A32 和 T32 的汇编编程的例子(call return stack 结构相关的指令)
  14. SQL查询语句可以执行,但是提示对象名无效
  15. 联想拯救者Y7000P和Y9000P的区别
  16. 在go mod中使用k8s.io/code-generator生成代码
  17. 【狂神说Java】Docker最新超详细版教程通俗易懂 - 学习笔记
  18. 手机上传图片文件只能打开相机
  19. 计算机的收获初一作文,初一开学一个月的收获和感受作文
  20. Java监听器的处理方法_Java监听器的简单使用

热门文章

  1. 使用SQL生成SQL语句时单引号的转义处理之q'{}'方法
  2. PhoneGap开发环境搭建
  3. ChaLearn Gesture Challenge_3:Approximated gradients源码简单分析
  4. NSTimer里的userInfo
  5. 中兴V880使用手记之二——取得root权限
  6. ASP.NET状态管理之五(Cookie)
  7. Linux 命令(80)—— chown 命令
  8. 致我唯一的kiyoumi
  9. cookie、session、sessionid 与jsessionid之间的关系
  10. C++ Primer 第十三章 拷贝控制