前言

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

纯测试部署,采用阿里云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

软件安装

  1. sudo apt-get update //更新源
  2. sudo apt upgrade //更新软件
  3. sudo apt-get install python-virtualenv //安装python虚拟环境
  4. sudo apt-get install supervisor //安装supervisor
  5. sudo apt-get install nginx //安装nginx
  6. sudo apt-get install mysql-server //安装mysql
  7. sudo apt-get install mysql-client
  8. sudo apt-get install libmysqlclient-dev

创建权限组

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

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

  1. sudo groupadd --system webapps

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

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

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

  1. sudo passwd qaq //为新用户设置密码
  2. sudo vim /etc/sudoers //给用户添加执行sudo命令的权限
  3. sudo mkdir -p /webapps //创建工作目录
  4. sudo chowm qaq /webapps //用户授权

创建项目虚拟环境

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

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

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

创建Django项目

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

  1. pip install django
  2. pip install gunicorn
  3. pip install psycopg2

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

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

  1. django-admin startproject learn //新建项目
  2. cd learn //切换目录
  3. python manage.py migrate //初始化数据库
  4. sudo vim /learn/settings.py //编辑设置文件

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

  1. 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这个地址。

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

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

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

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

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

配置Supervisor

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

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

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

(2)启动并运行

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

  1. sudo unlink /var/run/supervisor.sock //清空记录
  2. sudo supervisord -c /etc/supervisor/supervisord.conf //启动
  3. sudo supervisorctl -c /etc/supervisor/supervisord.conf //管理

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

  1. 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

  1. [program:learn]
  2. command=bash /webapps/learnDjango/learn/init.sh
  3. directory=/webapps/learnDjango/learn
  4. user=qaq
  5. stdout_logfile=/webapps/learnDjango/logs/gunicorn_supervisor.log
  6. autostart=true
  7. autorestart=true
  8. redirect_stderr=true
  9. [supervisorctl]

init.sh

  1. #! /bin/bash
  2. source /webapps/learnDjango/venv/bin/avtivate
  3. /webapps/learnDjango/venv/bin/gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf

(2)使用supervisor

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

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

配置nginx

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

  1. server {
  2. listen 8500;
  3. server_name 47.94.99.248;
  4. access_log /webapps/hello/logs/nginx.access.log;
  5. error_log /webapps/hello/logs/nginx.error.log;
  6. location / {
  7. proxy_pass http://127.0.0.1:9000;
  8. proxy_set_header Host $host;
  9. proxy_set_header X-Real-IP $remote_addr;
  10. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11. }
  12. }

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

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

  1. 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。

  1. nohup gunicorn learn.wsgi:application -c /webapps/learnDjango/learn/gunicorn.conf&
  2. 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. [转载红鱼儿]Delphi XE7 update1进步太大了

    写以下的文字是怀着无比兴奋的心情写的,急于同朋友们分享XE7的进步! 1.更新的bug列表并不全 通过bug修正列表及发布的消息,可以看到up1修正了很多bug,正如我所说,有些bug并没有写到发布的 ...

  2. 2018.06.29 洛谷P2890 [USACO07OPEN]便宜的回文(简单dp)

    P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome 时空限制 1000ms / 128MB 题目描述 Keeping track of all the cows c ...

  3. 2018.09.14 codechef Milestone(随机化算法)

    传送门 由于存在不超过7条直线可以覆盖超过所有的点. 所以如果我们随机选点的话(每次随机两个) 那么得到的解恰好为最优解的概率是149" role="presentation&qu ...

  4. csdn获得积分

    常规方式获取可用分 1.每天只要回复就可以获得10个可用分.注:回复后的第2天发放. 2.每周回复量大于10个帖子,将获得30可用分.注:下一周的周二发放. 3.本周获得技术专家分30分以上,将获得4 ...

  5. Cache Algorithms

    1. 平均内存引用时间 T = average memory reference time m = miss ratio = 1 - (hit ratio) Tm = time to make a m ...

  6. (树的直径)LightOJ -- 1094

    链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=88230#problem/C 求树的直径,这里只不过给每条边增加一个边长属性,变成 ...

  7. 20155319 2016-2017-2 《Java程序设计》第九周学习总结

    20155319 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 整合数据库 ==16.1.1 JDBC简介== JDBC全名Java DataBase Co ...

  8. Hbase和Hive的异同

    共同点:1.hbase与hive都是架构在hadoop之上的.都是用hadoop作为底层存储 区别:2.Hive是建立在Hadoop之上为了减少MapReduce jobs编写工作的批处理系统,HBa ...

  9. "名字好难想队“团队项目

    团队展示 1.队名:名字好难想队 2.队员介绍 姓名 学号 岗位 黎扬乐(组长) 3116004689 程序,测试 李世潇 3116004690 策划,美术,动画 梁耀 3116004691 项目管理 ...

  10. MySQL常用功能语句分类总结

    C(创建型功能) 创建数据库:CREATE DATABASE 创建用户:CREATE USER 用户名@主机 IDENTIFIED BY 密码; -- 如果想让该用户可以从任意远程主机登陆,可以使用通 ...