安装redis提示[test] error 2_技术干货分享:一次flask+redis的微服务实战
先說一下需求的場景,策劃部門想做一個垂直領域的社區產品,類似與知乎那種,但受益人群是金融行業的從業人員。產品中有一個搜索問題的需求,搜索的問題去題庫中進行模糊匹配,終端支持H5/APP/小程序,甚至是微信的自動回復,用過ItChat的人都知道這個強大的工具包,不過最近好像有封號的動作了。做搜索,肯定就會用到分詞,當前開源的分詞庫jieba是做的比較好的了,分析了一下技術棧,就決定用flask來實現一個微服務,供其他的服務模塊使用。
本人會著重講一下環境的搭建,各種配置的坑。
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都可以同時兼容了。
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作為反向代理。
首先,我們安裝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的部署就基本完成了,中間的環節比較瑣碎,但互聯網上的資料也很多,基本都可以解決,祝大家玩的開心!
總結
以上是生活随笔為你收集整理的安装redis提示[test] error 2_技术干货分享:一次flask+redis的微服务实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3怎么定义long_pyth
- 下一篇: c语言中 数组 左移,如何将一个数组的