安装redis提示[test] error 2_技术干货分享:一次flask+redis的微服务实战

先说一下需求的场景,策划部门想做一个垂直领域的社区产品,类似与知乎那种,但受益人群是金融行业的从业人员。产品中有一个搜索问题的需求,搜索的问题去题库中进行模糊匹配,终端支持H5/APP/小程序,甚至是微信的自动回复,用过ItChat的人都知道这个强大的工具包,不过最近好像有封号的动作了。做搜索,肯定就会用到分词,当前开源的分词库jieba是做的比较好的了,分析了一下技术栈,就决定用flask来实现一个微服务,供其他的服务模块使用。

b093d29a1786d40b4416e129330befd0.png

本人会着重讲一下环境的搭建,各种配置的坑。

0x01 升级操作系统

操作系统:CentOS 6.x

CentOS 7的玩家手动跳过该环节。首先6.x的版本,默认装的python的版本是2.6的版本,这个版本后面用到的一些软件支持的不是很好,所以我们首先要把python升级到2.7的版本。先创建一个update.sh脚本,然后把下面内容复制进去。

#!/usr/bin/env bash #安装依赖 yum install openssl openssl-devel zlib-devel gcc -y # apt-get install libssl-dev # apt-get install openssl openssl-devel # 下载源码 wget http://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz tar -zxvf Python-2.7.12.tgz cd Python-2.7.12 mkdir /usr/local/python2.7.12 # 开启zlib编译选项 # sed -i '467c zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz' Module/Setup sed '467s/^#//g' Module/Setup ./configure --prefix=/usr/local/python2.7.12 make make install if [ $? -eq 0 ];then echo "Python2.7.12升级完成" else echo "Python2.7.12升级失败,查看报错信息手动安装" fi cd mv /usr/bin/python /usr/bin/python2.6.6 ln -s /usr/local/python2.7.12/bin/python2.7 /usr/bin/python sed -i '1s/python/python2.6/g' /usr/bin/yum wget --no-check-certificate https://bootstrap.pypa.io/get-pip.py python get-pip.py if [ $? -eq 0 ];then echo "pip升级完成" else echo "pip安装失败,查看报错信息手动安装" fi rm -rf /usr/bin/pip ln -s /usr/local/python2.7.12/bin/pip2.7 /usr/bin/pip 

然后把这个脚本加上可执行的权限,并且运行。

chmod u+x update.sh

./update.sh

0x02 创建python虚拟空间

这一步完成之后,我们就开始隔离一个虚拟的空间来运行这个微服务,以后我们所有的程序都在隔离的虚拟空间中来运行,有点docker的概念,这样不管是用python2.x还是3.x都可以同时兼容了。

89dfa07bc5e7cb1c2bea010b84cdfc02.png

pip install virtualenv

cd /home/test/web

virtualenv ENV

cd bin

source active

至此就启动了这个docker,接下来就是在这个docker中安装我们requirement.txt中所需要的包了。

我们用的包有如下:

 pip install flask pip install jieba pip install pymysql pip install redis pip install virtualenv pip install uwsgi pip install xlrd

到此为止就可以在ENV的环境中,测试app的功能了,现在python myapp.py试一下各接口功能。

0x03 安装nginx

尽管测试成功了,但是线上是不能这么运行的,因为flask只是一个web框架,并不是一个web server的容器,flask自带的werkzeug只能用于开发环境,不能用于生产环境,对于web服务器,我们选择更专业的uWSGI,并且配合nginx作为反向代理。

151666a814712c9325a186f9f916dd97.png

首先,我们安装nginx

yum -y install nginx

默认的nginx的监听端口是80,如果部署在云服务器上,80端口极大的可能被占用了,我们要去修改这个配置文件。

cd /etc/nginx

vim conf.d

查看一下配置端口的配置文件在哪里,我们看到是default.conf这个文件中有端口号的配置,我们把所有端口号都改成我们想要的端口比如8100。

在 /etc/nginx/ngixn.conf 文件的 http 部分添加一条 include 内容,即最后一行

 http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; include /etc/nginx/sites-enabled/*; }

创建配置文件 vim /etc/nginx/sites-enabled/hello.conf

 server { # Running port listen 8100; # 服务器ip 或者域名 server_name 0.0.0.0;  # Proxying connections to application servers location / { include uwsgi_params; uwsgi_pass 127.0.0.1:5000;//和 uWSGI 配置文件中的 ip端口一致 } }

然后看系统中是否有nginx的service脚本

vim /etc/init.d/nginx

如果没有该脚本,在该脚本中写如下内容:

#!/bin/bash # chkconfig: - 85 15 nginx=/usr/sbin/nginx conf=/etc/nginx/nginx.conf case $1 in start) echo -n "Starting Nginx" $nginx -c $conf echo " done" ;; stop) echo -n "Stopping Nginx" $nginx -s stop echo " done" ;; test) $nginx -t -c $conf ;; reload) echo -n "Reloading Nginx" $nginx -s reload echo " done" ;; restart) $0 stop $0 start ;; show) ps -aux|grep nginx ;; *) echo -n "Usage: $0 {start|restart|reload|stop|test|show}" ;; esac

给该文件加上可执行权限

chmod u+x nginx

service nginx start

Nginx 在 /var/log/nginx 目录下有 access.log 和 error.log 两个日志文件,如果有问题可以查看这2个日志文件。

0x04 配置uWSGI

接下来配置uWSGI的启动文件,创建 uwsgi 配置文件

vim /etc/uwsgi/apps-enabled/hello.ini

 [uwsgi] // 开启主线程 master = true // 项目目录 base = /home/test/web // 移动到项目目录 cd chdir = %(base) // 本地的ip和端口 socket = 127.0.0.1:5000 // Python 虚拟环境目录 home = %(base)/ENV // 程序启动文件 wsgi-file = hello.py // 项目中引用 flask 实例的变量名 callable = app // 处理器数 processes = 2 // 线程数 threads = 4 // 获取uwsgi统计信息的服务地址 stats = 127.0.0.1:9191

保存配置文件,通过 uwsgi -i /etc/uwsgi/apps-enabled/hello.ini,来启动 uwsgi。

注意在env的环境下,uwsgi安装的目录不会在/usr/bin中,而是在ENV的bin中,所以

在后面的/etc/init.d/uwsgi中的路径要注意。

创建uWSGI的日志文件

vim /var/log/uwsgi/hello.log

创建uWSGI的service文件

vim /etc/init.d/uwsgi

#!/bin/bash # chkconfig: - 85 15 uwsgi=/home/test/web/ENV/bin/uwsgi hello_conf=/etc/uwsgi/apps-enabled/hello.ini case $1 in start) echo -n "Starting uWsgi" nohup $uwsgi -i $hello_conf >/var/log/uwsgi/hello.log 2>&1 & echo " done" ;; stop) echo -n "Stopping uWsgi" killall -9 uwsgi echo " done" ;; restart) $0 stop $0 start ;; show) ps -ef|grep uwsgi ;; *) echo -n "Usage: $0 {start|restart|stop|show}" ;; esac

添加可执行属性

sudo chmod +x /etc/init.d/uwsgi

service uwsgi start

uWSGI 在 /var/log/uwsgi 目录下有项目对应日志,有问题可以查看。

0x05 redis的安装

首先安装redis的编译工具gcc和gcc-c++

yum install gcc gcc-c++

然后从redis的官网上下载redis并且安装

 wget http://download.redis.io/releases/redis-3.2.5.tar.gz tar -zxvf /soft/redis-3.2.5.tar.gz cd redis-3.2.5 make & make install

然后配置redis.conf

bind 0.0.0.0

# 3.x版本,将此属性关闭

protected-mode no

添加redis的service服务

vim /etc/init.d/redis

#!/bin/sh # # Simple Redis init.d script conceived to work on Linux systems # as it does use of the /proc filesystem. REDISPORT=6379 EXEC=/usr/local/bin/redis-server CLIEXEC=/usr/local/bin/redis-cli PIDFILE=/var/run/redis_${REDISPORT}.pid CONF="/etc/redis/${REDISPORT}.conf" case "$1" in start) if [ -f $PIDFILE ] then echo "$PIDFILE exists, process is already running or crashed" else echo "Starting Redis server..." $EXEC $CONF fi ;; stop) if [ ! -f $PIDFILE ] then echo "$PIDFILE does not exist, process is not running" else PID=$(cat $PIDFILE) echo "Stopping ..." $CLIEXEC -p $REDISPORT shutdown while [ -x /proc/${PID} ] do echo "Waiting for Redis to shutdown ..." sleep 1 done echo "Redis stopped" fi ;; *) echo "Please use start or stop as first argument" ;; esac

然后启动服务

chmod u+x redis

service redis start

0x06 python中引入redis作为缓存

我们知道redis是k-v的数据缓存机制,当缓存数据为string, 或是hash类型的时候,都有原生的函数支持,具体可以参考redis的API文档。

但是当我们缓存我们自定义的实体类的时候,有点力不从心,这时候可以用pickle库来做序列化,先把实体类转换成string类型存储在redis中,取出的时候,再做反序列化的操作,具体代码如下:

#coding=utf-8  import redis import pickle class Redis: @staticmethod def connect(host='localhost', port=6379, db=0): r = redis.StrictRedis(host, port, db) return r # 将内存数据二进制通过序列号转为文本流,再存入redis @staticmethod def set_data(r, key, data, ex=None): r.set(pickle.dumps(key), pickle.dumps(data), ex) # 将文本流从redis中读取并反序列化,返回 @staticmethod def get_data(r, key): data = r.get(pickle.dumps(key)) if data is None: return None  return pickle.loads(data)

0x07 总结

到此为止,一个flask的app的部署就基本完成了,中间的环节比较琐碎,但互联网上的资料也很多,基本都可以解决,祝大家玩的开心!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现阿里云容器镜像服务反向访问代理

简介: 本文会先介绍镜像推送/拉取过程的交互逻辑来梳理需要代理的所有服务,再通过搭建一个公网 HTTPS 反向代理来访问容器镜像服务来向您展示多场景代理访问模式原理。 真实业务场景可能很复杂,因安全、合规、访问限制等原因可能需要&#x…

数字基础设施开源操作系统欧拉全新发布

在华为全联接2021上,面向数字基础设施的开源操作系统欧拉(openEuler)全新发布。欧拉操作系统可广泛部署于服务器、云计算、边缘计算、嵌入式等各种形态设备,应用场景覆盖IT(Information Technology)、CT&am…

mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...

阅读文本大概需要3分钟。MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes )。以InnoDB来说,每个InnoDB表具有一个特殊的索引称为聚集索引。如果表上定义有主…

共筑计算新生态 共赢数字新时代

[中国,深圳,2021年9月25日] 在华为全联接2021上,华为副总裁、计算产品线总裁邓泰华分享了六大数字生态的最新进展,并携手生态伙伴为计算产业带来一系列重磅内容:欧拉开源操作系统(openEuler)全新…

数据湖,已成为海量数据存储与分析的重要承载方式

简介: 在云计算和大数据时代,基于数据开展生产、运营、决策成为常态,根据Gartner报道,2019年数据基建方面的采购费用飙升到660亿美元,占据基础架构类软件费用的24%。数据的存储及应用体系是企业生态运转的中枢神经&…

Fluid 0.5 版本发布:开启数据集缓存在线弹性扩缩容之路

简介: 为了解决大数据、AI 等数据密集型应用在云原生场景下,面临的异构数据源访问复杂、存算分离 I/O 速度慢、场景感知弱调度低效等痛点问题,南京大学PASALab、阿里巴巴、Alluxio 在 2020 年 6 月份联合发起了开源项目 Fluid。 作者 | 顾荣 …

php生成cookie在哪,php程序中cookie的使用方法

Cookie 可以翻译为“小甜品,小饼干” ,Cookie 在网络系统中几乎无处不在,当我们浏览以前访问过的网站时,网页中可能会出现 :你好 XXX,这会让我们感觉很亲切,就好像吃了一个小甜品一样。这其实是…

c#类属性和实例属性_Visual C#类和对象的创建方式,定义类,实例化对象,实例讲解...

定义类类由class member类成员组成,包含字段、属性、方法和事件。其中字段和属性为类的数据成员,用来存储数据;方法负责数据的传递和运算。使用类之前,要进行声明,声明的语法如下:Class 类名称{访问权限 数…

面对不可避免的故障,我们造了一个“上帝视角”的控制台

简介: 混沌工程随着云原生的发展逐渐进入大家的视野,通过混沌工程可以很好地发现和解决在云原生化过程中的高可用问题。阿里巴巴在 2019 年开源了底层的混沌工程工具 - chaosblade,今年年初再次开源混沌工程控制台 chaosblade-box&#xff0c…

腾讯云鼎实验室发布云安全攻防矩阵,绘制九大攻防路径全景图

随着云计算技术和产业的蓬勃发展,企业上云已是数字化转型的必然趋势。但云上千般好,却也给企业带来了全新的安全挑战。云平台不仅要应对传统网络架构中存有的DDoS、入侵、病毒等常态问题,还要高度重视技术架构中虚拟机逃逸、资源滥用、横向穿…

Knativa 基于流量的灰度发布和自动弹性实践

简介: Knative 提供了基于流量的自动扩缩容能力,可以根据应用的请求量,在高峰时自动扩容实例数;当请求量减少以后,自动缩容实例,做到自动化地节省资源成本。此外,Knative 还提供了基于流量的灰度…

nginx 部署_部署 hexo 到 nginx

本来博客是使用 GitHub pages ,但近些日子访问贼慢,刚好手里有一台小机器,当然是要用起来(折腾就对了 )。前置条件:已购买 vps 和域名,按需备案。ssh 登录远程服务器,以 CentOS 为例…

阿里云云效技术专家:一文详解kubernetes下5种常见发布模式如何选择

简介: Kubernetes下5场场景应用发布方式的选择,每种发布模式适合什么样的场景,以及如何在阿里云云效上高效落地。 作者:郑云龙,阿里云云效技术专家 Kubernetes面向通用场景提供了非常灵活的应用管理和运维方式&#…

“西部云安全优才计划”落地西安,为云安全高质量发展夯实才智支撑

9月26日,2021首届-西部云安全峰会在西安顺利召开。聚焦西部云安全发展和人才培养需求,在本次峰会上,腾讯安全云鼎实验室、陕西省计算机学会联合西安多所高校发布了“西部云安全优才计划”,凝聚西安以及西部的安全力量,…

如何做一场高质量的分享?

简介: 最近我发现一些同学的分享越来越趋于“念稿”式。我一边看着分享的同学在上面念稿,另一边看着几十号人在下面看电脑看手机,我心里就特别着急。恨不得我自己上去讲,也恨不得没收了大家的电脑手机。但这种粗暴的方法肯定是不解…

matlab knn实现,Matlab之KNN实现

1. 算法流程1) 通过Matlab产生高斯分布产生两类数据,并标明类别2) 数据初始化:设置K某个常数(一般为奇数)3) 对于每个测试数据,计算其到两类数据的所有点的距离对于上述求得的距离,选出K个最小的,检…

matlab 计算 工程,matlab工程计算.doc

您所在位置:网站首页 > 海量文档&nbsp>&nbsp计算机&nbsp>&nbspmatlabmatlab工程计算.doc167页本文档一共被下载:次,您可全文免费在线阅读后下载本文档。下载提示1.本站不保证该用户上传的文档完整性,不预览、不比…

matlab制作打地鼠游戏,scratch编程制作打地鼠的游戏教程

scratch编程制作打地鼠的游戏教程Sk1少儿编程网-https://www.pxcodes.comSk1少儿编程网-https://www.pxcodes.com首先,新建背景和角色,从背景库/角色库中分别选择森林和地鼠、锤子Sk1少儿编程网-https://www.pxcodes.com1.角色:洞Sk1少儿编程…

php301重定向跳转,php如何设置301重定向跳转

php设置301重定向跳转的方法:在跳转前设置状态码【header( "HTTP/1.1 301 Moved Permanently" );header("Location:your_dest_url")】。本教程操作环境:windows7系统、PHP5.6版,DELL G3电脑,该方法适用于所有…

华为发布《大交通时代》:开启未来数字交通宏图

9月24日,在华为全联接2021大会期间,华为携手电子工业出版社及行业专家、共同举办了业内首部交通行业数字化转型系统性专著《大交通时代:行业数字化转型之道》(以下简称《大交通时代》)新书发布媒体沟通会。本书理论结合…