本攻略基於ubuntu1804的版本,服務器用的華爲雲的服務器,python3(python2已經在2020完全中止維護了,因此轉到python3是必須的)歡迎加個人QQ6398903,或QQ羣討論相關技術php
1、準備項目所須要的模塊
你須要把開發環境下用到的包信息所有導出
`` pip freeze > requirements.txt
而後,把requirements.txt文件上傳服務器
css
2、準備生產環境的python虛擬環境
畢竟生產環境,也可能運行多個python項目,因此須要準備好python的虛擬環境
ubuntu1804默認只有python3哈,安裝虛擬環境須要先安裝venv
``sudo apt install python3-venv
建立一個目錄用於存放虛擬環境
html
mkdir -p /opt/python/ sudo python3 -m venv myprj #最後是項目的名字 . /opt/python/myprj/bin/activate #激活虛擬環境, 別忘記了前面的點【.】激活以後命令行前面又虛擬環境的名字,說明成功 pip install --upgrade pip #先升級一下Pip pip intall -r requirements.txt # 一次安裝所有的python模塊
3、安裝gunicorn
gunicorn是基於wsgi(web 服務網關接口)web服務器,與flask是絕配(通常django用uwsgi)java
pip install gevent #若是你的項目中沒有用到gevent,那麼安裝gunicorn以前,須要安裝一下 pip install gunicorn deactivate #退出虛擬環境
能夠直接使用gunicorn命令來啓動程序,例如
``gunicorn -w 4 -b 127.0.0.1:5000 main:app
【注意】上面的命令,須要在激活虛擬環境的狀況下,到項目目錄中運行,項目啓動文件是main.py 裏面又變量名是app的flask的實例
特別要注意,main.py裏面要有
python
if __name__ == "__main__": app.run()
不然,gunicorn啓動項目時,會報錯
下面是經常使用命令說明:
nginx
-c CONFIG, --config=CONFIG # 設定配置文件。 -b BIND, --bind=BIND # 設定服務須要綁定的端口。建議使用HOST:PORT -w WORKERS, --workers=WORKERS # 設置工做進程數。建議服務器每個核心能夠設置2-4個。 -k MODULE # 選定異步工做方式使用的模塊。
4、配置gunicorn的配置信息
gunicorn直接使用.py文件做爲配置文件,因此,裏面是支持py語法的web
from gevent import monkey monkey.patch_all() import multiprocessing #debug = True loglevel = 'debug' bind = '127.0.0.1:6000' #綁定與Nginx通訊的端口 pidfile = 'log/gunicorn.pid' accesslog = 'log/access.log' errorlog = 'log/debug.log' #daemon = True workers = multiprocessing.cpu_count() * 2 + 1 worker_class = 'gevent' #默認爲阻塞模式,最好選擇gevent模式
保存到,項目目錄下的conf/guni.confdjango
上面的配置文件中,又兩個註釋的地方,一個注意事項flask
- debug=True 很好理解,就是剛上線時,能夠開啓,方便發現錯誤,正式啓用要註銷
- daemon=True 意思是以守護進程的形式運行,適合直接輸入gunicorn命令來運行,【注意】但若是您想用supervisor來管理的話,這個要註銷
- 須要在項目文件中,創建一個log的文件夾,不然報錯沒法啓動,由於咱們的日誌文件和pid都須要保存在Log目錄中
5、經過配置文件啓動gunicorn以及守護進程啓動
把以前的命令,修改一下,
gunicorn -w 4 -b 127.0.0.1:5000 -c conf/guni.conf main:app 若是conf文件中,又deamon=True,那麼將以守護進程在後臺中運行 或者使用
nohup gunicorn -w 4 -b 127.0.0.1:5000 -c conf/guni.conf main:app
這個時候,就能夠退出python虛擬環境了
``deactivate #退出虛擬環境
ubuntu
6、配置nginx
nginx的安裝、配置、使用,請看我以前教程2020年ubuntu1804安裝nginx最新穩定版1.16詳細教程筆記
接着以前文件接續補充
在/etc/nginx/conf.d/目錄下,新建一個myprj.conf文件,填入下信息
server { listen 80; root /data/python/myprj; server_name xxx.xx.xxx.xxx; location / { proxy_set_header x-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_pass http://localhost:6000/; # gunicorn綁定的端口號 } # 配置static的靜態文件: location ~ ^\/static\/.*$ { root /data/python/myprj; } }
在配置nginx最容易出現的問題是,靜態文件的配置,一旦沒有配好,致使圖片,css文件沒法訪問
Nginx路徑location配置中,使用root目錄與alias目錄的區別
- alias指定的目錄是準確的,即location匹配訪問的path目錄下的文件直接是在alias目錄下查找的;
location /static/ { alias /var/www/static/; } #注意:alias指定的目錄後面必需要加上"/",即/var/www/static/不能改爲/var/www/static
- root指定的目錄是location匹配訪問的path目錄的上一級目錄,這個path目錄必定要是真實存在root指定目錄下的;
location /static/ { root /var/www/; } #注意:location中指定的/static/必須是在root指定的/var/www/目錄中真實存在的。 #二者配置後的訪問效果是同樣的。
- 配置習慣
通常狀況下,在nginx配置中的良好習慣是:- 在location / 中配置root目錄
- 在location /somepath/ 中配置alias虛擬目錄
- nginx加載新的配置
nginx -t #必定要先檢查,看到成功的信息, nginx -s reload
7、安裝和配置supervisor
supervisor是一個python開發的進程管理工具,不光能夠管理python項目,java項目,php-pfm後臺啓動程序均可以管理哦
- 安裝
`` sudo apt install supervisor - 配置文件
到/ect/supervisor/conf.d/目錄下,新建myprj.conf文件
``vim myprj.conf
填入以下內容
[program:aijiaoyu] command=/opt/python/myprj./bin/gunicorn -c /data/python/myprj./env/gunc.py main:app directory=/data/python/myprj user=root autorestart=true startsecs=10 startretires=3 redirect_stderr=true stdout_logfile_maxbytes=100MB stdout_logfile_backups = 20 stdout_logfile=/var/log/supervisor/myprj.log
配置文件的簡單說明
program:myprj] #登記項目名稱 directory=/data/python/myprj command=/opt/python/myprj./bin/gunicorn -c /data/python/myprj./env/gunc.py main:app 程序啓動命令 autostart=true ; 在supervisord啓動的時候也自動啓動 startsecs=10 ; 啓動10秒後沒有異常退出,就表示進程正常啓動了,默認爲1秒 autorestart=true ; 程序退出後自動重啓,可選值:[unexpected,true,false],默認爲unexpected,表示進程意外殺死後才重啓 startretries=3 ; 啓動失敗自動重試次數,默認是3 user=root ; 用哪一個用戶啓動進程,默認是root priority=999 ; 進程啓動優先級,默認999,值小的優先啓動 redirect_stderr=true ; 把stderr重定向到stdout,默認false stdout_logfile_maxbytes=100MB ; stdout 日誌文件大小,默認50MB stdout_logfile_backups = 20 ; stdout 日誌文件備份數,默認是10 ; stdout 日誌文件,須要注意當指定目錄不存在時沒法正常啓動,因此須要手動建立目錄(supervisord 會自動建立日誌文件) stdout_logfile=/var/log/supervisor/myprj.log stopasgroup=false ;默認爲false,進程被殺死時,是否向這個進程組發送stop信號,包括子進程 killasgroup=false ;默認爲false,向進程組發送kill信號,包括子進程
讓supervisor更新配置
sudo supervisorctl update #更新配置 sudo supervisorctl reload #重啓 sudo supervisorctl status #查看全部項目的狀況 sudo supervisorctl stop/start/restart 項目名稱
【注意】必定不能以守護進程啓動,不然supervisor會檢測不到進程,從而認爲進程啓動失敗
總結
每次看別人的博客,都是以爲不完整,因此本身重寫了這個教程。一個完成的流程
若是對你有用,請點個贊,或者關注,歡迎加羣一塊兒交流技術
參考文檔: