最近使用flask寫了一些簡單的服務。html
服務部署到服務器上進行使用,這個過程會有一些問題,須要進行記錄一下。python
說明運行的環境狀況。使用的是python3.6的虛擬環境,系統是centos7,其餘的有uwsgi,supervisor,ngnix。nginx
首先準備一個簡單的flask服務。django
代碼ipapp.py:flask
# encoding=utf-8 # date: 2019/3/5 __author__ = "Masako" from flask import Flask app = Flask(__name__) @app.route('/') def index(): return "<p>my ip: 37.221.204.206</p>" if __name__ == "__main__": app.run()
1、安裝python3.6centos
1.下載服務器
# wget https://www.python.org/ftp/python/3.6.8/Python-3.6.8.tgz app
2.解壓 curl
# tar -zxvf Python-3.6.8.tgz socket
3.到解壓好的文件夾先配置
# cd Python-3.6.8
# ./configure
*遇到問題
安裝gcc
# yum install -y gcc
再配置,成功。
4.繼續編譯及安裝
# make && make install
5.建立虛擬環境
個人工做文件夾爲 /root/ip_tool, 在這裏執行命令
# virtualenv -p /usr/local/bin/python3 ip_env
建立的是本身安裝的python3的虛擬環境
而後在虛擬環境安裝一些須要的python庫,如flask等
2、安裝並配置uwsgi
uwsgi是服務器的一種,主要用來跑你的服務
1.安裝
在虛擬環境執行
# pip install uwsgi
2.測試uwsgi
使用uwsgi啓動一下個人flask服務
------
爲了方便,先裝了一個screen
# yum install screen
而後在screen內測試uwsgi
------
簡單啓動個人ipapp.py
# uwsgi --http 127.0.0.1:5000 --wsgi-file ipapp.py --callable app
因爲在screen內運行的uwsgi,因此退到screen外部執行
# curl http://127.0.0.1:5000
驗證獲得下圖
3.配置文件
把uwsgi的參數寫到文件裏面,保存爲test_uwsgi.ini
[uwsgi] base = /root/ip_pool http = 127.0.0.1:5000 wsgi-file = ipapp.py callable = app
再使用文件打開服務,注意在虛擬環境
# uwsgi --ini test_uwsgi.ini
結果與使用uwsgi命令運行服務相同
若是使用uwsgi打開服務有問題,多是uwsgi路徑或者配置相關問題,須要找到對應方案解決
3、安裝並配置nginx
nginx是一個代理服務器。
1.安裝
# yum install nginx
*出現問題 No package nginx available.
安裝一下源
# yum install epel-release
再執行上一條命令,成功
2.測試
打開nginx
# /bin/systemctl start nginx.service
在別的地方輸入服務器的地址,或者curl,能夠看到 "Welcome to nginx" 之類的字樣
3.配置
先到nginx安裝的文件夾,如/etc/nginx/,有多是其餘的,能夠本身找一下
# cd /etc/nginx/
編輯 "nginx.conf"
若是有一些配置文件,能夠都放在一個文件夾中,如"conf.d",而後在配置中包含這個文件夾,即在nginx.conf的末尾加上
include /etc/nginx/conf.d/*.conf;
在這裏,我簡單配置,直接修改nginx.conf
找到「location /」,將大括號裏的內容修改以下
location / { include uwsgi_params; uwsgi_pass 127.0.0.1:10050; uwsgi_param UWSGI_PYHOME /root/ip_pool/ip_env/bin/python; uwsgi_param UWSGI_CHDIR /root/ip_pool; uwsgi_param UWSGI_SCRIPT ipapp:app; }
此時,個人ipapp.py放在文件夾「/root/ip_pool」中,並有虛擬環境ip_env,啓動文件爲ipapp.py, 應用名爲app。
咱們再修改一下uwsgi的配置,
[uwsgi] base = /root/ip_pool # http = 127.0.0.1:5000 socket = 127.0.0.1:10050 wsgi-file = ipapp.py callable = app
能夠看到,將http更換成了socket,而且保持地址與nginx中配置的 uwsgi_pass 一致。
咱們重啓nginx /bin/systemctl reload nginx.service
在虛擬環境啓uwsgi服務
4.再測試
在另外一個地方(另外一臺機器)輸入個人IP地址,獲得我寫的網頁
*若是訪問不起,檢查一下端口防火牆之類的。
到此,服務就部署可用了。
4、安裝並使用supervisor
supervisor主要用來管理進程,這裏使用其管理uwsgi程序。
1.安裝,使用機器環境
# yum install supervisor
生成配置文件
# echo_supervisord_conf > /etc/supervisord.conf
啓動supervisor服務
# supervisord -c /etc/supervisord.conf
查看狀態
# supervisorctl status
*出現 unix:///tmp/supervisor.sock no such file , 建立文件後出現 unix:///tmp/supervisor.sock refused connection,多是服務沒有啓動
2.配置
配置配置文件,在 "/etc/supervisord.conf"文件中,取消註釋"[include]",增長本身的配置文件夾,這裏我使用supervisord.d
即在"/etc/supervisord.conf"增長如下2行內容
[include] files = supervisord.d/*.conf
*.conf是我本身的文件後綴,默認是.ini
配置本身的項目,編輯我本身的項目配置,配置以下
[program:ip] directory=/root/ip_pool command=/root/ip_pool/ip_env/bin/uwsgi --ini test_uwsgi.ini autostart=true user=root stderr_logfile=/tmp/ip_stderr.log stdout_logfile=/tmp/ip_stdout.log
這個文件放在/etc/supervisord.d裏面便可,名字隨便取一個,後綴爲.conf
重啓supervisorctl,這個任務就跑起來了
若是跑不起來,端口占用,多是以前的uwsgi任務沒有關。
這個時候再次訪問服務器ip地址,獲得的結果與以前相同。也就是supervisor只是用來跑這個程序的輔助工具。
總結
使用uwsgi + nginx 配置服務,加上supervisor管理,須要的流程比較長,配置的文件比較多。
須要耐心處理,遇到問題,多看提示,不會的搜索一下,不少人會遇到一樣的問題。
總的來講,除了安裝必要的環境,須要修改或增長的文件有如下幾個:
1.nginx,修改nginx.conf,配置路由、接口
2.uwsgi,增長uwsgi.ini,也能夠不增長,直接執行命令,跑flask應用
3.supervisor,增長myapp.conf,配置個人uwsgi的參數
4.supervisor,修改supervisord.conf,增長包含本身編輯的配置文件路徑,以使supervisor找到配置文件並啓動程序
後續再同一臺機器上配置其餘服務時,只須要修改路由,增長兩個配置文件(supervisor和uwsgi),文件大體相同,修改端口和須要執行的命令便可。
若是涉及到更加複雜的服務,能夠豐富一下配置文件,根據需求,增長配置參數。
參考文章連接:
http://docs.jinkan.org/docs/flask/
http://www.supervisord.org/introduction.html
http://www.runoob.com/django/django-nginx-uwsgi.html
https://www.cnblogs.com/liubiao/p/6689081.html
https://www.cnblogs.com/if-then/p/7259865.html
https://www.cnblogs.com/alice-bj/articles/9298177.html