1 准备阶段

1 新鲜的阿里云主机
2 购买一个喜欢的域名
3 创建python的虚拟环境

2 阿里云主机的选取

咱们就是为了实验,我买了最便宜的阿里云主机

3 阿里云主机创建一个超级用户

3.1 默认连接的时候使用的是root用户,创建一个拥有超级权限的新用户

# 在 root 用户下运行这条命令创建一个新用户,mosson是用户名
# 因为我叫杨学光,所以我取的用户名是 mosson
# 选择一个你喜欢的用户名,不一定非得和我的相同
root@server:~# adduser mosson
# 为新用户设置密码
# 注意在输密码的时候不会有字符显示,不要以为键盘坏了,正常输入即可
root@server:~# passwd mosson
# 把新创建的用户加入超级权限组
root@server:~# usermod -aG wheel mosson
# 切换到创建的新用户
root@server:~# su - mosson
# 切换成功,@符号前面已经是新用户名而不是 root 了
mosson@server:$

3.2更新系统【避免旧版本影响命令使用】

mosson@server:$ sudo yum update
mosson@server:$ sudo yum upgrade

3.3 更新sqlite3数据库【后期会换成mysql】

# 创建 src 目录并进到这个目录
mosson@server:$ mkdir -p ~/src
mosson@server:$ cd ~/src # 下载 sqlite3 源码并解压安装
mosson@server:$ wget https://sqlite.org/2019/sqlite-autoconf-3290000.tar.gz
mosson@server:$ tar zxvf sqlite-autoconf-3290000.tar.gz
mosson@server:$ cd sqlite-autoconf-3290000
mosson@server:$ ./configure
mosson@server:$ make
mosson@server:$ sudo make install

3.4 安装python3和Pipenv

1 安装依赖
mosson@server:$ sudo yum install -y openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel 下载python源码
mosson@server:$ cd ~/src
mosson@server:$ wget https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz
mosson@server:$ tar -zxvf Python-3.6.4.tgz 源码安装python3
mosson@server:$ cd Python-3.6.4
mosson@server:$ ./configure LD_RUN_PATH=/usr/local/lib LDFLAGS="-L/usr/local/lib" CPPFLAGS="-I/usr/local/include"
mosson@server:$ make LD_RUN_PATH=/usr/local/lib
mosson@server:$ sudo make install

检查python是不是安装成功

python3 -V

升级pip版本

[mosson@iZm5ehm5qpmslzik8r7xbsZ Python-3.6.4]$ sudo ln -s /usr/local/bin/pip3 /usr/bin/pip3
[mosson@iZm5ehm5qpmslzik8r7xbsZ Python-3.6.4]$ sudo pip3 install --upgrade pip

部署代码

blogproject/settings.py

ALLOWED_HOSTS = ['127.0.0.1', 'localhost ', '你的阿里云的外网地址','.mosson.top']

指定了 ALLOWED_HOSTS 的值后,django 将只允许通过指定的域名访问我们的应用,比如这里只允许通过 127.0.0.1,localhost 以及 zmrenwu.com 和其任意子域名(域名前加一个点表示允许访问该域名下的子域名)访问(即 HTTP 报文头部中 Host 的值必须是以上指定的域名,通常你在浏览器输入域名访问网站时,Host 的值就会被设置为网站的域名),这样可以避免 HTTP Host 头攻击。

django 项目中会有一些 CSS、JavaScript 等静态文件,为了能够方便地让 Nginx 处理这些静态文件的请求,我们把项目中的全部静态文件收集到一个统一的目录下,这个目录通常位于 django 项目的根目录,并且命名为 static。为了完成这些任务,需要在项目的配置文件里做一些必要的配置

blogproject/settings.py

# 其他配置...

STATIC_URL = '/static/'
# 加入下面的配置
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

STATIC_ROOT 即指定静态文件的收集路径,这里指定为 BASE_DIR(项目根目录,在 settings.py 文件起始处定义)下的 static 文件夹。

现在的关键是把代码传到服务器上来了,这里我们使用 git。首先安装 git:

mosson@server:$ sudo  yum install -y git

将代码上传到 GitHub 等代码托管平台,这样我们就可以方便地把代码拉取到服务器了。Git 和 GitHub 的使用相信你已经很熟悉了,这里就不赘述过程。如果不知道如何使用地话可以自行百度相关教程。注意数据库文件不要上传!

我通常喜欢把应用代码放在 ~/apps/ 目录下,先来设置一下服务器的文件结构,用于存放应用代码等相关文件:

# 在用户目录下创建 apps 目录并进入
mosson@server:$ mkdir -p ~/apps
mosson@server:$ cd ~/apps # 拉取博客代码
mosson@server:$ git clone https://github.com/*****/******-blog-tutorial.git

然后进入到项目根目录,安装项目依赖:

mosson@server:$ cd ~/apps/HelloDjango-blog-tutorial
mosson@server:$ pipenv install --deploy --ignore-pipfile

这里指定 --deploy 参数,Pipenv 将只会安装 Pipfile 中 [packages] 下指定的依赖。因为我们现在是在线上环境进行部署,仅用于开发环境的相关依赖我们并不需要。

--ignore-pipfile 将会使 Pipenv 从 Pipfile.lock 文件中安装项目依赖。Pipfile.lock 记录了项目依赖的精确信息,从这里读取依赖信息能够确保依赖信息被无意中修改或者破坏而使得运行环境因为依赖包的缘故出现不可预料的问题。

Pipenv 会自动帮我们创建虚拟环境,然后将项目依赖安装到虚拟环境下。

然后创建一下数据库:

mosson@server:$ pipenv run python manage.py makemigrations
mosson@server:$ pipenv run python manage.py migrate

启动开发服务器:【注意:debug=False的时候,通过以下的python命令无法加载静态文件*****】

mosson@server:$ pipenv run python manage.py runserver 0.0.0.0:8000

这里我们启动开发服务器时指定了服务器运行的 ip 和端口,这将允许通过公网 ip 的 8000 端口访问我们的博客。

访问 ip:8000,可以看到访问成功(其中 ip 为你服务器的公网 ip)。

使用Gunicorn

首先进入到项目根目录,安装 Gunicorn:

mosson@server:$ pipenv install gunicorn

由于我们在服务端修改安装了 gunicorn,代码中 Pipfile 文件和 Pipfile.lock 文件会被更新,因此别忘了把改动同步到本地,具体做法可以自行学习,以下是一个参考:

# 服务端提交代码
mosson@server:$ git add Pipfile Pipfile.lock
mosson@server:$ git commit -m "add gunicorn dependency"
mosson@server:$ git push # 本地拉取代码
git pull

回到线上服务器,在项目根目录,执行下面的命令启动服务:

mosson@server:$ pipenv run gunicorn blogproject.wsgi -w 2 -k gthread -b 0.0.0.0:8000

来解释一下各个参数的含义。

-w 2 表示启动 2 个 worker 用于处理请求(一个 worker 可以理解为一个进程),通常将 worker 数目设置为 CPU 核心数的 2-4 倍。

-k gthread 指定每个 worker 处理请求的方式,根据大家的实践,指定为 gthread 的异步模式能获取比较高的性能,因此我们采用这种模式。

-b 0.0.0.0:8000,将服务绑定到 8000 端口,运行通过公网 ip 和 8000 端口访问应用。

访问 ip:8000(ip 为你服务器的公网 ip),应用成功访问了,但是我们看到样式完全乱了。别急,这不是 bug!此前我们使用 django 自带的开发服务器,它会自动帮我们处理静态样式文件,但是 Gunicorn 并不会帮我们这么做。因为处理静态文件并不是 Gunicorn 所擅长的事,应该将它交给更加专业的服务应用来做,比如 Nginx。

启动nginx服务器

Nginx (engine x) 是一个高性能的 HTTP 和反向代理 web 服务器,它的功能非常多,这里我们主要用它来处理静态文件以及将非静态文件的请求反向代理给 Gunicorn。

当我们访问一个博客文章详情页面时,服务器会接收到下面两种请求:

  • 显示文章的详情信息,这些信息通常保存在数据库里,因此需要调用数据库获取数据。
  • 图片、css、js 等存在服务器某个文件夹下的静态文件。

对于前一种请求,博客文章的数据需要借助 django 从数据库中获取,Nginx 处理不了,它就会把这个请求转发给 运行在 Gunicorn 服务中的 django 应用,让 django 去处理。而对于后一种静态文件的请求,只需要去这些静态文件所在的文件夹获取,Nginx 就会代为处理,不再麻烦 django。

用 django 去获取静态文件是很耗时的,但 Nginx 可以很高效地处理,这就是我们要使用 Nginx 的原因。

首先安装 Nginx:

mosson@server:$ sudo yum install epel-release -y
mosson@server:$ sudo yum install nginx -y

运行下面的命令启动 Nginx 服务:

mosson@server:$ sudo systemctl start nginx

在浏览器输入 ip(不输入端口则默认为 80 端口,Nginx 默认在 80 端口监听请求),看到 Nginx 的欢迎界面说明 Nginx 启动成功了。

Django+nginx+gunicore+supervisor+阿里云主机 部署博客项目的更多相关文章

  1. 阿里云服务器部署Java Web项目全过程

    最近需要将一个Java Web项目部署到服务器上,方便多人共享访问.这也是我第一次接触服务器之类的东西,也花了一点时间,最终总算部署成功,写下一篇文章记录以便日后回顾. 购买服务器 第一步当然是需要购 ...

  2. 【Centos】【Python】【Flask】阿里云上部署一个 flask 项目

    1. 安装 python3 和 pip3 参考:http://www.cnblogs.com/mqxs/p/8692870.html 2.安装 lnmpa 集成开发环境 参考:http://www.c ...

  3. Spring框架学习笔记(6)——阿里云服务器部署Spring Boot项目(jar包)

    最近接外包,需要部署服务器,便是参考了网上的几篇博文,成功在阿里云服务器成功部署了Spring Boot项目,特记下本篇笔记 Spring Boot项目打包 这里说一下部署的一些问题 1.mysql驱 ...

  4. 阿里云搭建wordpress博客教程

    一 :搭建环境 1.安装Apache环境 在线安装Apache yum install httpd 启动Apache服务 service httpd start 设置开机自启动 chkconfig h ...

  5. nodebb在阿里云主机部署过程

    1.在centos上安装nodejswget http://nodejs.org/dist/v0.8.9/node-v0.8.9.tar.gztar zxvf node-v0.8.9.tar.gzcd ...

  6. 云计算之路-阿里云上:博客web服务器轮番CPU 100%

    今天下午14:30左右开始,不知道怎么回事,博客站点负载均衡中的web服务器轮番CPU 100%.平时访问高峰5台服务器就能稳稳支撑,而今天发现CPU出现100%问题后就开始加服务器,结果到目前加到了 ...

  7. 如何在阿里云服务器部署Django

    这段时间一直在搞我的网站——大学易,一个大学生评课网站,主要是提供课程的详尽信息(比如老师会不会经常点名,有没有期中考试),课程资料的下载等等. 这篇文章主要是分享给那些菜鸟,就是像我一样完全没有搞过 ...

  8. 阿里云主机Nginx下配置NodeJS、Express和Forever

    https://cnodejs.org/topic/5059ce39fd37ea6b2f07e1a3 AngularJS中文社区即运行在阿里云主机上,本站使用Nginx引擎,为了AngularJS,我 ...

  9. 【小技巧解决大问题】使用 frp 突破阿里云主机无弹性公网 IP 不能用作 Web 服务器的限制

    背景 今年 8 月份左右,打折价买了一个阿里云主机,比平常便宜了 2000 多块.买了之后,本想作为一个博客网站的,毕竟国内的服务器访问肯定快一些.满心欢喜的下单之后,却发现 http 服务,外网怎么 ...

随机推荐

  1. 排障利器之远程调试与监控 --jmx & remote debug

    监控和调试功能是应用必备的属性之一,其手段也是多种多样. 一般地,我们可以通过:线上日志, zabbix, grafana, cat 等待系统做一问题留底,有问题及时报警,从而达到监控效果. 而对于应 ...

  2. linq,skip(),take实现分页

    using (AdventureWorks2012Entities db = new AdventureWorks2012Entities()) { int num = (from stu in db ...

  3. TinyMCE编辑器图片上传扩展(base64方式),asp.net mvc5

    编辑器上传图片一般都是先上传到服务器中,若是用户取消或忘记提交表单就产生一张废图在空间里面,时间一长就产生大量占用空间的无用图片,现在就试试提交前先用base64,提交后,在后台处理编辑器内容中的&l ...

  4. Python - 元组 - 第九天

    Python 元组 Python 的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可.例如: >&g ...

  5. php 使用fsockopen 发送http请求

    需求背景 在公司开发这么一个需求,每天三次定时催付待客服催付状态的订单,设定每天15.16.17点三次执行job任务来给一批订单打电话催付,需要三个时间点都把待客服催付的订单拨打一遍电话,根据数据组统 ...

  6. 高效并发一 Java内存模型与Java线程(绝对干货)

    高效并发一 Java内存模型与Java线程 本篇文章,首先了解虚拟机Java 内存模型的结构及操作,然后讲解原子性,可见性,有序性在 Java 内存模型中的体现,最后介绍先行发生原则的规则和使用. 在 ...

  7. js 设计模式——单例模式

    单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 单例模式是一种常用的模式,有一些对象我们往往只需要一个,比如线程池.全局缓存.浏览器中的 window 对象等. JavaScript ...

  8. React Router 4.0 体验

    React Router 4.0 (以下简称 RR4) 已经正式发布,它遵循React的设计理念,即万物皆组件.所以 RR4 只是一堆 提供了导航功能的组件(还有若干对象和方法),具有声明式(声明式编 ...

  9. LeetCode——Employees Earning More Than Their Managers

    The Employee table holds all employees including their managers. Every employee has an Id, and there ...

  10. sparkSQL中的example学习(1)

    SparkSQLDemo.scala import org.apache.spark.sql.{Row, SparkSession} import org.apache.spark.sql.types ...