Python开发之Nginx+uWSGI+virtualenv多项目部署教程

1、新建独立运行环境,命名为env

[root@vultr ~]# mkdir projects # 测试的项目总目录
[root@vultr ~]# pip3 install virtualenv
[root@vultr ~]# cd projects
[root@vultr projects]# virtualenv env --python=python3 --no-site-packages
--python:指定Python版本
--no-site-packages:不复制系统已安装Python包

2、激活虚拟环境

[root@vultr projects]# source env/bin/activate

执行后命令提示符前面会出现一个env,变成(env)[root@vultr opt]#,退出虚拟环境执行deactivate即可。

3、安装项目依赖:

pip3 install, 在虚拟环境中安装的包,不会对系统环境造成影响。

Django项目配置

1、上传Django项目: Hello项目

目录结构:

Hello/
 apps/
 Hello/
 manage.py

2、配置项目的数据库信息:vi Hello/Hello/settings.py

如果是远程服务器,需要修改setting.py文件中的ALLOWED_HOSTS:

ALLOWED_HOSTS = ['*']

3、数据迁移

(env)[root@vultr Hello]# python3 manage.py makemigrations
(env)[root@vultr Hello]# python3 manage.py migrate

4、收集静态文件:vi Hello/Hello/settings.py

STATIC_ROOT = os.path.join(BASE_DIR, "static")

:wq保存后,执行

(env)[root@vultr Hello]# python3 manage.py collectstatic --noinput

5、用runserver启动项目,看是否正常运行

(env)[root@vultr Hello]# python3 manage.py runserver 0.0.0.0:8088

uWSGI配置

deactivate退出虚拟环境

1、安装uWSGI

[root@vultr Hello]# pip3 install uWSGI

2、命令行运行测试

在 项目目录Hello 下,执行以下命令:

[root@vultr Hello]# uwsgi --http ip:端口 --home /root/env/ --file Hello/wsgi.py --static-map=/static=static

--home:指定虚拟环境的目录

wsgi.py:Django创建项目时生成的文件

如果访问URL正常,说明Python虚拟环境和uWSGI没有问题.

3、使用ini配置文件来启动uWSGI

我习惯性创建projects目录,目录结构如下:

/root/projects/
   script/  --> 存放uWSGI相关的文件,例如uwsgi.ini, uwsgi.pid...
   Hello/ --> 项目目录
     apps/ --> 应用程序目录
     Hello/ --> settings.py等文件所在目录
     static/
   env/ --> 虚拟环境目录

[root@vultr projects]# vi script/uwsgi.ini

[uwsgi]
# 项目目录
chdir=/root/projects/Hello/
# 虚拟环境目录
home=/root/projects/env/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=Hello.wsgi:application
# 指定sock的文件路径
socket=/root/projects/script/uwsgi.sock
# 启用主进程
master=true
# 进程个数
workers=5
pidfile=/root/projects/script/uwsgi.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/root/projects/script/uwsgi.log

4、后台启动停止uWSGI的命令

[root@vultr projects]# uwsgi --ini script/uwsgi.ini # 启动
[root@vultr projects]# uwsgi --stop script/uwsgi.pid # 停止

Nginx配置

1、 配置yum:

[root@vultr projects]# vi /etc/yum.repos.d/nginx.repo

[nginx]
name=nginx repo
# 下面这行centos根据你自己的操作系统修改比如:OS/rehel
# 6是你Linux系统的版本,可以通过URL查看路径是否正确
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

2、 安装: yum -y install nginx

3、添加配置文件

[root@vultr projects]# vi /etc/nginx/conf.d/Hello.conf  # 名字是随便起的,建议跟项目目录一样

server {
 listen 84; # 端口
 server_name 10.129.205.183 ; # 域名
 access_log /var/log/nginx/access.log main;
 charset utf-8;
 gzip on;
 gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;

 error_page 404   /404.html;
 error_page 500 502 503 504 /50x.html;
 # 指定项目路径uwsgi
 location / {
  include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
  uwsgi_connect_timeout 30; # 超时时间
  uwsgi_pass unix:/root/projects/script/uwsgi.sock;
 }
 # 指定静态文件路径
 location /static/ {
 alias /root/projects/Hello/static/;
 index index.html index.htm;
 }
}

4、启动与停止Nginx

检查uWSGI是否启动了

[root@vultr projects]# ps -ef | grep uwsgi
root  2299  1 0 06:22 ?  00:00:00 uwsgi --ini script/uwsgi.ini
root  2301 2299 0 06:22 ?  00:00:00 uwsgi --ini script/uwsgi.ini
root  2302 2299 0 06:22 ?  00:00:00 uwsgi --ini script/uwsgi.ini
root  2303 2299 0 06:22 ?  00:00:00 uwsgi --ini script/uwsgi.ini
root  2304 2299 0 06:22 ?  00:00:00 uwsgi --ini script/uwsgi.ini
root  2305 2299 0 06:22 ?  00:00:00 uwsgi --ini script/uwsgi.ini
root  2306 2299 0 06:22 ?  00:00:00 uwsgi --ini script/uwsgi.ini
root  2361 2016 0 06:32 pts/1 00:00:00 grep uwsgi

启动Nginx

[root@vultr projects]# /etc/init.d/nginx start

访问URL,见证奇迹的时刻到了,然后...

ok,报错了,莫慌。度娘查了502是服务器错误,然而前面测试了Django+uWSGI没问题,所以最有可能是在Nginx出错了。

来,我们查看一下Nginx的错误日志文件,日志文件在哪呢???

[root@vultr projects]# find / -name nginx.conf
/etc/nginx/nginx.conf
[root@vultr projects]# vi /etc/nginx/nginx.conf

error_log参数就是错误日志文件了,让我们再打开error.log文件,找到最后一条记录:

2019/05/12 06:41:43 [crit] 1514#1514: *2 connect() to unix:/root/projects/script/uwsgi.sock failed (13: Permission denied) while connecting to upstream, ...(后面省略)

从 failed (13: Permission denied) while connecting to upstream 可以看出是没有权限???原因是我贪图方便, 直接把项目文件以及uWSGI文件放在了/root/目录下 !!!

好,修改路径,先停止Nginx和uWSGI,再修改路径/root/projects/更改为/opt/projects/:

[root@vultr projects]# uwsgi --stop script/uwsgi.pid
[root@vultr projects]# /etc/init.d/nginx stop
停止 nginx:            [确定]
[root@vultr projects]# cd ..
[root@vultr ~]# mv projects /opt/
[root@vultr ~]# cd /opt/projects/

然后将script/uwsgi.ini和/etc/nginx/conf.d/Hello.conf中关于路径的都修改过来,修改好后,再次启动uWSGI和Nginx:

[root@vultr projects]# uwsgi --ini script/uwsgi.ini
[uWSGI] getting INI configuration from script/uwsgi.ini
[root@vultr projects]# /etc/init.d/nginx start

正在启动 nginx:                                           [确定]

再次访问URL, 访问正常。

多项目部署

利用virtualenv可以在服务器上配置多个Python运行环境,因此根据Nginx、uWSGI、virtualenv可以实现一个服务器上运行多个项目,且互不干扰。

首先我们先来了解一下Nginx+uWSGI通信原理。

请求首先交给Nginx,如果是静态内容Nginx就直接处理了,如果是动态内容就将请求交给uWSGI服务器,Nginx和uWSGI之间是通过Socket来通信的,通信协议就是/etc/nginx/conf.d/Hello.conf里配置的uwsgi_params文件。

那么,现在我们来梳理一下,Nginx是怎么知道uWSGI在哪里?通过什么和uWSGI做Socket通信,回看/etc/nginx/conf.d/Hello.conf文件:

原来是根据uwsgi_pass指定了Nginx与uWSGI通信的Socket文件路径,看到这,就知道好办了,一个项目配置一个uwsgi.ini文件和nginx.conf里的一个server,那既然需要部署多个项目,那就是多个uwsgi.ini和nginx.conf里的多个server。

好的,我们开始测试:

1、配置虚拟环境以及测试用runserver运行Django项目是否正常。 我的目录结构是:

opt/
 projects/
  Hello/ --> 第一个Django项目
  env/  --> 第一个Django项目的虚拟环境
  World/ --> 第二个Django项目
  env_1/ --> 第二个Django项目的虚拟环境
  script/ --> uwsig.ini等文件存放

2、配置World项目的uwsgi_world.ini文件

[root@vultr projects]# vi script/uwsgi_w.ini

[uwsgi]
# 项目目录
chdir=/opt/projects/World/
# 虚拟环境目录
home=/opt/projects/env_1/
# 启动uwsgi的用户名和用户组
uid=root
gid=root
# 指定项目的application
module=World.wsgi:application
# 指定sock的文件路径
socket=/opt/projects/script/uwsgi_w.sock
# 启用主进程
master=true
# 进程个数
workers=5
pidfile=/opt/projects/script/uwsgi_w.pid
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum=true
# 序列化接受的内容,如果可能的话
thunder-lock=true
# 启用线程
enable-threads=true
# 设置自中断时间
harakiri=30
# 设置缓冲
post-buffering=4096
# 设置日志目录
daemonize=/opt/projects/script/uwsgi_w.log

3、配置Nginx

# 可以分开多个配置文件,这里我放在同一个配置文件里
[root@vultr projects]# vi /etc/nginx/conf.d/Hello.conf

server {
 listen 84; # 端口,请注意端口
 server_name 10.129.205.183 ; # 域名
 access_log /var/log/nginx/access.log main;
 charset utf-8;
 gzip on;
 gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;

 error_page 404   /404.html;
 error_page 500 502 503 504 /50x.html;
 # 指定项目路径uwsgi
 location / {
  include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
  uwsgi_connect_timeout 30; # 超时时间
  uwsgi_pass unix:/opt/projects/script/uwsgi.sock;
 }
 # 指定静态文件路径
 location /static/ {
 alias /opt/projects/Hello/static/;
 index index.html index.htm;
 }
}

server {
 listen 86; # 端口,请注意端口
 server_name 10.129.205.183 ; # 域名
 access_log /var/log/nginx/access.log main;
 charset utf-8;
 gzip on;
 gzip_types text/plain application/x-javascript text/css text/javascript application/x-httpd-php application/json text/json image/jpeg image/gif image/png application/octet-stream;

 error_page 404   /404.html;
 error_page 500 502 503 504 /50x.html;
 # 指定项目路径uwsgi
 location / {
  include uwsgi_params; # 加载nginx和uwsgi的通信协议模块
  uwsgi_connect_timeout 30; # 超时时间
  uwsgi_pass unix:/opt/projects/script/uwsgi_w.sock;
 }
 # 指定静态文件路径
 location /static/ {
 alias /opt/projects/World/static/;
 index index.html index.htm;
 }
}

4、启动uWSGI和Nginx,访问两个端口的URL。 ok,访问正常。

总结

以上所述是小编给大家介绍的Python开发之Nginx+uWSGI+virtualenv多项目部署教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 在Docker上开始部署Python应用的教程

    几周前, Elastic Beanstalk声明在AWS云中配置和管理Docker容器.在本文中,我们通过一个简单的注册表单页面应用去理解Docker部署过程,该表单使用Elastic Beanstalk Python环境. 关于注册表单应用 几个月之前,我们就已经开发完这个应用并且发表在博客上.有4部分视频和一篇文章"Using DynamoDB and SNS with Elastic Beanstalk in any Supported AWS Region".今天,我们将在这部

  • Python Web框架Tornado运行和部署

    本文实例为大家分享了Python Web框架Tornado运行和部署的详细内容,供大家参考,具体内容如下 一.运行和部署 因为Tornado内置了自己的HTTPServer,运行和部署它与其他Python web框架不太一样.你需要写一个main()函数来启动服务,而不是配置一个WSGI容器来运行你的应用: def main(): app = make_app() app.listen(8888) IOLoop.current().start() if __name__ == '__main__

  • 使用SAE部署Python运行环境的教程

    因为 GAE 在国内访问不便,所以平时有一些小应用,我都会放在 SAE 上面, 虽然 SAE 还有很多缺陷,但算是上手比较容易的一个了,最起码文档写的不错. 开发 SAE 上的应用,我一般都用 Flask,SAE 预装了 Flask,所以你可以直接用, 但我们难免会用一些没有预装的库. 如果是在以前,可能需要自己将 package 挨个 copy 到应用目录中,然后手动加载, 现在嘛,不需要那么麻烦了,SAE 有个非常不错的解决方案,见<安装依赖的第三方包> 你可以使用 saecloud 来代

  • 在Linux系统上部署Apache+Python+Django+MySQL环境

    Linux+apache+mysql+python+mod_python+Django 说明:系统rhel 5.3,默认安装httpd.mysql,没有安装的,请下载安装RPM包,删除/etc/httpd/modules/mod_python.so,如果有的话. 一.安装python wget http://www.python.org/ftp/python/2.7.1/Python-2.7.1.tgz  tar xfz mod_python-2.7.11.tgz cd python-2.7.1

  • Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程

    rabbitmq中文翻译的话,主要还是mq字母上:Message Queue,即消息队列的意思.前面还有个rabbit单词,就是兔子的意思,和python语言叫python一样,老外还是蛮幽默的.rabbitmq服务类似于mysql.apache服务,只是提供的功能不一样.rabbimq是用来提供发送消息的服务,可以用在不同的应用程序之间进行通信. 安装rabbitmq 先来安装下rabbitmq,在ubuntu 12.04下可以直接通过apt-get安装: sudo apt-get insta

  • Ubuntu部署python3.5的开发和运行环境

    1 概述 由于最近项目全部由python2.x转向 python3.x(使用目前最新的 python3.5.1) ,之前的云主机的的默认python版本都面临升级,故进行了升级后将相应的步骤记录下来,作为学习笔记吧. 服务器运行环境: ubuntu 14 LTS Server 本安装方式具有如下特点: 不影响已经有的python环境 增量式安装 完全隔离的沙盒环境 甚至可以不需要root权限 2 下载 在python官网下载指定平台下的python3.5的环境 wget https://www.

  • Python部署web开发程序的几种方法

    1.fastcgi ,通过flup模块来支持,在nginx里对应的配置指令是 fastcgi_pass 2.http,nginx使用proxy_pass转发,这个要求后端appplication必须内置一个能处理高并发的http server,在python的web框架当中,只能选择tornado. 3.uwsgi,包括4部分组成: uwsgi协议 web server内置支持协议模块 application服务器协议支持模块 进程控制程序 nginx从0.8.4开始内置支持uwsgi协议,uw

  • 使用PyCharm配合部署Python的Django框架的配置纪实

    安装软件 安装 Python 2.7.PyCharm.pip(Python包管理工具).Django ( pip install Django) 部署 PyCharm 新建Django工程 完成后,其目录如下: 子目录MyDjangoProject下表示工程的全局配置,分别为setttings.py.urls.py和wsgi.py,其中setttings.py包括了系统的数据库配置.应用配置和其他配置,urls.py则 表示web工程Url映射的配置. 子目录student则是在该工程下创建的a

  • Python自动化部署工具Fabric的简单上手指南

    Fabric 是基于 SSH 协议的 Python 工具,相比传统的 ssh/scp 方式,用 Python 的语法写管理命令更易读也更容易扩展,管理单台或者多台机器犹如本地操作一般. 官网地址:http://fabfile.org 安装 省略python.pip管理工具安装过程 pip install fabric 验证是否安装成功 进入python编辑模式,输入代码,无错即表示成功安装 from fabric.api import local fabric版hello world fabri

  • Python开发之Nginx+uWSGI+virtualenv多项目部署教程

    1.新建独立运行环境,命名为env [root@vultr ~]# mkdir projects # 测试的项目总目录 [root@vultr ~]# pip3 install virtualenv [root@vultr ~]# cd projects [root@vultr projects]# virtualenv env --python=python3 --no-site-packages --python:指定Python版本 --no-site-packages:不复制系统已安装P

  • python开发之Docker入门安装部署教程

    一.安装Docker 安装环境: 系统:CentOS Linux7 x86_64 安装脚本 wget -qO- https://get.docker.com/ | sh 回车后系统就开始安装docker 安装完成后可以通过以下脚本查看安装结果 docker --version 通过上面的脚本可以查看当前docker的版本,若出现版本信息则说明安装成功 docker system info 执行上面脚本如果出现"Cannot connect to the Docker daemon at"

  • python开发之for循环操作实例详解

    本文实例讲述了python开发之for循环操作.分享给大家供大家参考,具体如下: 下面是我做的一些学习记录供大家参考: #基本的for循环语句 test_list = [2,"Jone",3,6,7,'hongten','hanyuan','good',"Tom"] #打印列表的长度 print(len(test_list)) #遍历列表 for i in test_list: print(i) test_str = "hello,i'm hongten&

  • python开发之thread实现布朗运动的方法

    本文实例讲述了python开发之thread实现布朗运动的方法.分享给大家供大家参考,具体如下: 这里我将给大家介绍有关python中thread来实现布朗运动的一个例子 下面是运行效果: 代码部分: # Brownian motion -- an example of a multi-threaded Tkinter program. from tkinter import * import random import threading import time import sys #画布大

  • python开发之tkinter实现图形随鼠标移动的方法

    本文实例讲述了python开发之tkinter实现图形随鼠标移动的方法.分享给大家供大家参考,具体如下: 做这个东西的时候,灵感源自于一个js效果: 两个眼睛随鼠标移动而移动 运行效果: 代码部分: from tkinter import * #1.获取到小圆当前的圆心坐标(x1, y1) #2.获取到小圆移动的圆心坐标(x2, y2) #3.把小圆从坐标(x1, y1)移动到坐标(x2, y2) __author__ = {'name' : 'Hongten', 'mail' : 'hongt

  • python开发之str.format()用法实例分析

    本文实例分析了python开发之str.format()用法.分享给大家供大家参考,具体如下: 格式化一个字符串的输出结果,我们在很多地方都可以看到,如:c/c++中都有见过 下面看看python中的字符串格式函数str.format(): #使用str.format()函数 #使用'{}'占位符 print('I\'m {},{}'.format('Hongten','Welcome to my space!')) print('#' * 40) #也可以使用'{0}','{1}'形式的占位符

  • python开发之IDEL(Python GUI)的使用方法图文详解

    本文讲述了python开发之IDEL(Python GUI)的使用方法.分享给大家供大家参考,具体如下: 在安装完Python后,我们希望能够运用python GUI来运行一些我们编写的程序,那么Python GUI怎样用呢? 看完这篇blog,也许你就会使用Python GUI来编写你自己的程序了. 下面我们就来看看Python GUI是怎样使用的吧! 1. 新建一个文件 我们新建一个文件,名字随便,我这里命名为: test_hello.py 2. 用Python GUI打开文件 我们可以选择

  • python开发之list操作实例分析

    本文实例分析了python开发之list操作.分享给大家供大家参考,具体如下: 对python中list的操作,大家可以参考<Python list操作用法总结> 以下是我个人的笔记: #python list ''' 创建list有很多方法: 1.使用一对方括号创建一个空的list:[] 2.使用一对方括号,用','隔开里面的元素:[a, b, c], [a] 3.Using a list comprehension:[x for x in iterable] 4.Using the typ

  • python开发之thread线程基础实例入门

    本文实例讲述了python开发之thread线程基础.分享给大家供大家参考,具体如下: 说到线程,我们要知道啥是串行,啥是并行程序 举个例子: 串行程序,就是一个一个的执行程序 #python threading import time ''' 每一秒中,输出:this is a demo! ''' def serial(): '''串行输出''' time.sleep(1) print('this is a demo!') def main(): for i in range(5): seri

  • nginx+uwsgi启动Django项目的详细步骤

    当我们在用django开发的web项目时,开发测试过程中用到的是django自带的测试服务器,由于其安全及稳定等性能方面的局限性,django官方并不建议将测试服务器用在实际生产. nginx+uwsgi+django是我们常用的django部署方式.nginx作为最前端的服务器,他负责接收所有的客户端请求,对于请求的静态文件,由nginx服务器自己完成,因为它具有很好处理静态文件的能力,性能进行过优化,支持高并发量:uWSGI服务器作为支持服务器,是用来服务nginx的,nginx将请求的动态

随机推荐