学习VirtualEnv和Nginx+uwsgi用于django项目部署

时间:2022-09-08 10:16:05

以下叙述中用到的操作系统:Linux CentOS 6.X。

最近几天了解一下VirtualEnv,Apache+Daemon mode,Nginx+uwsgi的概念,并且在项目中实验性部署了一下(目前我们的Django项目都使用Apache+mod_wsgi部署的,听说使用Nginx+uwsgi效率更高一些)。以下都是事后记录的安装部署过程,可能存在遗忘细节的地方。

  1. VirtualEnv

VirtualEnv的作用:创建隔离的Python环境,解决模块或库的版本冲突或依赖。

在实际开发过程中,不同项目可能使用不同版本的库,例如,我们使用的Web框架Django,老项目使用的老的版本1.2.3,新项目使用的是1.4或1.5版本。那时我使用了最笨办法,即修改Django目录以切换,幸好没有使用太多多版本库,不然累死。

    • 安装步骤(网上能找到很多安装VirtualEnv的URL,参考http://www.cnblogs.com/kym/archive/2011/12/29/2306428.html):
      • easy_install virtualenv #安装
      • virtualenv <myvenv>  #创建虚拟环境
      • 切换到虚拟环境<myvenv>目录运行source ./bin/activate #激活虚拟环境
      • 可以在虚拟环境安装使用包,例如安装Django:easy_install Django
      • 离开虚拟环境,使用命令:deactivate
    • 应用虚拟环境

   目前我们使用Apache+mod_wsgi部署Django项目的,项目可以通过以下方式使用虚拟环境:

      WSGI作为Apache子进程运行

      在httpd.conf中,可以VirtualHost上一行添加:WSGIPythonPath <myvenv path>/lib/python2.7/site-packages/.

     WSGI作为独立daemon进程运行(参考http://modwsgi.readthedocs.org/en/latest/configuration-directives/WSGIDaemonProcess.html

      在WSGIDaemonProcess指令后添加:python-path=<myvenv path>/lib/python2.7/site-packages。

      BTW:这种方式部署的时候,需要在httpd.conf中添加WSGISocketPrefix <full path>,否则web请求可能会503失败 (参考http://modwsgi.readthedocs.org/en/latest/configuration-directives/WSGISocketPrefix.html

  1. nginx&& uwsgi

  nginx可以作为WEB Server,反向代理,负载均衡等服务。

  

    • 安装参考

      nginx:http://wiki.nginx.org/Install,我选择的源码安装,安装后没有自启动的服务(网上有方法为nginx创建服务

      uwsgi:http://uwsgi-docs.readthedocs.org/en/latest/WSGIquickstart.html#installing-uwsgi-with-python-support

    • 为Django项目的配置

uwsgi的配置<project path>/uwsgi_XXX.ini如下(使用的是unix socke file方式进程通讯,在nginx也需要配相同路径文件)。注:如果要使用VirtualEnv虚拟环境,请设置home为虚拟环境路径。

# uwsgi_XXX.ini file
[uwsgi] # Django-related settings
# the base directory (full path)
chdir = /var/www/<project path>
# Django's wsgi file
module = <project name>.wsgi
# the virtualenv (full path)
home = <virtualenv path> uid=apache
gid=apache # process-related settings
# master
master = true
# maximum number of worker processes
processes =
# the socket (use the full path to be safe
socket = /var/www/<project path>/<project name>.sock
# ... with appropriate permissions - may be needed
# chmod-socket =
# clear environment on exit
vacuum = true daemonize = /var/log/uwsgi.log
stats = 0.0.0.0: pidfile=/var/www/<project path>/uwsgi.pid

另外需要在<project path>/<project name>/目录下创建文件wsgi.py。注:请记住添加PYTHON_EGG_CACHE,不然会报权限错误。

import os
os.environ['PYTHON_EGG_CACHE'] = '/<a path>/.python-eggs/' #为了防止Permission denied的web请求访问错误。
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "maps.settings") # This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

操作uwsgi进程(切换到<project path>目录下):

  • 启动:uwsgi --ini uwsgi_XXX.ini
  • 停止:uwsgi --stop uwsgi.pid
  • reload: uwsgi --reload uwsgi.pid

#------------------------------------------------------------------------------------

nginx的配置如下(由于uwsgi配置使用unix socket file进程通讯的)

user  apache; # 指定用户
worker_processes ;#启动2进程 pid logs/nginx.pid; #指定pid文件 events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream; sendfile on;
keepalive_timeout ; #gzip on;
upstream django {
server unix:///var/www/<项目path>/XXX.sock; # for a file socket
#server 127.0.0.1:; # for a web port socket (we'll use this first)
} server {
listen ;# listen port
server_name localhost; charset utf-; #error_page /.html; # redirect server error pages to the static page /50x.html
#
error_page /50x.html;
location = /50x.html {
root html;
}
location /media {
alias /var/www/<项目path>/media;
}
location / {
uwsgi_pass django;
include uwsgi_params; # the uwsgi_params file you installed
}

操作nginx进程:

  • 启动:/usr/local/nginx/sbin/nginx
  • 停止:/usr/local/nginx/sbin/nginx -s stop

That's all.

学习VirtualEnv和Nginx+uwsgi用于django项目部署的更多相关文章

  1. nginx&plus;uwsgi启动Django项目

    1.安装项目环境 系统环境:ubuntu16.04 python环境:python3.5.2 Django版本:django1.11.7 nginx环境:nginx_1.10.3 虚拟环境:virtu ...

  2. nginx&plus;uwsgi&plus;flask&plus;supervisor 项目部署

    环境 - Linux: Ubuntu 16.04 - uWSGI 2.0.18 - Flask 1.0.2 - supervisor 3.2.0 - nginx/1.8.1 首先区分几个概念 WSGI ...

  3. 阿里云搭建nginx &plus; uWSGI 实现 django 项目

    系统版本 CentOS/7 64位 1.安装使用python3 创建python3目录 sudo mkdir /usr/local/python3 进入python3目录 cd /usr/local/ ...

  4. Django项目部署&lpar;django&plus;guncorn&plus;virtualenv&plus;nginx&rpar;

    一.说明 为了django项目部署到生产环境上,能够稳定的运行,且能够同时指出http和https的访问,对django的部署进行了一些研究,决定采用django + gunicorn + virtu ...

  5. CentOS 环境下基于 Nginx uwsgi 搭建 Django 站点

    因为我的个人网站 restran.net 已经启用,博客园的内容已经不再更新.请访问我的个人网站获取这篇文章的最新内容,CentOS 环境下基于 Nginx uwsgi 搭建 Django 站点 以下 ...

  6. nginx &plus; uWSGI 为 django 提供高并发

    django 的并发能力真的是令人担忧,这里就使用 nginx + uwsgi 提供高并发 nginx 的并发能力超高,单台并发能力过万(这个也不是绝对),在纯静态的 web 服务中更是突出其优越的地 ...

  7. 使用gunicorn将django项目部署到生产环境的子目录下,在nginx后端获取客户真实IP地址

    生产环境有时,并不是为了一个项目而存在的.毕竟,域名是比较稀有的. 今天遇到这个问题,解决了.作个记录. 并且,如果将django项目部署在Nginx后面,那如何获取用户真实的IP地址呢? 下面就来解 ...

  8. Dockerfile &plus; Nginx&period;conf文件记录(用于前端项目部署)

    Dockerfile + Nginx.conf文件记录(用于前端项目部署) 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统(敏感信息都进行了处理),默认服 ...

  9. django项目部署过程

    django项目部署过程 1.上传代码 用git或者其他工具,如scp 代码上传后保证每个应用下的migrations文件夹里只有一个__init__.py文件,自己的迁移文件不要上传上来,具体的gi ...

随机推荐

  1. 杭电ACM 1196

    #include<stdio.h>int main(){ int num,j,k,s,f; int a[7]={0,0,0,0,0,0,0}; while(scanf("%d&q ...

  2. Asp&period;Net 获取FileUpload控件的文件路径、文件名、扩展名

    string fileNameNo = Path.GetFileName(FileUploadImg.PostedFile.FileName); //获取文件名和扩展名string Directory ...

  3. perl中-&gt&semi;和&equals;&gt&semi;作用

    -> 用法 -> 有两种用法,都和解引用有关. 第一种用法,就是解引用. 根据 -> 后面跟的符号的不同,解不同类型的引用, ->[] 表示解数组引用,->{} 表示解散 ...

  4. seg格式文件的分析

    s ,r, c1, c2   第r行的c1列到 c2列的值为s

  5. 使用QEMU创建虚拟机

    下载安装: wget http://wiki.qemu-project.org/download/qemu-2.0.0.tar.bz2 tar xjvf qemu- ./configure --ena ...

  6. Android 即时语音聊天工具 开发

    使用融云SDK 1. 功能需求分析 1.1 核心功能需求: * 即时通讯 * 文字聊天 * 语音聊天 1.2 辅助功能需求: * 注册.登录 * 好友添加功能 * 好友关系管理 2. 融云即时通讯平台 ...

  7. Hibernate学习(2)- hibernate&period;cfg&period;xml详解

    1:主配置文件主要分为三部分: 注意:通常情况下,一个session-factory节点代表一个数据库: 1.1:第一部分 数据库连接部分,注意"hibernate.connection.d ...

  8. MySQL数据库事务及其特性

    一.事务概念 事务就是一个程序执行单元,里面的操作要么都做,要么都不做. 二.事务特性 事务有四个非常重要的特性(ACID): 原子性(Atomicity):事务是不可分割的整体,所有操作要么全做,要 ...

  9. Angularjs 过滤器使用

    Filter:格式化数据 // HTML表达式: {{ filter_expression | filter : expression : comparator}}   // JS表达式: $filt ...

  10. iptables精通

    前提基础: 当主机收到一个数据包后,数据包先在内核空间中处理,若发现目的地址是自身,则传到用户空间中交给对应的应用程序处理,若发现目的不是自身,则会将包丢弃或进行转发. iptables实现防火墙功能 ...