一个web应用的诞生(13)--冲向云端
有句话叫所有的乐趣都在部署之前,也许这个小应用还有很多缺陷,也许它还不够完美,但是,仔细想想,其实没有什么能比自己的网站在互联网中上线更令人满足的了,但是满足的背后,总是存在着很多的风险,以至于几乎所有的开发人员都说过这样的话:“在我这里运行是正常的呀!”,所以这章,会让这个应用在实际的互联网中跑起来。
部署一个网站的大概步骤如下:
- 注册一个域名(备案)
- 购买一个服务器
- 安装万维网服务
- 使用git将代码上传到服务器
- 使用virtualenv管理项目的python依赖
- 使用Gunicorn配置网站
安装及配置服务器
首先,我们要注册一个域名,这方面我想做开发的都应该很熟悉,在万网或新网以及各种小的代理商都可以,就不展开了。
然后,还需要一个服务器,这个选择也有很多,并且由于跑一个Python的站点需要的资源不是太多,所以,无论是阿里云,腾讯云,Amazon的AWS,微软的azure,甚至你箱子底下的一台多年不用的BT服务器都行,只要能满足以下条件:
- 可以安装Ubuntu(控制台版本即可,需要资源极少)
- 自己有Ubuntu的root权限
- 外网可访问
- 可以使用ssh控制
好吧,我推荐使用Ubuntu的原因是我只会用这个,现在这些都很简单,举个例子,但并不是广告,去阿里云官网,购买一个ecs实例,之后选择安装操作系统,可以选择Ubuntu1604版本,输入用户名密码,他就会自动安装操作系统,稍等一会,在阿里云的控制台显示"运行中",即可使用:
这时候可以使用远程的ssh工具,输入他的公网ip,以及之前输入的用户名密码, 即可连接:
当出现这些内容,即表示已经使用root账户联通远程服务器,为了安全起见,可以自己配置一个非root账户,当必须使用root权限的时候,使用sudo前缀即可:
useradd -m -s /bin/bash niufennan #添加niufennan账户
# m 表示创建home目录,s表示默认可以使用bash(shell)
usermod -a -G sudo niufennan #将niufennan添加至sudo用户组
passwd niufennan #设置密码
su - niufennan #切换到niufennan用户
当然,其实最好的方式其实是使用私钥认证,关于这方面的内容网上也有很多,就不在展开。
安装Nginx
在安装软件之前,最好先升级一下apt-get
sudo apt-get update
然后安装并启动Nginx
sudo apt-get install nginx
sudo service nginx start
经过一个安装列表 并且启动服务后,即可在浏览器中通过ip地址访问到nginx的欢迎页:
Nginx可用了
接下来按照同样的步骤安装剩余所需的软件(Python git pip)
sudo apt-get install git python3 python-pip
解析域名
总是使用ip访问当然是不行的,所以需要对域名进行dns解析,这点不同的注册商网站的解析界面都有所不同,但是我相信四处点击几次总会找到正确的方法。
安装Gunicorn
Gunicorn是一个Python的http服务器,使用起来非常简单,安装也很方便,,直接使勇pip即可
sudo pip install gunicorn
准备工作终于已经完成,开始上传代码
安装MySql
在Ubuntu上安装mysql同样非常简单,只需要几个命令就可以完成:
sudo apt-get install mysql-server
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
其中安装mysql-server的时候会出现让输入root密码的界面,将焦点放置到ok按钮上边,回车后输入密码即可。
然后在mysql中创建数据库:
create database cblog default character set utf8 collate utf8_general_ci;
创建此数据库的管理用户
http://www.cnblogs.com/janken/p/5500320.html
此用户可公网访问,root数据库则只能localhost访问
上传代码
这里假设你已经拥有github账户并且熟悉简单的git操作,并且已经通过ssh公钥方式与github库关联
首先,到github中 创建一个库,我的库名字叫nblog
然后将文件push至远程库(假设本地以及提交完成):
git remote add nblog 远程库git地址
git push -u nblog master
虚拟环境使用
到了这里,突然发现之前的blog中,或者说开发中犯了一个严重的错误,即没有使用virtualenv,这个将导致在服务器上配置运行环境将变成了一件非常繁琐,困难,甚至变成挑战自己极限的事情,不过好在还可以不就,那么,首先在服务端安装virtualenv吧:
sudo pip install virtualenv
然后自己的环境,只能不考虑其他,先打一个比较臃肿的包(全环境)
pip freeze > requirements.txt
这里会将本机所有的库记录,到服务器端可以直接复原,若有virtualenv,则会只记录虚拟环境下的库,将非常的方便,下面看一下记录中的内容:
可以看到,虽然没有细看,但至少画红线的部分是本项目肯定没有用到的,可以手动删除。
将此文件添加至git库中并推送到远程库
git add requirements.txt
git commit -m "增加迁移文件"
git push -u nblog master
然后通过ssh链接到服务器,到用户的home文件夹,创建nblog文件夹
mkdir nblog
然后将git远程库中的代码复制到nblog文件夹中
git clone https://github.com/niufennan/nblog.git nblog/nblog.niufennan.com/source
注意,Linux下,目录层级关系必须使用/
创建虚拟环境(此时在nblog.niufennan.com文件夹下)
sudo virtualenv --python=python3 ../virtualenv
前一个为命令,后一个为目录名
virtualenv的使用方式有两种,一种是执行activete进行环境切换,一种是直接指定virtualenv文件夹下的python和/或pip,一般来讲开发时可以切换,服务器直接指定路径即可
在虚拟环境中安装项目所用的库:
sudo ../virtualenv/bin/pip3.5 install -r source/requirements.txt
这样,就会将原本在开发机上记录在requirements.txt上所有的库都安装在virtualenv的site-packages文件夹中
配置环境变量
这时候先别着急运行,别忘了有些值是配置在环境变量中的,主要有三个:
access_key=os.environ.get("qn_access_key")
secret_key=os.environ.get("qn_secret_key")
SQLALCHEMY_DATABASE_URI=os.environ.get("nblog_mysql_str")
其中七牛的都是公共的,以后即使有其他的应用,这两个依然不会变,sql链接字符串则是项目私有的,所有使用nblog前缀。
vi /etc/profile
然后下拉到文档最低端
好,现在在服务器上就可以跑起来了。
../virtualenv/python manage.py runserver
看看服务器:
这个时候,你肯定迫不及待的想要从自己的PC机上看到成果了,那么,该如何做呢,在这里,我是把nblog这个二级域名分配给了这个轻博客,这样,需要对Nginx进行一些配置,首先进入Nginx的目录:
cd /etc/nginx
这里注意两个目录: sites-available和sites-enable,很好理解,看名字就能看出来,一个是备用一个是使用,下面在sites-available中新建我们所需要的nginx配置文件:
sudo vi nblog.niufennan.com
用vi创建后,输入如下内容:
server{
listen 80;
server_name nblog.niufennan.com;
location / {
proxy_pass http://127.0.0.1:5000;
}
}
很简单,页很好理解,即当域名为nblog.niufennan.com的时候,反向转发到127.0.0.1:5000
保存后,通过软连接的方式,链接到sites-enable中
sudo ln -s /etc/nginx/sites-available/nblog.niufennan.com /etc/nginx/sites-enable/nblog.niufennan.com
然后重启nginx
sudo service nginx reload
启动服务
../virtualenv/python manage.py runserver
ok,现在迫不及待的想要在本地访问了,地址栏中输入域名
nblog.niufennan.com
完美,但是此时做任何操作,都会报错,因为数据库还没有迁移,进入项目目录,进行数据库迁移操作:
../virtualenv/python manage.py db init
../virtualenv/python manage.py db migrate -m "服务器"
../virtualenv/python manage.py db upgrade
注意,这里我遇到了一个问题,即数据库迁移后的编码为utf8,中文会有乱码问题,需手动通过客户端修改编码为utf8mb4,不知是否有自动化的方式,望高手解惑。
在运行,刷新数据库,经过简单的测试,ok,完美:
但是,人生貌似就怕说但是,这个时候,生命周期仅仅是这个控制台,也就是说,一旦控制台关闭了,对于现在来说,也就是xshell断开连接,则服务也就关闭了,即无法访问了,那么,这时候,应该怎么办呢?还记得刚刚安装的独角兽(Gunicorn)么?终于轮到它出马了
../../virtualenv/bin/gunicorn -b 127.0.0.1:5000 -D manage:app
-b 表示使用ip及断开
-D 表示后台运行
关于linux确实是小白,比如现在,其实应该配置一个upstart,但配置多次始终不成功,如果有大牛希望能帮忙教教。
好,就目前来说,至少一个简单的,不考虑性能的轻博客已经部署成功,下面想想还缺少的必须的功能:
- 邮件验证
- 用户密码加密及加盐
- 对于发言的评论及反馈
- 有些发言的敏感词过滤
等等,貌似功能还缺失很多,但不管怎么说,现在也能算是一个小的里程碑了。想想,还是很了不起的:)
一个web应用的诞生(13)--冲向云端的更多相关文章
- 一个web应用的诞生(1)--初识flask
基于flask的web应用的诞生 Flask是一个非常优秀的web框架,它最大的特点就是保持一个简单而易于扩展的小核心,其他的都有用户自己掌握,并且方便替换,甚至,你可以在社区看到众多开源的,可直接用 ...
- 从零开始,开发一个 Web Office 套件(13):删除、替换已选中文字
这是一个系列博客,最终目的是要做一个基于 HTML Canvas 的.类似于微软 Office 的 Web Office 套件(包括:文档.表格.幻灯片--等等). 博客园:<从零开始, 开发一 ...
- 一个web应用的诞生(9)--回到用户
在开始之前,我们首先根据之前的内容想象一个场景,用户张三在网上浏览,看到了这个轻博客,发现了感兴趣的内容,于是想要为大家分享一下心情,恩?发现需要注册,好,输入用户名,密码,邮箱,并上传头像后,就可以 ...
- 一个web应用的诞生--使用模板
经过了第一章的内容,已经可以做出一些简单的页面,首先用这种方式做一个登录页面,首先要创建一个login的路由方法: @app.route("/login",methods=[&qu ...
- 一个web应用的诞生--美化一下
经过上一章的内容,其实就页面层来说已结可以很轻松的实现功能了,但是很明显美观上还有很大的欠缺,现在有一些很好的前端css框架,如AmazeUI,腾讯的WeUI等等,这里推荐一个和flask集成很好的b ...
- 一个web应用的诞生--数据存储
上一章实现了登录的部分功能,之所以说是部分功能,是因为用户名和密码写成固定值肯定是不可以的,一个整体的功能,至少需要注册,登录,密码修改等,这就需要提供一个把这些值存储到数据库的能力. 当前的主流数据 ...
- 一个web应用的诞生--数据表单
下面把角色分为两种,普通用户和管理员用户,至少对于普通用户来说,直接修改DB是不可取的,要有用户注册的功能,下面就开始进行用户注册的开发. 用户表 首先要想好用户注册的时候需要提供什么信息:用户名.密 ...
- 一个web应用的诞生(6)--用户账户
之前登录注册的功能都已经完成,但是登录成功回到首页发现还是白茫茫的一片,对的,title一直都写得博客,那么最终目的也是写出一个轻博客来,但是,在发表文章之前是不是要先记录一下登录状态呢? 用户登录 ...
- 一个web应用的诞生(7)--结构调整
现在所有的Py代码均写在default.py文件中,很明显这种方法下,一旦程序变的负责,那么无论对于开发和维护来说,都会带来很多问题. Flask框架并不强制要求项目使用特定的组织结构,所以这里使用的 ...
随机推荐
- JS中的循环嵌套 BOM函数
[嵌套循环特点] 外层循环转一次,内层循环转一圈 外层循环控制行数,内层循环控制每行元素个数 [做 ...
- CF #284 div1 D. Traffic Jams in the Land 线段树
大意是有n段路,每一段路有个值a,通过每一端路需要1s,如果通过这一段路时刻t为a的倍数,则需要等待1s再走,也就是需要2s通过. 比较头疼的就是相邻两个数之间会因为数字不同制约,一开始想a的范围是2 ...
- java映射(map用法)
主要分两个接口:collection和Map 主要分三类:集合(set).列表(List).映射(Map)1.集合:没有重复对象,没有特定排序方式2.列表:对象按索引位置排序,可以有重复对象3.映射: ...
- Python数据处理——numpy_1
python中数据处理最基础的一个包--numpy.它能很好的进行数据准备,类似与R语言中的数据框(DataFrame)一样.今天,就来从最基础的开始学习. import numpy as npdat ...
- 篇4 安卓app自动化测试-Appium API进阶
篇4 安卓app自动化测试-Appium API进阶 --lamecho辣么丑 1.1概要 大家好! 我是lamecho(辣么丑),今天是<安卓app自动化测试& ...
- Linux系统操作指令汇总
1.系统配置 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIO ...
- ZJOI2017 day1滚粗记
这几天去温州作为外省选手参加了$ZJOI day1$.打了几天的酱油,考试也滚粗了.. $day -2$ 中午从学校出发,坐飞机去温州.到了温州以后吃完晚饭就回宾馆.把一直想做的糖果公园做完了以后就堕 ...
- OC中的单例
概念 单例模式的意图是类的对象称为系统中唯一的实例,提供一个访问点,供客户类共享资源 什么情况下使用单例 )类只能由一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法 )这个唯一的实例 ...
- YAHOO 34 条前端优化建议
雅虎团队经验:网站页面性能优化的34条黄金守则 1.尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容.这部分时间包括下载页面中的图像.样式表.脚本.Flash等.通 ...
- 【Netty】Netty核心组件介绍
一.前言 前篇博文体验了Netty的第一个示例,下面接着学习Netty的组件和其设计. 二.核心组件 2.1. Channel.EventLoop和ChannelFuture Netty中的核心组件包 ...