前言

本人能力有限,本文只是简单介绍基础部署流程,没有过多考虑系统安全等因素,请谅解。初学者参考了解,大神勿喷。

纯测试部署,采用阿里云ECS,系统Ubuntu 16.04 64位,部署采用nginx+gunicorn+virtualenv+supervisor常用部署方式。

软件介绍

nginx:轻量级高性能的Web 服务器/反向代理服务器,可处理静态资源,负载均衡等, 是Apache服务器不错的替代品。

gunicorn:Python WSGI HTTP Server for UNIX。只支持在Unix系统上运行,使用prefork master-worker模型,一般用来管理多个进程,有进程挂了Gunicorn可以把它拉起来,防止服务器长时间停止服务,还可以动态调整 worker 的数量。中文文档

supervisor:基于linux操作系统的一款服务器管理工具,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能。项目部署的目的是监控启动 Gunicorn,即使Gunicorn 的管理进程挂了也可以自动起来。

virtualenv:创建独立的python环境,多项目开发过程中常用。具体介绍:virtuanenv

软件安装

sudo apt-get update //更新源
sudo apt upgrade //更新软件 sudo apt-get install python-virtualenv //安装python虚拟环境 sudo apt-get install supervisor //安装supervisor sudo apt-get install nginx //安装nginx sudo apt-get install mysql-server //安装mysql
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev

创建权限组

出于安全和方便管理的目的,使用专门的用户组来操作web应用。

添加用户组。groupadd 添加用户组;--system 指定将要添加的用户组是系统级别的;webapps 为用户组的名字。

sudo groupadd --system webapps

添加用户。useradd 添加用户;–gid 指定用户所属的组,后面紧跟的webapps就指定了用户属于webapps组;–shell 用户使用shell的路径,即/bin/bash;–home 用户home文件夹位置,即/webapps,方便操作;qaq 为用户名(最好要有意义。

sudo useradd --system --gid webapps --shell /bin/bash --home /webapps qaq

修改用户。在sudoers文件中,在root ALL=(ALL:ALL) ALL下一行添加qaq ALL=(ALL:ALL) ALL。

sudo passwd qaq //为新用户设置密码

sudo vim /etc/sudoers //给用户添加执行sudo命令的权限

sudo mkdir -p /webapps //创建工作目录
sudo chowm qaq /webapps //用户授权

创建项目虚拟环境

创建虚拟环境的时候千万注意不能使用sudo,不然的话创建出来的venv文件夹属于root用户,之后操作会出现权限问题。pip安装第三方包的时候也要注意不能用sudo。

sudo su - qaq //切换用户
sudo mkdir learnDjango //新建项目目录
cd learnDjango //进入项目目录 virtualenv -p /usr/bin/python3.5 --no-site-packages venv //新建python虚拟环境 source venv/bin/activate //激活虚拟环境

关于virturlenv的使用,请参考:#Python学习#python虚拟环境——virtualenv

创建Django项目

(1)安装Django和Gunicorn(虚拟环境),注意不要使用sudo前缀,安装完毕之后可以通过pip list命令查看当前安装的第三方包列表。

pip install django
pip install gunicorn
pip install psycopg2

(2)创建django项目,名为learn,并初始化数据库。

通过vim编辑项目的设置文件,找到ALLOWED_HOSTS = []这一行,将其改为ALLOWED_HOSTS = ['*'],表示Django站点可以投放任意的主机/域名。在INSTALLED_APPS = [···]中添加gunicorn。保存退出。

django-admin startproject learn //新建项目

cd learn //切换目录

python manage.py migrate //初始化数据库

sudo vim /learn/settings.py //编辑设置文件

(3)启动开发服务器,验证django项目可以正常运行。注意其中的IP地址换成本机的IP,云服务器的话是私有IP。

python manage.py runserver xxx.xxx.xxx.xxx:8000 //启动项目

如果你有界面,你可以使用浏览器访问xxx.xxx.xxx.xxx:8000;如果是云服务器,有一个神奇的好用的第三方包,叫做w3m,通过apt-get安装后,使用命令:w3m xxx.xxx.xxx.xxx:8000可以在终端访问网页。访问成功代表Django项目正常运行。

配置Gunicorn

在项目目录(/webapps/learnDjango/learn/)下,新建配置文件gunicorn.conf(vim gunicorn.conf)。内容如下,注意其中提到的127.0.0.1:9000这个地址。

import multiprocessing
bind = "127.0.0.1:9000"
workers = 2
errorlog = '/webapps/learnDjango/logs/gunicorn.error.log'
#accesslog = ''/webapps/learnDjango/logs/gunicorn.access.log'
#loglevel = 'debug'
proc_name = 'gunicorn_learnDjango_project'

当然,你会发现其中提到一个日志文件,需要对应地创建。

mkdir -p /webapps/learnDjango/logs/
touch /webapps/learnDjango/logs/gunicorn.error.log

测试一下能不能用,输入如下命令,会输出一个进程ID暂时也看不出可不可用,待会再说了。简单来说,gunicorn就是代替“python manage.py runserver xxx.xxx.xxx.xxx:8000 //启动项目”命令的,当然作用不仅仅于此。

nohup gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf&

配置Supervisor

supervisor是一个监视和管理进程的工具,在进程当掉之后,可以重启。因此适合用此来启动服务器进程。

(1)创建配置文件。/etc/supervisor/conf.d目录下创建learn_supervisor.conf。内容如下:

[program:learn]
command=/webapps/learnDjango/venv/bin/gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf
user=qaq
stdout_logfile = /webapps/learnDjango/logs/gunicorn_supervisor.log
autostart=true
autorestart=true
redirect_stderr = true

(2)启动并运行

注意: 记得清空记录,不然会报一个Another....的错误。

sudo unlink /var/run/supervisor.sock //清空记录

sudo supervisord -c /etc/supervisor/supervisord.conf //启动

sudo supervisorctl -c /etc/supervisor/supervisord.conf //管理

不出意料,上述代码直接运行报错,百度错误。最后得到的结果是配置文件写的有问题。什么问题了?最后发现是没有进入虚拟环境运行gunicorn命令,想想也是,gunicorn是安装在虚拟环境中,那么如何进入虚拟环境呢?需要利用命令source。那就在前面加一行吧。

command=source /webapps/learnDjango/venv/bin/avtivate ; /webapps/learnDjango/venv/bin/gunicorn learn.wsgi:application -c  /webapps/learnDjango/learn/gunicorn.conf

运行还是报错,告诉我can'ot find command ‘source’,最后找到的解决办法:Supervisor source command not found 如何解决。原来source必须使用bash才能执行。最后的文件如下:

learn_supervisor.conf

[program:learn]
command=bash /webapps/learnDjango/learn/init.sh
directory=/webapps/learnDjango/learn
user=qaq
stdout_logfile=/webapps/learnDjango/logs/gunicorn_supervisor.log
autostart=true
autorestart=true
redirect_stderr=true [supervisorctl]

init.sh

#! /bin/bash

source /webapps/learnDjango/venv/bin/avtivate
/webapps/learnDjango/venv/bin/gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf

(2)使用supervisor

sudo supervisord -c supervisord.conf                             通过配置文件启动supervisor
sudo supervisorctl -c supervisord.conf status 察看supervisor的状态
sudo supervisorctl -c supervisord.conf reload 重新载入 配置文件
sudo supervisorctl -c supervisord.conf start [all]|[appname] 启动指定/所有 supervisor管理的程序进程
sudo supervisorctl -c supervisord.conf stop [all]|[appname] 关闭指定/所有 supervisor管理的程序进程

关于更多supervisor操作,请参考:使用 supervisor 管理进程

配置nginx

(1)创建配置文件。在项目目录下(/webapps/learnDjango/learn/),新建配置文件learn_nginx.conf。内容如下,注意到其中proxy_pass参数对应的正是刚才gunicorn配置文件中绑定的地址。对了这里同样提到了两个日志文件,记得在logs文件夹下创建。

server {
listen 8500;
server_name 47.94.99.248;
access_log /webapps/hello/logs/nginx.access.log;
error_log /webapps/hello/logs/nginx.error.log;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

可以看出这个 配置文件十分简陋,没有什么额外信息,知识基础而已。关于nginx配置的更多内容,请参考:。

(2)链接到对应的配置文件。需要sudo权限。

ln -s /webapps/learnDjango/learn/learn_nginx.conf /etc/nginx/conf.d/learn_nginx.conf

(2)大功告成,现在测试一下能不能用吧!

可以发现,直接访问云服务器IP地址是可以显示nginx的默认页面(80端口),但是8500端口为什么不能用呢?不是我们配置的问题,而是云服务器配置的问题。进入实例管理页面,点击左边“本实例安全组”->“配置规则”,添加安全组规则,端口范围写我们nginx监听的8500。

OK,最后两步,需要两个终端,分别执行gunicore和重启nginx。

nohup gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf&

service nginx restart

参考链接

Setting up Django with Nginx, Gunicorn, virtualenv, supervisor and PostgreSQL

阿里云部署Django项目(超详细图文教程)


本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.


#阿里云#云服务器部署Django(基础篇)的更多相关文章

  1. 阿里云ECS服务器部署HADOOP集群(二):HBase完全分布式集群搭建(使用外置ZooKeeper)

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...

  2. 阿里云ECS服务器部署HADOOP集群(三):ZooKeeper 完全分布式集群搭建

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建,多添加了一个 datanode 节点 . 1 节点环境介绍: 1.1 环境介绍: 服务器:三台阿里 ...

  3. 阿里云ECS服务器部署HADOOP集群(六):Flume 安装

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建. 1 环境介绍 一台阿里云ECS服务器:master 操作系统:CentOS 7.3 Hadoop ...

  4. 阿里云ECS服务器部署HADOOP集群(七):Sqoop 安装

    本篇将在 阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建 阿里云ECS服务器部署HADOOP集群(二):HBase完全分布式集群搭建(使用外置ZooKeeper) 阿 ...

  5. 阿里云ECS服务器部署HADOOP集群(五):Pig 安装

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建. 1 环境介绍 一台阿里云ECS服务器:master 操作系统:CentOS 7.3 Hadoop ...

  6. 阿里云ECS服务器部署HADOOP集群(四):Hive本地模式的安装

    本篇将在阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建的基础上搭建. 本地模式需要采用MySQL数据库存储数据. 1 环境介绍 一台阿里云ECS服务器:master ...

  7. 阿里云ECS服务器部署HADOOP集群(一):Hadoop完全分布式集群环境搭建

    准备: 两台配置CentOS 7.3的阿里云ECS服务器: hadoop-2.7.3.tar.gz安装包: jdk-8u77-linux-x64.tar.gz安装包: hostname及IP的配置: ...

  8. thinkphp项目阿里云ECS服务器部署

    [日记]thinkphp项目阿里云ECS服务器部署   项目本地开发告一段落.准备上传到服务器上测试 技术组成 thinkphp+mysql+阿里ECS  代码管理方式git 一.阿里ECS服务器配置 ...

  9. 01: Django基础篇

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

随机推荐

  1. 开始Java之旅

      从今天起,cgg将给大家讲讲Java这种神奇的东西.   至于配置环境变量,大家可以看看我的博客:环境变量上面有详细解释.   下面先给大家一个公式:    public class [文件名]{ ...

  2. 使用delphi 开发多层应用(十九) ios通过soap 访问kbmmw服务器

    随着delphi XE4 的推出,开始真正意义上支持ios 的开发,由于目前kbmmw 还不完全支持ios 的开发,因此 无法直接使用kbmmw 的客户端访问kbmmw 的服务器(虽然kbmmw 也提 ...

  3. java如何从一段html代码中获取图片的src路径

    java如何从一段html代码中获取图片的src路径 package com.cellstrain.icell.Test; import java.util.ArrayList;import java ...

  4. 2018.07.08 hdu5316 Magician(线段树)

    Magician Problem Description Fantasy magicians usually gain their ability through one of three usual ...

  5. gj10 python socket编程

    10.1 HTTP.Socket.TCP这几个概念 五层网络模型 socket 不属于任何协议,是一个API,通过socket 可以和传输层的打交道,然后在之上可以实现自己的功能和协议 10.2 cl ...

  6. dj cookie & session组件

    Cookie概述 什么叫Cookie Cookie翻译成中文是小甜点,小饼干的意思.在HTTP中它表示服务器送给客户端浏览器的小甜点.其实Cookie是key-value结构,类似于一个python中 ...

  7. RESTful架构概念

    本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...

  8. where /group by/ having/ order by/

    1.order by 是 按字段 进行排序.. 字段后面可跟 desc 降序..asc 升序..默认为升序2.group by 是进行分组 查询3.having 和 where 都属于 条件过滤 区别 ...

  9. linux导出Excel The maximum column width for an individual cell is 255 characters

    linux环境到处Excel报错: The maximum column width for an individual cell is 255 characters 解决方案: for (int i ...

  10. Hibernate中OpenSessionInViewFilter(通常配置在web.xml文件中)的作用

    Spring为我们解决Hibernate的Session的关闭与开启问题. Hibernate 允许对关联对象.属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Sessio ...