过去半个月,成功实现了将 Python Django 搭建的 API 本地项目部署到阿里云服务器。因为是初次尝试部署服务器、注册域名等,甚至也是自己独立去使用 Linux 系统,在整个部署过程中没来得及做整理。
现在功能基本实现,为了还原从零部署项目到云服务器的全过程,刚新下单了腾讯云服务器和新的域名用于演示整个部署流程。
环境:电脑是 macOS 系统,云服务器选用 CentOS 7 系统
云服务器
首先云服务器选择,已完成部署的是双11时选择阿里云最便宜的一年服务器(最低配置89元);本文用于演示的是腾讯云 0元试用15天(加1元续15天)的固定配置的腾讯云 CVM 1核1G1M服务器, CentOS 7 系统,配置如下:
在选购配置完合适的服务器后,可以在控制台中找到服务器相关的信息:
注意左上角选到你购置的实例区域,服务器信息中最重要的是红框圈出的服务器 ip,(公)表示是公网对外 ip。此处可以在微信端腾讯云助手中查到服务器默认账号、初始密码的登陆信息。为了方便,我们可以先把初始密码改掉,改密码需要将实例关机、改完记得服务器开机:
记好自己的服务器 ip 和登陆密码,在 mac 上打开终端:
sudo ssh 175.24.134.227
输入后,会先提示输入 Password,这个是因为命令中使用了 sudo,密码是电脑用户的开机密码,这样才有权限执行该命令。
之后是提示 [email protected]’s password 密码,即刚我们改过的服务器实例密码。
成功登陆后终端用户会变成该服务器相关的 root 用户:
输入下 python,可以看到直接进入了 python 2.7.5 环境,系统是自带着 Python2.7.5 。
CentOS 7 上安装 Python 3.7.5
因为 Django 项目需要以及个人习惯用 Python 3,首先给 CentOS 7 环境中装上 Python 3.7.5。
但是有一点要注意!CentOS 很多环境自带的软件及相关命令都是依赖其自身配备的 Python 2 的,也就是说,我们下载了 Python 3 之后,能正常使用就好,不要贸然修改软连接(也就是window系统中的环境变量或路径),修改之后我们确实可以直接通过 Python 进入 Python 3 环境了,但是其它依赖 Python 2 的命令都会导致报错等,所以这里建议安装完 Python 3 后,不要贸然修改软连接将 Python 命令绑定到 Python 3 上去。
刚我们已经通过 sudo ssh 服务器 ip + 输入密码连上了服务器,保持登陆继续安装 Python 3.7.5:
- 安装依赖包
yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make
- 安装与 pip 相关的依赖包
yum install libffi-devel -y
- 输入以下命令在服务器上下载 Python3.7.5 压缩包
wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
如果想下载其它版本,可以先在 https://www.python.org/ftp/python 地址中去定位到目标版本,将其后的版本号与文件名称对应上,再通过 wget 链接下载即可。
- 现在安装压缩包已经下好,依次执行如下命令:
tar -zxvf Python-3.7.5.tgz
cd Python-3.7.5
./configure
make&&make install
这时在命令行中输入 python3 如果看到进入的确实是新安装的 Python 3.7.5 环境,说明安装成功。按 ctrl+d 或者输入 exit() 退出 python 环境。
输入 pip3 list 也可以看到 pip 是正常的。
返回上层目录,将安装 Python 下载的压缩包和文件删掉
cd ..
rm -rf Python-3.7.5.tgz
rm -rf Python-3.7.5/
再提醒一遍,如果不熟悉,别跟着安装帖子一股脑把 python 软连接改掉,之后会导致报错的!!!
将本地 Django 项目代码上传至服务器
接着我们上一篇在电脑本地实现的 Django 项目演示,项目名及所在文件夹是 tedxapi,在 Finder 中找到该文件夹。
项目代码上传服务器流程
接下来我们需要做的流程是:
- 将必要的项目代码上传至 GitHub
- 将 GitHub 上的代码拉取到云服务器上
- 将项目中涉及隐私设置的代码文件单独上传到服务器中
编辑.gitignore文件
首先,在 tedxapi 项目文件夹中新建 .gitignore 文件(可以用任意编辑器比如 pycharm)在其内编辑如下代码并保存:
*.pyc
__pycache__
myvenv
db.sqlite3
.DS_Store
myapi/myapi/settings.py
这段代码的意思是上传 git 时,忽略编辑的这些文件。本项目中 tedxapi/myapi/myapi/settings.py 涉及到密码等,就忽略上传 GitHub,之后自己再单独上传到服务器。
安装 git 工具
首先是本地电脑系统,根据 https://git-scm.com/ 指引,下载与系统对应的 git 工具。
然后在云服务器终端中通过 yum install 命令安装 git:
yum install git
注意,在 yum install 很多包时,中途会出现 “Is this ok [y/d/N]” 的提示信息,此时输入 y 敲回车键继续下载即可。
GitHub 准备
首先是准备好你的 GitHub 账号,新建一个 repository 仓库,其实新建完之后 GitHub 页面是有相关的命令指引的,可以参考:
注意记下自己新建的仓库地址,例如我的是 https://github.com/pengfexue2/tedxmy.git
当然更省事的是需要时直接复制页面中的命令~
本地代码上传 GitHub
在 Finder 中找到本地项目文件夹,“右键-服务-新建位于文件夹位置的终端窗口”:
在该文件夹位置打开终端(注意:不要与服务器的终端窗口弄混),依次执行如下命令初始化配置:
git init
git config --global user.name ted(这里输入自己的名字)
git config --global user.email [email protected](自己的邮箱)
之后可以通过 git status 查看状态:
git status
git add 命令将文件添加到暂存区:
git add --all .
*注意最后有个 “.”
git commit 命令将暂存区文件提交到本地到版本库:
git commit -m "My Django API, first commit"
git remote add 命令添加远程仓库:
git remote add origin https://github.com/pengfexue2/tedxmy.git
这里 origin 之后的即刚刚 GitHub 新建仓库后地址。
另如果之前将该项目推送到别的仓库,那么执行此命令会报错 “fatal: remote origin already exists.”,解决方法是先执行 “git remote rm origin”,再执行此命令添加仓库。
git push 命令将本地版本库推送到远程版本库中:
git push -u origin master
等待上传进度完成,此时去 GitHub 新建的仓库查看,代码已经被传过去了。此时可以选到 GitHub 上的 clone or download 拿到该项目的地址链接。
GitHub 代码拉取到云服务器
此时回到云服务器的终端窗口,如果之前关掉了,就重新 sudo ssh ip地址 连上去,通过 git clone 命令将 GitHub 上代码文件拉取到根目录中:
git clone https://github.com/pengfexue2/tedxmy.git
等待拉取完毕,可以看到上传至 GitHub 的代码已经被同步到服务器上了。
注意到下载后的文件夹名字与 GitHub 仓库名字一致,服务器中可以先用 mv 命令将项目名称由 tedxmy 改回 tedxapi:
mv tedxmy tedxapi
这样服务器上的代码就与本地差不多一致了。
本地文件上传至云服务器
有些涉及密码隐私设置的代码文件,不想通过 GitHub,可以直接上传至云服务器。Mac 直接上传文件至服务器方法如下:
选中终端,左上角菜单栏中 shell - 新建远程连接:
弹出的远程连接窗口中:
- 选择安全文件传输(sftp)
- 用户填root
- 最下一栏填 sftp root@服务器ip地址
- 点击连接,弹出的终端中输入服务器密码,即可建立与服务器的 sftp 连接
此处我们要将 tedxapi/myapi/myapi/settings.py 文件上传至该服务器。
- 首先查找下该文件在本地的路径,例如我的是 /Users/ted/tedxapi/myapi/myapi/settings.py
- 然后确定云服务器中该文件要部署的位置 /root/tedxapi/myapi/myapi
- 在建立的 sftp 终端中输入 “put 本地文件路径 远程路径”
put /Users/ted/tedxapi/myapi/myapi/settings.py /root/tedxapi/myapi/myapi
即可看到文件被成功上传至指定位置。
服务器上更新 sqlite3
由于 CentOS 上配置的 sqlite3 版本较低,需要更新下以防之后报错,在服务器终端先回到根目录,通过连接下载最新的 sqlite3 压缩包
cd ~
wget https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz
对压缩包解压缩:
tar -zxvf sqlite-autoconf-3300100.tar.gz
进入解压缩生成的文件夹内:
cd sqlite-autoconf-3300100/
./configure --prefix=/usr/local
make && make install
接下来我们检查下目前服务器上 sqlite3 版本:
# /usr/local/bin/sqlite3 为新安装的,版本是3.30
[root@VM_0_11_centos sqlite-autoconf-3300100]# /usr/local/bin/sqlite3 --version
3.30.1 2019-10-10 20:19:45 18db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3df1b0b
# /usr/bin/sqlite3 为系统自带的,版本3.7
[root@VM_0_11_centos sqlite-autoconf-3300100]# /usr/bin/sqlite3 --version
3.7.17 2013-05-20 00:56:22 118a3b35693b134d56ebd780123b7fd6f1497668
# 直接查看环境变量下的 sqlite3 版本,已经被更新为3.30
[root@VM_0_11_centos sqlite-autoconf-3300100]# sqlite3 --version
3.30.1 2019-10-10 20:19:45 18db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3df1b0b
# 将自带的 sqlie3 命名为 sqlite3_old
[root@VM_0_11_centos sqlite-autoconf-3300100]# mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
# 建立软连接,使系统自带sqlite3路径 指向 新下载的版本
[root@VM_0_11_centos sqlite-autoconf-3300100]# ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3
# 查看系统自带 sqlite3 版本,被更新成 3.30
[root@VM_0_11_centos sqlite-autoconf-3300100]# /usr/bin/sqlite3 --version
3.30.1 2019-10-10 20:19:45 18db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3df1b0b
最后,将路径传递给共享库:
export LD_LIBRARY_PATH="/usr/local/lib"
同时,将该 export语句写入 ~/.bashrc 文件中设置开机自启动执行:
vim ~/.bashrc
在弹出的 vim 编辑区中插入该语句并保存退出。
然后返回上层文件夹将安装的压缩包和配置文件夹全部删掉:
cd ..
rm -rf sqlite-autoconf-3300100.tar.gz
rm -rf sqlite-autoconf-3300100/
服务器上配置 Python 虚拟环境 virtualenv
服务器终端中进入项目文件夹,执行如下命令:
python3 -m venv myvenv
然后可以通过 ls 命令可以看到文件夹内生成了一个 myvenv 文件夹,然后执行如下命令启动虚拟环境:
source myvenv/bin/activate
可以看到之后的命令前面出现了 (myvenv) 即代表配置虚拟环境成功。此时再输入 python 即可直接进入 python3 环境(因为我们是用 python3 建立的该虚拟环境)。至于配置虚拟环境的好处,我这就不做赘述。
先更新下pip, 然后安装 Django、RestFramework
pip install --upgrade pip
pip install django
pip install djangorestframework
进入到 myapi 文件夹并执行 migrate 命令来创建数据库
cd myapi
python manage.py migrate
然后运行服务器:
python manage.py runserver 0.0.0.0:8000
可以看到如下提示信息:
(myvenv) [root@VM_0_11_centos myapi]# python manage.py runserver 0.0.0.0:8000
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
December 07, 2019 - 10:53:17
Django version 3.0, using settings 'myapi.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.
此时打开浏览器,将 http://0.0.0.0:8000/ 中的0.0.0.0换成服务器 ip,即可访问到部署到服务器上的 Django API 了。例如我的访问地址为 http://175.24.134.227:8000/
但是点击页面上的 website 和 weibo 链接发现 api 数据为空,这是因为我们还没有在服务器上执行 爬虫代码向数据库塞入数据,接下来我们来进行爬虫抓取数据。
服务器上爬虫取数据
contrl + c 退出刚启动的 0.0.0.0:8000 服务器,myapi 中文件夹中的 get_website.py 即爬取知乎和微博热榜数据的代码。因为爬虫代码中用到了 requests 模块和 bs4 模块,我们需要在虚拟环境中安装:
pip install requests
pip install Beautifulsoup4
安装完毕后,仍是在虚拟环境中执行爬虫代码:
python get_website.py
如果看到 “zhihu done”、“weibo done” 提示信息代表爬取顺利。
然后重启服务器,取看下 Django API 接口有无更新:
python manage.py runserver 0.0.0.0:8000
继续访问 http://175.24.134.227:8000,点击页面中的知乎热榜链接:http://175.24.134.227:8000/website/
可以看到数据被加载到 Django API 中了!
以及 http://175.24.134.227:8000/weibo/ 对应的微博热榜 API:
至此,本地 Django 项目部署到云服务器的第一步完成了,即我们在服务器上实现了和本地同样的 Django API 展示功能。
但是,后续仍需关于 web 的配置以使得服务器上的 Django API 可以通过域名访问,以及自动化定时执行爬虫更新数据等,后续我将继续整理相关流程。
感谢阅读~
最后,也向你推荐我的微信公众号 TEDxPY,内容涉及 Python、小程序等,来找我哦~
文章参考链接:
- https://wechat.python666.cn/static/djangogirl/djangogirl.html?page=6
- https://blog.csdn.net/qq_36288025/article/details/82534508
- https://blog.csdn.net/qq_39969226/article/details/92218635
- https://jingyan.baidu.com/article/ae97a64672d076fbfc461d29.html