Django+nginx+gunicore+supervisor+阿里云主机 部署博客项目
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+阿里云主机 部署博客项目的更多相关文章
- 阿里云服务器部署Java Web项目全过程
最近需要将一个Java Web项目部署到服务器上,方便多人共享访问.这也是我第一次接触服务器之类的东西,也花了一点时间,最终总算部署成功,写下一篇文章记录以便日后回顾. 购买服务器 第一步当然是需要购 ...
- 【Centos】【Python】【Flask】阿里云上部署一个 flask 项目
1. 安装 python3 和 pip3 参考:http://www.cnblogs.com/mqxs/p/8692870.html 2.安装 lnmpa 集成开发环境 参考:http://www.c ...
- Spring框架学习笔记(6)——阿里云服务器部署Spring Boot项目(jar包)
最近接外包,需要部署服务器,便是参考了网上的几篇博文,成功在阿里云服务器成功部署了Spring Boot项目,特记下本篇笔记 Spring Boot项目打包 这里说一下部署的一些问题 1.mysql驱 ...
- 阿里云搭建wordpress博客教程
一 :搭建环境 1.安装Apache环境 在线安装Apache yum install httpd 启动Apache服务 service httpd start 设置开机自启动 chkconfig h ...
- nodebb在阿里云主机部署过程
1.在centos上安装nodejswget http://nodejs.org/dist/v0.8.9/node-v0.8.9.tar.gztar zxvf node-v0.8.9.tar.gzcd ...
- 云计算之路-阿里云上:博客web服务器轮番CPU 100%
今天下午14:30左右开始,不知道怎么回事,博客站点负载均衡中的web服务器轮番CPU 100%.平时访问高峰5台服务器就能稳稳支撑,而今天发现CPU出现100%问题后就开始加服务器,结果到目前加到了 ...
- 如何在阿里云服务器部署Django
这段时间一直在搞我的网站——大学易,一个大学生评课网站,主要是提供课程的详尽信息(比如老师会不会经常点名,有没有期中考试),课程资料的下载等等. 这篇文章主要是分享给那些菜鸟,就是像我一样完全没有搞过 ...
- 阿里云主机Nginx下配置NodeJS、Express和Forever
https://cnodejs.org/topic/5059ce39fd37ea6b2f07e1a3 AngularJS中文社区即运行在阿里云主机上,本站使用Nginx引擎,为了AngularJS,我 ...
- 【小技巧解决大问题】使用 frp 突破阿里云主机无弹性公网 IP 不能用作 Web 服务器的限制
背景 今年 8 月份左右,打折价买了一个阿里云主机,比平常便宜了 2000 多块.买了之后,本想作为一个博客网站的,毕竟国内的服务器访问肯定快一些.满心欢喜的下单之后,却发现 http 服务,外网怎么 ...
随机推荐
- B-Tree详解
之前写过一篇关于索引的文章<SQL夯实基础(五):索引的数据结构>,这次我们主要详细讨论下B-Tree. B-树 B-tree,即B树,而不要读成B减树,它是一种多路搜索树(并不是二叉的) ...
- jmeter实操及性能测试基础知识整理 - 不断更新
主要基于jmetet工具 有任何疑问直接留言,可以相互讨论 线程组菜单: 线程数:并发数量Rame-Up时间(秒):多久跑完线程数,比如线程是10,Rame-Up时间是10秒,就是10秒内跑完10个线 ...
- Qt固定窗口大小
指定大小 this->setMaximumSize(250, 250); 默认大小 this->setMaximumSize(this->width(), this->heig ...
- LaTeX安装与编译中文
首先,感谢博客园团队帮我找回这篇被我误删除的博客.找回方法:发送邮件至"contact@cnblogs.com",然后就可以在工作人员的帮助下找回了.下面介绍LaTeX的安装并使其 ...
- windows10下Bad owner or permissions on .ssh/config的解决办法
方法很简单,亲测有效. 1.进入如下路径C:\Users\用户名\.ssh,你会看到有config这个文件 2.右击config,属性→安全→高级→禁止继承→删除所有继承(忘了全称了,大概这个意思)→ ...
- qt需求
1.登录框 账号密码 复杂度判断 2.监控 权限认证 (5分钟必须锁定,退回登录状态)--b/s 3.exe 嵌入exe (什么时间触发了什么消息,任何消息触发都可以,日志文件zlog,5分钟没有写 ...
- yield_from
python3.3 新加的yield from 语句 1.yield from def my_chain(*args, **kwargs): for my_iterable in args: yiel ...
- vue.js最最最基础的入门案例
打算自己写一点vue.js从入门到进阶的笔记,方便一些新手从头开始开发的时候,可以参考一下. 写的或许是很简单的文章,提供给新手参考.暂时都是一些入门级别的. 以后会慢慢的加深,进阶,写出一些更好,更 ...
- JS闭包—你不知道的JavaScript上卷读书笔记(二)
关于闭包,初学者会被绕的晕头转向,在学习的路上也付出了很多精力来理解. 让我们一起来揭开闭包神秘的面纱. 闭包晦涩的定义 看过很多关于闭包的定义,很多讲的云里雾里,晦涩难懂.让不少人以为闭包是多么玄乎 ...
- Spring Cloud微服务安全实战_4-2_常见的微服务安全整体架构
这个图适用于中小公司的微服务架构 微服务:SpringBoot 写的Rest服务 服务注册与发现:微服务所必备的.每个微服务都会到上边去注册.不管是微服务之间的调用,还是服务网关到微服务的转发,都是通 ...