永遠(yuǎn)不要逃避問題,有些問題你是逃不過去的,你現(xiàn)在逃避,你以后就會(huì)花十倍的精力去面對(duì),因?yàn)闀r(shí)間不會(huì)給弱者任何回報(bào) 。
安裝編譯用的包
如果在 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
'下載可能會(huì)出現(xiàn)證書無效問題,只要安裝個(gè) ca-certificates 或使用 --no-check-certificate 下載就可以避免下面的錯(cuò)誤'
- 進(jìn)入下載目錄
$ cd 下載的目錄下/
- 解壓包
$ tar -zxf Python-3.6.3.tgz
- 進(jìn)入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)進(jìn)入 Python3 目錄
$ cd Python-3.6.3
(3)指定到安裝目錄
$ ./configure --prefix=/usr/local/python3.6.3
$ ./configure --enable-optimizations
(4)這里編譯使用的是 make all 沒有直接使用 make,all 參數(shù)會(huì)編譯所有子模塊。
$ 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)查看版本:
因?yàn)樯厦嬉呀?jīng)添加了默認(rèn)使用 Python3.6.3,所以直接輸入 $ python -V 會(huì)出現(xiàn)
(-bash: /usr/bin/python3.6.3: No such file or directory)
報(bào)錯(cuò)。
查看 Python 版本輸入以下:
$ sudo vim ~/.bashrc
export PATH=$PATH:/usr/local/python3.6.3/bin
安裝 Nginx
(1)安裝
$ sudo apt-get install nginx
# 查看版本
$ nginx -v
(2)啟動(dòng) Nginx
$ sudo /etc/init.d/nginx start
瀏覽器訪問:你的服務(wù)器ip地址 如:http://45.45.162.162
出現(xiàn)上圖:表示成功
(3)停止 Nginx
$ sudo nginx -s stop
安裝 uWSGI
(1)因?yàn)橐呀?jīng)安裝 Python3 所以要使用 pip3 進(jìn)行安裝
$ pip3 install uwsgi
(2)查看版本
$ uwsgi --version
(3)安裝方法二
下載:
$ wget http://projects.unbit.it/downloads/uwsgi-latest.tar.gz
(4)解壓:
$ tar zxvf uwsgi-latest.tar.gz
測(cè)試
如果:有現(xiàn)成的項(xiàng)目可以把項(xiàng)目上傳到服務(wù)器中,在 git 管理項(xiàng)目,只需要 git clone 一下就可以了。
如果:你需要從本地上傳項(xiàng)目文件,可以用 scp 命令,這里就不啰嗦用法了。總之我們將項(xiàng)目文件放到服務(wù)器,然后就可以用 virtualenv 管理 Python 環(huán)境
virtualenv 就不多說了。這里直接用 flask demo 進(jìn)行。
一、安裝虛擬環(huán)境
$ pip3 install virtualenv
二、創(chuàng)建一個(gè)包
$ 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)建啟動(dòng)文件
$ vim run.py
(5)寫入一個(gè) flask,端口自己進(jìn)行設(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 保存并且退出
四、運(yùn)行這個(gè) 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)啟動(dòng) flask 程序
$ cd myproject
$ python3 run.py
五、用其他電腦和手機(jī) 4G 訪問你的服務(wù)器 ip 地址+上端口。
如:http://45.32.122.555:80/
出現(xiàn):Hello World! 那就成功了。
配置 Nginx
(1)進(jìn)入
$ cd /etc/nginx/sites-enabled/
(2)編輯 default
$ vim default
------------------------------------
# 或者直接配置 $ cd /etc/nginx
$ vim nginx.conf
# 不過要根據(jù)其語法來配置其實(shí)最后nginx.conf還是會(huì)調(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)聽端口一致 (下面會(huì)配置uwsgi)
uwsgi_param UWSGI_PYTHON /root/myproject/venv; # Python解釋器所在的路徑(這里為虛擬環(huán)境)【路徑按照自己具體的路徑填寫】
uwsgi_param UWSGI_CHDIR /root/myproject; # 項(xiàng)目根目錄
uwsgi_param UWSGI_SCRIPT run:app; # 項(xiàng)目的主程序,即Flask app所在的位置【run是運(yùn)行文件run.py文件(根據(jù)自己創(chuàng)建的文件名)app是falsk實(shí)例】
(5)測(cè)試一下配置文件是否正確,若檢測(cè)配置文件失敗,再好好檢查下配置文件有沒有疏漏。
$ nginx -t
表示測(cè)試成功
(6)此時(shí)訪問 Nginx 服務(wù)器應(yīng)該會(huì)得到 502 Bad Gateway 的提示,因?yàn)檎?qǐng)求被 Nginx 轉(zhuǎn)發(fā)了,但是并沒有轉(zhuǎn)發(fā)服務(wù)器來處理請(qǐng)求(還沒有配置好 uwsgi)。
$ service nginx start
配置 uwsgi
一、在項(xiàng)目文件根目錄新建配置文件 uwsgi.ini(uwsgi 支持多種配置文件格式: xml, ini, json 等)
(1)進(jìn)入項(xiàng)目根目錄
$ 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配置里的端口一樣】
# 這行一定要加上,不然請(qǐng)求時(shí)會(huì)出現(xiàn)-- unavailable modifier requested: 0 --錯(cuò)誤提示
# 項(xiàng)目根目錄【路徑按照自己具體的路徑填寫】
# flask程序的啟動(dòng)文件【這里我命名為run.py】
# 程序變量名 【app是falsk實(shí)例變量】
二、啟動(dòng)測(cè)試
(1)啟動(dòng) Nginx
$ service nginx restart
(2)啟動(dòng) uwsgi
注意要回到項(xiàng)目根目錄下執(zhí)行
$ cd ~
$ cd myproject
$ uwsgi uwsgi.ini
若一切正常的話就可以在終端上看到 uwsgi 的啟動(dòng)信息了
(3)打開瀏覽器
訪問你的 ip 加上端口
例:http://45.32.162.255:80
頁面出現(xiàn):Hello World!
說明 Nginx 和 uwsgi 配置成功了
但離真正項(xiàng)目上線還差一段,因?yàn)?uwsgi 是直接在前臺(tái)啟動(dòng)的,當(dāng)我們的連接終端跟服務(wù)器斷開的時(shí)候 uwsgi 進(jìn)程也被關(guān)閉了,所以我們需要 uwsgi 在后臺(tái)運(yùn)行。
解釋一下上面這段話:我們?cè)谶B接服務(wù)器啟動(dòng)項(xiàng)目后可以用瀏覽器訪問成功。但是我們一但關(guān)閉與服務(wù)器的連接后再用瀏覽器訪問就不行了.項(xiàng)目是運(yùn)行在前臺(tái)的也就是說.在關(guān)閉與服務(wù)器連接的同時(shí)也關(guān)閉了服務(wù)器的命令窗.運(yùn)行在前臺(tái)的項(xiàng)目也同時(shí)關(guān)閉。所以我們需要把項(xiàng)目運(yùn)行在后臺(tái)。
三、后臺(tái)啟動(dòng)項(xiàng)目
(1)用 nohup 啟動(dòng):不掛斷運(yùn)行命令,用"&"可以讓你的命令在后臺(tái)執(zhí)行
(nohup 詳細(xì)的命名參數(shù)請(qǐng)到官網(wǎng)查詢)注意:別漏了 & 號(hào)。
$ nohup uwsgi uwsgi.ini &
(2)關(guān)閉與服務(wù)器的連接,然后用瀏覽器訪問你的 ip 地址:
顯示:Hello World! 表示 ok 了!
(3)可以通過命令把這個(gè)項(xiàng)目從后臺(tái)停止,查詢 uwsgi 的進(jìn)程( linux 命令不詳細(xì)說了)
$ ps -ef|grep uwsgi
找到 uwsgi 進(jìn)程 uwsgi.ini:
root 7950 1 0 14:57 ? 00:00:00 uwsgi uwsgi.ini
進(jìn)程 id 每個(gè)人都不一樣 這里的 id 是 7950。
(4)殺掉后臺(tái)的 uwsgi 進(jìn)程 kill -9 后面加上進(jìn)程的 id 或者 killall uwsgi 殺掉全部同名為 uwsgi 的進(jìn)程。
$ kill -9 7950
$ killall uwsgi
(5)再用瀏覽器去訪問 ip
瀏覽器頁面顯示: 502 Bad Gateway 表示停止掉 uwsgi 程序的運(yùn)行
(6)項(xiàng)目根目錄下會(huì)生成 nohup.out 記錄日志
使用 Supervisor 進(jìn)程監(jiān)控
** Supervisor 是 Python2 寫就的一款強(qiáng)大的運(yùn)維工具。**
目前 Supervisor 還不支持 Python3。可以通過以下方法解決。
可通過 pip 安裝.這里用的是 Python3 的 pip.所以會(huì)安裝失敗.使用以下.
(1)首先安裝 supervisor (默認(rèn)由自帶的 python2.7 驅(qū)動(dòng))
$ apt-get install supervisor
(2)進(jìn)入默認(rèn)配置文件(修改配置文件)
$ cd /etc/supervisor/
$ vim supervisord.conf
按 shift+G 跳到末尾
添加:files = /etc/supervisor/*.conf
esc:wq 保存
這樣方便為每個(gè) app 單獨(dú)設(shè)置 conf 文件而不必全部寫在全局設(shè)置里面
在啟動(dòng) supervisorctl 須先啟動(dòng) supervisord。
否則會(huì)出現(xiàn)
error:
<class 'socket.error'>, [Errno 99] Cannot assign requested address: file: /usr/lib/python2.7/socket.py line: 575錯(cuò)誤
執(zhí)行:(若不是在 root 下執(zhí)行在最前面加上 sudo)
$ supervisord -c /etc/supervisor/supervisord.conf
$ supervisorctl -c /etc/supervisor/supervisord.conf
# 這里補(bǔ)充以一下:每當(dāng)修改完配置后如果出現(xiàn)
error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib/python2.7/socket.
# 請(qǐng)重新執(zhí)行以上的兩句命令
進(jìn)入:supervisor shell 模式表示成功
退出:supervisor shell
supervisor> exit
(3)創(chuàng)建腳本文件,生成默認(rèn)配置文件.
$ cd /etc/supervisor/conf.d/
新建app.conf文件(文件名自己定義)
$ vim app.conf
(4)進(jìn)入編輯模式添加配置
[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]:# 項(xiàng)目的包名字(我的是myproject)
directory = /root/myproject/:# 程序的啟動(dòng)目錄路徑
command= uwsgi --ini /root/myproject/uwsgi.ini:#啟動(dòng)命令
(相當(dāng)于直接啟動(dòng) uwsgi uwsgi.ini一樣只是加上了路徑)
autostart = true:# 在 supervisord 啟動(dòng)的時(shí)候也自動(dòng)啟動(dòng)
startsecs = 5: # 啟動(dòng) 5 秒后沒有異常退出,就當(dāng)作已經(jīng)正常啟動(dòng)了
autorestart = true:# 程序異常退出后自動(dòng)重啟
startretries = 3:# 啟動(dòng)失敗自動(dòng)重試次數(shù),默認(rèn)是 3
user = root: # 使用哪個(gè)用戶啟動(dòng)(我這里用的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)指定目錄不存在時(shí)無法正常啟動(dòng),所以需要手動(dòng)創(chuàng)建目錄( supervisord 會(huì)自動(dòng)創(chuàng)建日志文件)別忘了配置之后創(chuàng)建下面繼續(xù)。
stdout_logfile = /tmp/app.log
說下這兩個(gè)有用的配置項(xiàng) stopasgroup 和 killasgroup,如果我們用 Flask 等 Rest 服務(wù),通常其會(huì)開啟幾個(gè)進(jìn)程,那么如果 stopasgroup 不啟用的話, supervisor 無法重啟此服務(wù)(關(guān)閉主進(jìn)程時(shí)其子進(jìn)程沒有關(guān)閉,再開啟主進(jìn)程時(shí)會(huì)提示端口被占用等錯(cuò)誤信息)。
stopasgroup=false:
默認(rèn)為 false,如果設(shè)置為 true,當(dāng)進(jìn)程收到 stop 信號(hào)時(shí),會(huì)自動(dòng)將該信號(hào)發(fā)給該進(jìn)程的子進(jìn)程。如果這個(gè)配置項(xiàng)為 true,那么也隱含 killasgroup 為 true。例如在 Debug 模式使用 Flask 時(shí),F(xiàn)lask 不會(huì)將接收到的 stop 信號(hào)也傳遞給它的子進(jìn)程,因此就需要設(shè)置這個(gè)配置項(xiàng)。
killasgroup=false:
默認(rèn)為 false,如果設(shè)置為 true,當(dāng)進(jìn)程收到 kill 信號(hào)時(shí),會(huì)自動(dòng)將該信號(hào)發(fā)給該進(jìn)程的子進(jìn)程。如果這個(gè)程序使用了 python 的 multiprocessing 時(shí),就能自動(dòng)停止它的子線程。
# 創(chuàng)建日志的文件夾
$ cd ~
$ cd /myproject/
$ mkdir tmp
配置完成。
還有更多的配置參數(shù)請(qǐng)查閱官網(wǎng)
這里我們可以看出,雖然 supervisor 是 Python2 寫的,但只要我們指定運(yùn)行的 Python3 解釋器去運(yùn)行程序就行了。
(5)使配置生效(每當(dāng)修改主配置文件或增改子配置文件都需要執(zhí)行使它生效)
需要先進(jìn)入 $ cd /etc/supervisor 目錄或者項(xiàng)目的目錄 cd myproject/ 才可以運(yùn)行相關(guān)的命令如:supervisorctl reload 等相關(guān)命令
$ supervisorctl update # 因?yàn)槭莗ython3執(zhí)行該命令可能會(huì)報(bào)錯(cuò)
# 可以使用以下命令:重新加載配置文件
$ supervisorctl reload
(6)運(yùn)行 supervisorctl,即可進(jìn)入 shell 里面方便的操作,如 start app、restart app等。
$ cd /etc/supervisor
$ supervisorctl
$ start myproject # 你的項(xiàng)目名稱
# 執(zhí)行start后可以看到 myproject RUNNING pid 16758, uptime 0:02:58
$ restart myproject # 重新啟動(dòng)
$ stop myproject # 停止
# 更多相關(guān)命令可以到官網(wǎng)上查閱這里不消息介紹
(7)以上我們只能在控制臺(tái)查看運(yùn)行.我們需要 web 界面上查看
# 添加修改配置文件
$ cd /etc/supervisor/
$ vim supervisord.conf
# 如果在 vim 模式下找到則對(duì)應(yīng)修改
# 如果沒有 按 shift+G 跳至末尾添加
# IP和綁定端口
# 管理員名稱
# 管理員密碼
[inet_http_server]
port = 45.32.111.111:9001
username = user
password = 666666
# 如果不需要密碼可以注釋在最前面機(jī)上;號(hào)
# ;username = user
# ;password = 666666
# 重新加載配置文件使它生效
$ cd /etc/supervisor
$ supervisorctl reload
# 最后你需要打開你的這個(gè)端口并且重啟 supervisorctl
$ iptables -A INPUT -p tcp --dport 9001 -j ACCEPT
$ cd /etc/supervisor
$ supervisorctl
(8)用瀏覽器啟動(dòng)
# 輸入你的 ip 和端口
45.32.111.111:9001
看到上圖界面表示已經(jīng)成功,之后可以通過打開 Supervisor 端口去監(jiān)控管理你的項(xiàng)目一鍵啟動(dòng)/停止你的項(xiàng)目。
有什么遺漏不足的請(qǐng)多多指導(dǎo)!!!
作者:[沙河頂戰(zhàn)神]
原文鏈接:http://www.cnblogs.com/yangyuexiong/p/7825306.html
技術(shù)交流群:238757010