
永遠(yuǎn)不要逃避問題,有些問題你是逃不過去的,你現(xiàn)在逃避,你以后就會花十倍的精力去面對,因為時間不會給弱者任何回報 。
安裝編譯用的包
如果在 root 下就不用輸入 sudo。在子用戶下就在命令前加上 sudo。
$ sudo apt-get install build-essential
$ sudo apt-get install libncurses5-dev libncursesw5-dev libreadline6-dev
$ sudo apt-get install libdb5.1-dev libgdbm-dev libsqlite3-dev libssl-dev
$ sudo apt-get install libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev
下載安裝 Python3
- 下載 Python3 包
$ wget --no-check-certificate
https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
'下載可能會出現(xiàn)證書無效問題,只要安裝個 ca-certificates 或使用 --no-check-certificate 下載就可以避免下面的錯誤'
- 進入下載目錄
$ cd 下載的目錄下/
- 解壓包
$ tar -zxf Python-3.6.3.tgz
- 進入python3
$ cd Python-3.6.3
編譯安裝
(1)解決 PIP 包管理器所需依賴包
$ vim Modules/Setup.dist
(2)將下面 1 行取消注釋,大概在文件的 361 行左右.修改后 esc:wq 保存并退出
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
自定義安裝目錄
(1)創(chuàng)建安裝目錄
$ mkdir -p /usr/local/python3.6.3
(2)進入 Python3 目錄
$ cd Python-3.6.3
(3)指定到安裝目錄
$ ./configure --prefix=/usr/local/python3.6.3
$ ./configure --enable-optimizations
(4)這里編譯使用的是 make all 沒有直接使用 make,all 參數(shù)會編譯所有子模塊。
$ make all
$ make install
把 Python3 添加到 PATH 里
(1)打開~/.bashrc 文件
(2)添加執(zhí)行路徑
$ sudo vim ~/.bashrc
export PATH=$PATH:/usr/local/python3.6.3/bin
添加新的別名信息來修改默認(rèn)使用的Python版本
alias python='/usr/bin/python3.6.3'
(3)生效配置文件
$ source .bashrc
(4)查看版本:
因為上面已經(jīng)添加了默認(rèn)使用 Python3.6.3,所以直接輸入 $ python -V 會出現(xiàn)
(-bash: /usr/bin/python3.6.3: No such file or directory)
報錯。
查看 Python 版本輸入以下:
$ sudo vim ~/.bashrc
export PATH=$PATH:/usr/local/python3.6.3/bin
安裝 Nginx
(1)安裝
$ sudo apt-get install nginx
# 查看版本
$ nginx -v
(2)啟動 Nginx
$ sudo /etc/init.d/nginx start
瀏覽器訪問:你的服務(wù)器ip地址 如:http://45.45.162.162
出現(xiàn)上圖:表示成功
(3)停止 Nginx
$ sudo nginx -s stop
安裝 uWSGI
(1)因為已經(jīng)安裝 Python3 所以要使用 pip3 進行安裝
$ pip3 install uwsgi
(2)查看版本
$ uwsgi --version
(3)安裝方法二
下載:
$ wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
(4)解壓:
$ tar zxvf uwsgi-latest.tar.gz
測試
如果:有現(xiàn)成的項目可以把項目上傳到服務(wù)器中,在 git 管理項目,只需要 git clone 一下就可以了。
如果:你需要從本地上傳項目文件,可以用 scp 命令,這里就不啰嗦用法了??傊覀儗㈨椖课募诺椒?wù)器,然后就可以用 virtualenv 管理 Python 環(huán)境
virtualenv 就不多說了。這里直接用 flask demo 進行。
一、安裝虛擬環(huán)境
$ pip3 install virtualenv
二、創(chuàng)建一個包
$ mkdir myproject
$ cd myproject
三、創(chuàng)建虛擬環(huán)境
$ virtualenv env
(1)激活虛擬環(huán)境
$ source env/bin/activate
(2)在虛環(huán)境中安裝 flask
$ pip3 install flask
(3)退出虛環(huán)境
$ deactivate
(4)創(chuàng)建啟動文件
$ vim run.py
(5)寫入一個 flask,端口自己進行設(shè)置。我這里用的 80 端口。
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
(6)esc+wq 保存并且退出
四、運行這個 run.py 文件
(1)先停止 Nginx
$ nginx -s stop
(2)打開你設(shè)置的端口(端口默認(rèn)全部是關(guān)閉狀態(tài))端口自行設(shè)置。
$ iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# 如果想關(guān)閉打開的端口:
$ iptables -A INPUT -p tcp --dport 80 -j DROP
(3)啟動 flask 程序
$ cd myproject
$ python3 run.py
五、用其他電腦和手機 4G 訪問你的服務(wù)器 ip 地址+上端口。
如:http://45.32.122.555:80/
出現(xiàn):Hello World! 那就成功了。
配置 Nginx
(1)進入
$ cd /etc/nginx/sites-enabled/
(2)編輯 default
$ vim default
------------------------------------
# 或者直接配置 $ cd /etc/nginx
$ vim nginx.conf
# 不過要根據(jù)其語法來配置其實最后nginx.conf還是會調(diào)用/etc/nginx/sites-enabled/default的配置。
(3)在最后寫入后 : wq 保存并且退出
server {
listen 80;
server_name 45.32.162.255;
charset utf-8;
client_max_body_size 75M;
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:8000;
uwsgi_param UWSGI_PYHOME /root/myproject/venv;
uwsgi_param UWSGI_CHDIR /root/myproject;
uwsgi_param UWSGI_SCRIPT run:app;
}
}
(4)解析
listen 80; # 服務(wù)器監(jiān)聽端口
server_name 45.32.162.255; # 這里寫你的域名或者公網(wǎng)IP
charset utf-8; # 編碼
client_max_body_size 75M; # 之前寫的關(guān)于GET和POST的區(qū)別
include uwsgi_params; # 導(dǎo)入uwsgi配置
uwsgi_pass 127.0.0.1:8000; # 轉(zhuǎn)發(fā)端口,需要和uwsgi配置當(dāng)中的監(jiān)聽端口一致 (下面會配置uwsgi)
uwsgi_param UWSGI_PYTHON /root/myproject/venv; # Python解釋器所在的路徑(這里為虛擬環(huán)境)【路徑按照自己具體的路徑填寫】
uwsgi_param UWSGI_CHDIR /root/myproject; # 項目根目錄
uwsgi_param UWSGI_SCRIPT run:app; # 項目的主程序,即Flask app所在的位置【run是運行文件run.py文件(根據(jù)自己創(chuàng)建的文件名)app是falsk實例】
(5)測試一下配置文件是否正確,若檢測配置文件失敗,再好好檢查下配置文件有沒有疏漏。
$ nginx -t
表示測試成功
(6)此時訪問 Nginx 服務(wù)器應(yīng)該會得到 502 Bad Gateway 的提示,因為請求被 Nginx 轉(zhuǎn)發(fā)了,但是并沒有轉(zhuǎn)發(fā)服務(wù)器來處理請求(還沒有配置好 uwsgi)。
$ service nginx start
配置 uwsgi
一、在項目文件根目錄新建配置文件 uwsgi.ini(uwsgi 支持多種配置文件格式: xml, ini, json 等)
(1)進入項目根目錄
$ cd myproject
(2)創(chuàng)建 uwsgi 文件
$ vim uwsgi.ini
(3)寫入以下內(nèi)容后 : wq 保存并退出
[uwsgi]
socket = 127.0.0.1:8000
plugins = python
chidir = /root/myproject
wsgi-file = run.py
callable = app
# uwsgi的監(jiān)聽端口【要跟上面nginx配置里的端口一樣】
# 這行一定要加上,不然請求時會出現(xiàn)-- unavailable modifier requested: 0 --錯誤提示
# 項目根目錄【路徑按照自己具體的路徑填寫】
# flask程序的啟動文件【這里我命名為run.py】
# 程序變量名 【app是falsk實例變量】
二、啟動測試
(1)啟動 Nginx
$ service nginx restart
(2)啟動 uwsgi
注意要回到項目根目錄下執(zhí)行
$ cd ~
$ cd myproject
$ uwsgi uwsgi.ini
若一切正常的話就可以在終端上看到 uwsgi 的啟動信息了
(3)打開瀏覽器
訪問你的 ip 加上端口
例:http://45.32.162.255:80
頁面出現(xiàn):Hello World!
說明 Nginx 和 uwsgi 配置成功了
但離真正項目上線還差一段,因為 uwsgi 是直接在前臺啟動的,當(dāng)我們的連接終端跟服務(wù)器斷開的時候 uwsgi 進程也被關(guān)閉了,所以我們需要 uwsgi 在后臺運行。
解釋一下上面這段話:我們在連接服務(wù)器啟動項目后可以用瀏覽器訪問成功。但是我們一但關(guān)閉與服務(wù)器的連接后再用瀏覽器訪問就不行了.項目是運行在前臺的也就是說.在關(guān)閉與服務(wù)器連接的同時也關(guān)閉了服務(wù)器的命令窗.運行在前臺的項目也同時關(guān)閉。所以我們需要把項目運行在后臺。
三、后臺啟動項目
(1)用 nohup 啟動:不掛斷運行命令,用"&"可以讓你的命令在后臺執(zhí)行
(nohup 詳細(xì)的命名參數(shù)請到官網(wǎng)查詢)注意:別漏了 & 號。
$ nohup uwsgi uwsgi.ini &
(2)關(guān)閉與服務(wù)器的連接,然后用瀏覽器訪問你的 ip 地址:
顯示:Hello World! 表示 ok 了!
(3)可以通過命令把這個項目從后臺停止,查詢 uwsgi 的進程( linux 命令不詳細(xì)說了)
$ ps -ef|grep uwsgi
找到 uwsgi 進程 uwsgi.ini:
root 7950 1 0 14:57 ? 00:00:00 uwsgi uwsgi.ini
進程 id 每個人都不一樣 這里的 id 是 7950。
(4)殺掉后臺的 uwsgi 進程 kill -9 后面加上進程的 id 或者 killall uwsgi 殺掉全部同名為 uwsgi 的進程。
$ kill -9 7950
$ killall uwsgi
(5)再用瀏覽器去訪問 ip
瀏覽器頁面顯示: 502 Bad Gateway 表示停止掉 uwsgi 程序的運行
(6)項目根目錄下會生成 nohup.out 記錄日志
使用 Supervisor 進程監(jiān)控
** Supervisor 是 Python2 寫就的一款強大的運維工具。**
目前 Supervisor 還不支持 Python3??梢酝ㄟ^以下方法解決。
可通過 pip 安裝.這里用的是 Python3 的 pip.所以會安裝失敗.使用以下.
(1)首先安裝 supervisor (默認(rèn)由自帶的 python2.7 驅(qū)動)
$ apt-get install supervisor
(2)進入默認(rèn)配置文件(修改配置文件)
$ cd /etc/supervisor/
$ vim supervisord.conf
按 shift+G 跳到末尾
添加:files = /etc/supervisor/*.conf
esc:wq 保存
這樣方便為每個 app 單獨設(shè)置 conf 文件而不必全部寫在全局設(shè)置里面
在啟動 supervisorctl 須先啟動 supervisord。
否則會出現(xiàn)
error:
<class 'socket.error'>, [Errno 99] Cannot assign requested address: file: /usr/lib/python2.7/socket.py line: 575錯誤
執(zhí)行:(若不是在 root 下執(zhí)行在最前面加上 sudo)
$ supervisord -c /etc/supervisor/supervisord.conf
$ supervisorctl -c /etc/supervisor/supervisord.conf
# 這里補充以一下:每當(dāng)修改完配置后如果出現(xiàn)
error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib/python2.7/socket.
# 請重新執(zhí)行以上的兩句命令
進入:supervisor shell 模式表示成功
退出:supervisor shell
supervisor> exit
(3)創(chuàng)建腳本文件,生成默認(rèn)配置文件.
$ cd /etc/supervisor/conf.d/
新建app.conf文件(文件名自己定義)
$ vim app.conf
(4)進入編輯模式添加配置
[program:myproject]
directory = /root/myproject/
command= uwsgi --ini /root/myproject/uwsgi.ini
autostart = true
startsecs = 5
autorestart = true
startretries = 3
user = root
redirect_stderr = true
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
stdout_logfile = /tmp/app.log
stopasgroup=false
killasgroup=false
esc:wq 保存并退出
解析
[program:myproject]:# 項目的包名字(我的是myproject)
directory = /root/myproject/:# 程序的啟動目錄路徑
command= uwsgi --ini /root/myproject/uwsgi.ini:#啟動命令
(相當(dāng)于直接啟動 uwsgi uwsgi.ini一樣只是加上了路徑)
autostart = true:# 在 supervisord 啟動的時候也自動啟動
startsecs = 5: # 啟動 5 秒后沒有異常退出,就當(dāng)作已經(jīng)正常啟動了
autorestart = true:# 程序異常退出后自動重啟
startretries = 3:# 啟動失敗自動重試次數(shù),默認(rèn)是 3
user = root: # 使用哪個用戶啟動(我這里用的root)
redirect_stderr = true:# 把 stderr 重定向到 stdout,默認(rèn) false
stdout_logfile_maxbytes = 20MB:# stdout 日志文件大小,默認(rèn) 50MB
stdout_logfile_backups = 20:# stdout 日志文件備份數(shù)
注意:
stdout 日志文件,需要注意當(dāng)指定目錄不存在時無法正常啟動,所以需要手動創(chuàng)建目錄( supervisord 會自動創(chuàng)建日志文件)別忘了配置之后創(chuàng)建下面繼續(xù)。
stdout_logfile = /tmp/app.log
說下這兩個有用的配置項 stopasgroup 和 killasgroup,如果我們用 Flask 等 Rest 服務(wù),通常其會開啟幾個進程,那么如果 stopasgroup 不啟用的話, supervisor 無法重啟此服務(wù)(關(guān)閉主進程時其子進程沒有關(guān)閉,再開啟主進程時會提示端口被占用等錯誤信息)。
stopasgroup=false:
默認(rèn)為 false,如果設(shè)置為 true,當(dāng)進程收到 stop 信號時,會自動將該信號發(fā)給該進程的子進程。如果這個配置項為 true,那么也隱含 killasgroup 為 true。例如在 Debug 模式使用 Flask 時,F(xiàn)lask 不會將接收到的 stop 信號也傳遞給它的子進程,因此就需要設(shè)置這個配置項。
killasgroup=false:
默認(rèn)為 false,如果設(shè)置為 true,當(dāng)進程收到 kill 信號時,會自動將該信號發(fā)給該進程的子進程。如果這個程序使用了 python 的 multiprocessing 時,就能自動停止它的子線程。
# 創(chuàng)建日志的文件夾
$ cd ~
$ cd /myproject/
$ mkdir tmp
配置完成。
還有更多的配置參數(shù)請查閱官網(wǎng)
這里我們可以看出,雖然 supervisor 是 Python2 寫的,但只要我們指定運行的 Python3 解釋器去運行程序就行了。
(5)使配置生效(每當(dāng)修改主配置文件或增改子配置文件都需要執(zhí)行使它生效)
需要先進入 $ cd /etc/supervisor 目錄或者項目的目錄 cd myproject/ 才可以運行相關(guān)的命令如:supervisorctl reload 等相關(guān)命令
$ supervisorctl update # 因為是python3執(zhí)行該命令可能會報錯
# 可以使用以下命令:重新加載配置文件
$ supervisorctl reload
(6)運行 supervisorctl,即可進入 shell 里面方便的操作,如 start app、restart app等。
$ cd /etc/supervisor
$ supervisorctl
$ start myproject # 你的項目名稱
# 執(zhí)行start后可以看到 myproject RUNNING pid 16758, uptime 0:02:58
$ restart myproject # 重新啟動
$ stop myproject # 停止
# 更多相關(guān)命令可以到官網(wǎng)上查閱這里不消息介紹
(7)以上我們只能在控制臺查看運行.我們需要 web 界面上查看
# 添加修改配置文件
$ cd /etc/supervisor/
$ vim supervisord.conf
# 如果在 vim 模式下找到則對應(yīng)修改
# 如果沒有 按 shift+G 跳至末尾添加
# IP和綁定端口
# 管理員名稱
# 管理員密碼
[inet_http_server]
port = 45.32.111.111:9001
username = user
password = 666666
# 如果不需要密碼可以注釋在最前面機上;號
# ;username = user
# ;password = 666666
# 重新加載配置文件使它生效
$ cd /etc/supervisor
$ supervisorctl reload
# 最后你需要打開你的這個端口并且重啟 supervisorctl
$ iptables -A INPUT -p tcp --dport 9001 -j ACCEPT
$ cd /etc/supervisor
$ supervisorctl
(8)用瀏覽器啟動
# 輸入你的 ip 和端口
45.32.111.111:9001

看到上圖界面表示已經(jīng)成功,之后可以通過打開 Supervisor 端口去監(jiān)控管理你的項目一鍵啟動/停止你的項目。
有什么遺漏不足的請多多指導(dǎo)?。?!
作者:[沙河頂戰(zhàn)神]
原文鏈接:http://www.cnblogs.com/yangyuexiong/p/7825306.html
技術(shù)交流群:238757010