接口API开发系列(3)

Part:本地虚拟机上安装centos

  • 先安装一个
  • 然后可以克隆几个demo,需要注意的是克隆的demo记得修改网卡的mac地址 防止地址冲突。

安装好之后进入terminal可以用命令ip add查看ip地址。

接口API开发系列(3)
虚拟机ip地址查询

然后我们在Xshell中来测试是否能够连接到我们的虚拟机。

接口API开发系列(3)
成功连接

Part:安装Nginx

如果是新环境首先安装gcc gcc-c++, 输入命令:

yum install -y gcc gcc-c++

输入命令后大概界面返回如下:

接口API开发系列(3)
安装gcc

然后安装wget,一般情况下应该装好了。

yum -y install wget

然后再安装PCRE库

cd /usr/local/
wget http://jaist.dl.sourceforge.net/project/pcre/pcre/8.33/pcre-8.33.tar.gz
tar -zxvf pcre-8.33.tar.gz
cd pcre-8.33
./configure
make && make install

再安装SSL库、zlib库。前面PCRE安装用的下载安装包、解压、配置、安装的过程。当然其实也可以用yum install去安装SSL和zlib库。按照提示回到y即可。

yum install openssl

当然按照装PCRE库的方法装zlib也是可以的。压缩包的地址可以在zlib网站上查。

cd /usr/local
wget https://www.zlib.net/zlib-1.2.13.tar.gz
tar -zxvf zlib-1.2.13.tar.gz
cd zlib-1.2.13
./configure
make && make install

最后就是安装Nginx了。

cd /usr/local
wget http://nginx.org/download/nginx-1.8.0.tar.gz
tar -zxvf nginx-1.8.0.tar.gz
cd nginx-1.8.0
./configure
make && make install

输入:

/usr/local/nginx/sbin/nginx
ps -aux | grep 'nginx'

就可以在进程中看到nginx了。

接口API开发系列(3)
进程中的nginx

同时我们也可以用如下命令,看nginx是否启起来了。

curl 127.0.0.1

从下面的图中,其实我们看到nginx已经启动起来了,能拿到HTML页面。接口API开发系列(3)

但是这个时候直接在浏览器中访问虚拟机ip是无法显示出页面的。因为防火墙的原因。所以使用命令关闭防火墙就可以在浏览器中访问了。

// 临时关闭
systemctl stop firewalld

// 禁止开机启动
systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.services
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service
接口API开发系列(3)
浏览器中成功访问启动的nginx

Part:利用Nginx代理访问API接口功能

前面两篇教程讲过了怎么利用uvicorn实现接口API的功能。这里我们希望搞通下面两个功能。

  • 通过网页访问到API接口服务;
  • Python代码中实现API接口服务访问;

其实两个搞通是同时的,只是我们发送请求的方式不同罢了。

把API功能启起来

这里我们用8000端口启动。把前两篇教程提到的几个文件:main.pylibs.pymodel.py放到虚拟机的某个目录下面。看自己喜欢吧。我是放在下面这个地方的,如图:

接口API开发系列(3)
项目app放到虚拟机上

启动项目服务,使用命令:

uvicorn main:app --reload --port=8000

这里–port=8000可以不指定,因为默认就是8000端口。

接口API开发系列(3)
项目启动成功

这个时候可以自己在虚拟机上的浏览器尝试访问http://127.0.0.1:8000/看能不能拿到应用中的app.get()方法的结果。正常情况下,在虚拟机本地访问是会成功的

当然,你也可以在你的主机上试试用地址:http://虚拟机ip:8000/访问,看是不是能成功。不知道大家的情况如何,反正我是失败了。访问被拒绝,看上去像被防火墙阻止了8000端口的外部访问,但其实我防火墙是关了的。跟前端大佬聊过这个情况,估计因为电话沟通的原因,他也觉得这个情况很玄学。不过没有关系,我们还有Nginx,可以间接搞定它。至于这个玄学的东西,后面我解决了再告诉大家

如果我们在主机上,无法直接通过虚拟机ip和端口8000访问到虚拟机8000端口上的服务,那么我们前面要搞通的那两个功能就失败了。

到这里实际情况是:1. 虚拟机本地可以访问,远程连接无法访问到8000端口;2. Nginx启动起来后,http://虚拟机ip:80/可以访问到虚拟机上Nginx启动在80端口上的页面。

那么我们就可以利用通了的80端口Nginx去反向代理到8000端口上的API接口服务。我们只需要对Nginx的配置文件做一点点修改。

Nginx的配置文件在下图所示:

接口API开发系列(3)
Nginx配置文件目录

配置文件nginx.conf具体修改如下:

接口API开发系列(3)
nginx.conf修改

找到server块,还是保持在80端口监听localhost。在location / 块里面可以把 root html; index,index.html…这两行用#注释掉。在下面补上关键的一行:

proxy_pass http://127.0.0.1:8000/;

这句很容易理解,就是把我们在80端口拿到的请求通过nginx转发给localhost的8000端口去响应。所以直接访问不同,我们仍可以利用nginx访问到API接口服务。

改完配置文件,保存,覆盖掉conf目录中原来的nginx.conf。然后重启nginx服务。重启服务的命令:

/usr/local/nginx/sbin/nginx -s reload

重启nginx之后,再访问http://虚拟机ip:80/显示就不是Nginx那个欢迎页面了。正常情况下就能显示API接口服务的响应结果了。比如我这里显示如下:

接口API开发系列(3)
浏览器发送get请求至API接口响应成功

当然我们可以把API接口服务在虚拟机上停止了,那么再通过80端口发送的get请求就拿不到8000端口上响应结果了。这是如果你没有改Nginx的其他配置,返回的就应该是Nginx默认的错误页面如下:

接口API开发系列(3)
API服务终止时的网页请求返回结果

在主机python程序中调用虚拟机上的API接口服务

我们做远程数据API接口服务,主要目的不是要通过网页请求去拿到数据。大多数时候,我们还是用程序去读取API接口返回的数据信息。

比如这个例子中,API接口服务启动在虚拟机的8000端口上,我们通过Nginx已经可以通过80端口把请求转发到8000端口的服务上。我们在Python代码中获取8000端口服务的代码怎么写呢?其实很简单,用requests给我们提供的方法即可。

import requests

r = requests.post('http://192.168.235.129:80/multi_post')
print(r.text)

这里我们用requests向虚拟机的80端口发送一个post请求。返回的结果如下:

接口API开发系列(3)
发送post请求响应结果

再测试下get请求:

import requests

r = requests.get('http://192.168.235.129:80/')
print(r.text)
接口API开发系列(3)
image

Part:小结

至此测试成功,如果想把量化模型计算好的数据通过API接口服务的方式提供给他人用代码访问,流程也就通了。后续就是如何限制访问权限和设计接口功能了。

原文始发于微信公众号(拒绝拍脑袋):接口API开发系列(3)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/54783.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!