有句话叫所有的乐趣都在部署之前,也许这个小应用还有很多缺陷,也许它还不够完美,但是,仔细想想,其实没有什么能比自己的网站在互联网中上线更令人满足的了,但是满足的背后,总是存在着很多的风险,以至于几乎所有的开发人员都说过这样的话:"在我这里运行是正常的呀!",所以这章,会让这个应用在实际的互联网中跑起来。
部署一个网站的大概步骤如下:
首先,我们要注册一个域名,这方面我想做开发的都应该很熟悉,在万网或新网以及各种小的代理商都可以,就不展开了。
然后,还需要一个服务器,这个选择也有很多,并且由于跑一个 Python 的站点需要的资源不是太多,所以,无论是阿里云,腾讯云,Amazon 的 AWS,微软的 azure,甚至你箱子底下的一台多年不用的 BT 服务器都行,只要能满足以下条件:
好吧,我推荐使用 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用户
当然,其实最好的方式其实是使用私钥认证,关于这方面的内容网上也有很多,就不在展开。
在安装软件之前,最好先升级一下 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 是一个 Python 的 http 服务器,使用起来非常简单,安装也很方便,,直接使勇 pip 即可
- sudo pip install gunicorn
准备工作终于已经完成,开始上传代码
在 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,但配置多次始终不成功,如果有大牛希望能帮忙教教。
好,就目前来说,至少一个简单的,不考虑性能的轻博客已经部署成功,下面想想还缺少的必须的功能:
等等,貌似功能还缺失很多,但不管怎么说,现在也能算是一个小的里程碑了。想想,还是很了不起的:)
来源: http://www.cnblogs.com/jiangchao226/p/6959757.html