一、 更新系統 #yum -y install epel-release #yum clean all && yum makecache #yum -y update 二、安裝python3 系統自帶的python版本是2,並且沒有安裝pip 1、python2安裝pip #yum -y insta ...
一、 更新系統
#yum -y install epel-release
#yum clean all && yum makecache
#yum -y update
二、安裝python3
系統自帶的python版本是2,並且沒有安裝pip
1、python2安裝pip
#yum -y install python-pip (前提已安裝epel-release)
更新pip: pip install --upgrade pip
[root@localhost ~]# pip -V
2、安裝python3
系統自帶的python2還有好多其他系統組件在使用,比如yum,所以要把python3安裝到其他目錄下
(1)安裝相關包
# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel
(2)下載 Python 3.7.0源碼包
#cd /usr/local/src &&
wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tar.xz
(3)#tar xf Python-3.7.0.tar.xz (yum -y install xz #若失敗,重建yum緩 yum clean all ,yum makecache)
(4)#cd Python-3.7.0
(5)#./configure --prefix=/usr/local/python3
(6)#make && make install
安裝成功後的提示:
Collecting setuptools
Collecting pip
Installing collected packages: setuptools, pip
Successfully installed pip-10.0.1 setuptools-39.0.1
//從 Python 3.4 開始就已經自帶了 pip 和 easy_install(setuptools 包帶的命令) 包管理命令,你可以在 /usr/local/python3/bin/ 目錄下看到,查看一下已經安裝的擴展包:
(7)#/usr/local/python3/bin/pip3 list
Package Version
---------- -------
pip 10.0.1
setuptools 39.0.1
// 更新pip(若上述命令提示pip版本不是最新則需要更新)
(8)#/usr/local/python3/bin/pip3 install --upgrade pip
(9)創建軟連接
執行ln -s /usr/local/python3/bin/python3 /usr/bin/python3命令創建python3軟連接。
執行ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3命令創建pip3軟連接
查看Python3和pip3是否安裝成功。
# python3 -V
Python 3.7.0
# pip3 -V
pip 10.0.1 from /usr/local/python3/lib/python3.7/site-packages/pip (python 3.7)
這樣一來,python出來的是python2.7,python3出來的是python3.5.2,互不幹擾。
三、創建項目目錄,安裝虛擬環境
(1)創建項目目錄,安裝虛擬環境
#mkdir –p /home/microblog && cd /home/microblog && python3 -m venv venv
(2)激活虛擬環境,安裝項目所需的依賴包
需要事先把requirements.txt放入項目所在目錄中
[root@localhost microblog]# source venv/bin/activate
(venv) [root@localhost microblog]#pip3 install -r requirements.txt
(3)上傳項目代碼
演示使用,本例用一個最簡單的flask應用:mocroblog.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from flask import Flask
app = Flask(__name__)
@app.route('/')
@app.route('/index')
def index():
return "Hello World!"
if __name__ == '__main__':
app.run()
(4)測試
(venv) [root@localhost microblog]# python3 microblog.py
* Serving Flask app "microblog" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
再打開一個視窗,運行:
[root@localhost ~]# curl -i http://127.0.0.1:5000
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 12
Server: Werkzeug/0.14.1 Python/3.7.0
Date: Sat, 07 Jul 2018 03:52:31 GMT
Hello World!
一切正常!
四、安裝項目使用的web服務
1、安裝nginx
# yum install nginx
預設安裝目錄:/etc/nginx
2、安裝supervisor
註意:此軟體要求系統Python版本不能高於3
#yum install supervisor
3、安裝gunicorn
註意,這個要安裝在項目使用的虛擬環境中
[root@localhost nginx]# cd /home/microblog/
[root@localhost microblog]# source venv/bin/activate
(venv) [root@localhost microblog]# pip3 install gunicorn
五、相關配置文件設置
(1)nginx相關配置
把nginx.conf中server{}塊註釋,在/etc/nginx/conf.d/目錄中添加項目使用的以conf結尾的文件,比如:m.conf,內容如下:
server {
listen 80; #nginx監聽埠
server_name 192.168.109.128; #功能變數名稱或IP
location / {
proxy_pass http://127.0.0.1:9000; #監聽代理埠
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
重載nginx服務:service nginx start
(2) supervisor配置
預設配置文件:(1)/etc/supervisord.conf
在該文件最後一行有這樣的信息:
[include]
files = supervisord.d/*.ini
也就說說我們在這個目錄下創建一個以ini結尾的文件即可
比如:/etc/supervisord.d/m.ini
其內容如下:
[program:microblog]
directory = /home/microblog
command = /home/microblog/venv/bin/gunicorn -b 127.0.0.1:9000 -w 2 microblog:app #一定要是虛擬環境中的絕對路徑
user = root
autostart = true
autorestart = true
stopasgroup = true
killasgroup = true
startsecs = 5
startretries = 3
redirect_stderr = true
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
stdout_logfile = /var/log/usercenter_stdout.log
啟動:supervisord -c /etc/supervisord.conf
彙總介紹:(個人拙見,不知道對不對)
nginx監聽本機的80埠,然後把監聽到的信息轉發給http:127.0.0.1:9000指定的位置,
這個地址是gunicorn在監聽所以就把這個信息又轉發給虛擬環境中去。
supervisor是用來管理gunicorn的,就跟管理使用php-fpm管理php
若是有多個項目的話,除了nginx需要配置外,supervisor也需要配置
五、測試
使用瀏覽器訪問:ip即可得到flask響應的結果:
註意防火牆放行80埠
若是項目中沒有設置debug=True,則更改項目內容後想看到效果需要重載一下supervisor服務:supervisorctl reload
nginx+gunicorn+flask:這種模式就是不使用supervisor管理gunicorn
單獨執行gunicorn命令:gunicorn -b 127.0.0.1:9000 microblog:app
擴展1:supervisorctl的使用
supervisorctl status # 查詢進程狀態
supervisorctl stop node # 關閉 [program:node] 的進程
supervisorctl start node # 啟動 [program:node] 的進程
supervisorctl restart node # 重啟 [program:node] 的進程
supervisorctl stop all # 關閉所有進程
supervisorctl start all # 啟動所有進程
supervisorctl reload # 重新讀取配置文件,讀取有更新(增加)的配置文件,不會啟動新添加的程式
supervisorctl update # 重啟配置文件修改過的程式
擴展2:常見的gunicorn配置
[program:microblog]
directory = /home/microblog ; 程式的啟動目錄
command = gunicorn -c gunicorn.py wsgi:app ; 啟動命令,可以看出與手動在命令行啟動的命令是一樣的,使用虛擬環境中的絕對路徑
autostart = true ; 在 supervisord 啟動的時候也自動啟動
startsecs = 5 ; 啟動 5 秒後沒有異常退出,就當作已經正常啟動了
autorestart = true ; 程式異常退出後自動重啟
startretries = 3 ; 啟動失敗自動重試次數,預設是 3
user = leon ; 用哪個用戶啟動
redirect_stderr = true ; 把 stderr 重定向到 stdout,預設 false
stdout_logfile_maxbytes = 20MB ; stdout 日誌文件大小,預設 50MB
stdout_logfile_backups = 20 ; stdout 日誌文件備份數
; stdout 日誌文件,需要註意當指定目錄不存在時無法正常啟動,所以需要手動創建目錄(supervisord 會自動創建日誌文件)
stdout_logfile = /data/logs/usercenter_stdout.log