天天看點

Linux部署Python項目

項目部署對恩操作通常是由運維人員來進行統一管理裝配的,但是對于一個開發人員來講,基礎的項目部署還是要會的。

這裡我主要講解python的項目是如何部署的,至于項目哪裡來的,這就要看觀衆如何抉擇了,可以把自己寫好的項目部署,也可以......(此處省略。。。你懂的O.O)

最重要一點就是此篇随筆隻是給初級的想部署自己小項目的開發人員看的,小打小鬧,大神來此千萬别認真,認真你就輸了,這要是拿去公司部署,老闆當天就能把你開掉,我畢竟不是專業運維人員,隻是個草根開發。

部署有兩種情況,線上部署,線下測試環境部署;線上部署就是指把自己的項目部署到遠端的伺服器上,類似阿裡雲,騰訊雲或亞馬遜這種伺服器;線下部署就是指在自己電腦中安裝一個VMware虛拟機(虛拟化技術:有效利用電腦中的未被占用的資源,高效利用伺服器裝置硬體資源,可以節省實體空間),VMWare讓一個電腦中可以建立多個系統, 友善同時管理;

這裡我講解的是線上阿裡雲伺服器部署,主要是現在我隻有一台阿裡雲伺服器,相對于本地的VMWare中安裝Linux伺服器,再阿裡雲中部署後,别人可以通路,更高大上一些。

我們需提前準備好一些部署所需要的東西

注冊一個阿裡雲賬号。購買一台阿裡雲伺服器,推薦使用CentOS7,因為我所展示的就是CentOS7,至于為什麼不推薦使用Ubuntu的原因是因為:相同的解釋器相同的代碼在這兩個系統中不能直接運作,移植後都需要各種微調。至于伺服器的購買步驟就去百度吧,對于學生來說是有學生機的,學生機相對于來說比較便宜一百元左右(至于學生這個概念阿裡雲上是有學生通道的認證時是看教育網上是否有你個人資訊,但我和客服聊過,他說28歲以下都可以購買學生那種套餐,至于具體情況,可以和客服溝通);還有一種就是新注冊使用者的購買了,我個人認為還是一次性購買三年比較劃算(不管是學生還是新使用者);至于非新使用者應該都是老司機,都懂的,可能我這部署人家都了解,隻是偶爾進來看看。

購買域名,管局備案,公安備案,大概需要20天,不過的放心備案多久阿裡雲送多久,不過據說不管備案10天或者說20天,阿裡雲都是直接贈送30天的時長,隻是聽說我還真沒注意。

購買免費賽門鐵克,有一個0元一年的賽門鐵克,賽門鐵克是關于安全的東西,這個弄不弄都行,主要看你自己,因為看我這部落格的應該都是些小白什麼的來學習部署生産環境的,都是些自己編寫的小項目。

下載下傳Xshell和Xftp,這兩個軟體可以去官方網站上擷取,社群版是免費的,盡量使用6版本,當然你想給人家當小白鼠也可已使用7,這兩個軟體前者是用來遠端控制作業系統的,後者是檔案傳輸用的,可以以圖形界面的方式向遠端的阿裡雲CentOS中上傳檔案。也就是把自己本地的項目上傳到上面。

配置伺服器安全組,開放80、8080、8000、443、6379、3306、這幾個端口;

開放80端口外部才能通過Http通路伺服器,

8080(也是一些WEB伺服器的預設端口)和8000(djang預設啟動端口)這兩個端口主要是項目運作的時候常用到的,

443端口即網頁浏覽端口,主要是用于HTTPS服務,是提供加密和通過安全端口傳輸的另一種HTTP;

6379端口,緩存資料庫redis的端口

如果需要使用多台伺服器進行叢集部署,負載均衡的時候是需要通過這些端口進行溝通通路的

這裡的資料庫使用的是mariadb資料庫。

MariaDB資料庫管理系統是MySQL的一個分支,主要由開源社群在維護,采用GPL授權許可。

開發這個分支的原因之一是:甲骨文公司收購了MySQL後,有将MySQL閉源的潛在風險,是以社群采用分支的方式來避開這個風險。

MariaDB的目的是完全相容MySQL,包括API和指令行,使之能輕松成為MySQL的代替品。

這個資料庫是mysql開發者開發的另一款免費開源資料庫。

首先在 RHEL/CentOS 和 Fedora 作業系統中添加 MariaDB 的 YUM 配置檔案 MariaDB.repo 檔案。

添加repo倉庫配置

在Centos7中安裝MariaDB資料庫

啟動MariaDB的相關指令

這裡使用redis資料庫,基本的redis使用方式請看部落格:https://www.cnblogs.com/wylshkjj/p/12442412.html

redis是一個key-value存儲系統。和Memcached類似,它支援存儲的value類型相對更多,包括string(字元串)、list(連結清單)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些資料類型都支援push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩存在記憶體中。差別的是redis會周期性的把更新的資料寫入磁盤或者把修改操作寫入追加的記錄檔案,并且在此基礎上實作了master-slave(主從)同步。

安裝redis

啟動redis,自己使用部署項目預設可以不配置,如若公司配置那就要設定配置檔案

web伺服器(nginx):接收HTTP請求(例如www.pythonav.cn/xiaocang.jpg)并傳回資料

web架構(django,flask):開發web應用程式,處理接收到的資料

nginx是一個開源的,支援高性能,高并發的www服務和代理服務軟體。它是一個俄羅斯人lgor sysoev開發的,作者将源代碼開源出來供全球使用。

nginx比它大哥apache性能改進許多,nginx占用的系統資源更少,支援更高的并發連接配接,有更高的通路效率。nginx不但是一個優秀的web服務軟體,還可以作為反向代理,負載均衡,以及緩存服務使用。安裝更為簡單,友善,靈活。nginx可以說是非常nb了

優點:

支援高并發,能支援幾萬并發連接配接

資源消耗少,在3萬并發連接配接下開啟10個nginx線程消耗的記憶體不到200M

可以做http反向代理和負載均衡

支援異步網絡i/o事件模型epoll

下載下傳源碼包

wget -c https://nginx.org/download/nginx-1.12.0.tar.gz

解壓縮源碼:tar -zxvf nginx-1.12.0.tar.gz

cd切換進入解壓後檔案夾nginx-1.12.0

配置、編譯、安裝 開啟nginx狀态監測功能

./configure --prefix=/opt/nginx1-12/ --with-http_ssl_module --with-http_stub_status_module

make && make install

啟動nginx,進入sbin目錄,找到nginx啟動指令

切換·目錄:cd sbin

./nginx #啟動

./nginx -s stop #關閉

./nginx -s reload #重新加載

nginx預設站點是Nginx目錄下的html檔案夾,這裡可以從nginx.conf中查到、

如果要部署網站業務資料,隻需要把開發好的程式全放到html目錄下即可

是以隻需要通過域名/資源,即可通路

普通站點示例:

在CentOS中預設有一個python2.7,但是對于我們現在,python2.7已經不足以滿足市場需求了,一般情況除了好多大公司,尤其是金融公司的系統是比較老的,可能會出現python2.7外,幾乎遇不到。我們現在開發都用python3版本,我這裡使用的是python3.6.11版本和django1.11.9,這裡有個坑,就是python3.6和django1版本是不會出現問題,但是當django2版本和python3.6版本一起使用時就會報一個錯誤:<code>query = query.decode(errors='replace')</code>

<code>AttributeError: 'str' object has no attribute 'decode'</code>,

注:當出現這種報錯時:打開檔案:vim /root/Envs/drawer/lib/python3.7/site-packages/django/db/backends/mysql/operations.py的146行修改

把:query = query.decode(errors='replace')

改成:query = query # .decode(errors='replace')

或者改成:query = query.encode(errors='replace') # 推薦

還有就是urls.py檔案的路徑寫法也有所變化:url -----&gt; path ; url(正則) ----&gt;re_path

下載下傳之前要先下載下傳依賴包:<code>yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel -y</code>

下載下傳python解釋器:<code>wget https://www.python.org/ftp/python/3.6.11/Python-3.6.11.tar.xz</code>

解壓壓縮封包件:<code>tar xvJf Python-3.6.11.tar.xz</code>

cd切換到Python-3.6.11目錄下

配置、編譯、安裝:

<code>./configure --prefix=/opt/python</code>

<code>make &amp;&amp; make install</code>

加入python的啟動環境變量,永久生效自動補全

配置環境變量

更改linux環境變量,輸入指令檢視環境變量:<code>echo $PATH</code>

将python環境變量放在第一位:<code>PATH=/opt/python/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin</code>

永久生效path設定,添加到/etc/profile全局環境變量配置檔案中

執行指令讀取配置檔案:<code>source /etc/profile</code>

執行指令檢視python路徑:<code>which python3</code>

在使用python開發的過程中,項目一多,管理起來就很麻煩,像不同的項目以來不同的版本庫的問題,或者是不想目前的開發環境下充斥着各種各樣又不需要的庫,由此引發一些依賴報錯問題。

這種情況下,就需要通過不同的工程使用不同的虛拟環境來保持開發環境以及宿主環境的清潔。

這時,我們就要使用virtualenv,它可以幫助我們管理不同的python環境,除了virtualenv還有一款工具叫anaconda這個工具裡面内置了很多包,但是對于linux中生産環境的部署通常都使用virtualenv。

兩者是有差別的:

anaconda:anaconda裡面自帶python解釋器,也可以通過anaconda的指令安裝python解釋器,由此來建立不同的虛拟環境

virtualenv:virtualenv是依賴于python解釋器的,也就是說他需要通過pip3 install指令來進行下載下傳

兩者的建立虛拟環境的指令使用方法和操作方法很像,具體指令操作可以看作者的另一篇部落格:https://www.cnblogs.com/wylshkjj/p/13122349.html

安裝指令
安裝virtualenv:pip3 install virtualenv

注:雖然virtualenv很友善,但是他有一個大缺點

就是每次開啟虛拟環境之前要去虛拟環境所在目錄下的bin目錄下source一下activate,是以這就需要我們記住每個虛拟環境所在的目錄。但是人的記憶是會出錯的,甚至由于時間過長直接就忘記了虛拟環境放在哪裡了。是以我們需要使用virtualenvwrapper工具進行虛拟環境的管理,其實他就是統一管理虛拟環境的目錄,并且省去了source的步驟。

安裝virtualenvwrapper指令:pip3 install virtualenvwrapper

至于操作指令上面的部落格連結裡面寫了基本的使用指令

配置virtualenvwrapper

方式一:比較麻煩,一個一個手動下載下傳

方式二:導包通過pip freeze 檔案名,把所需下載下傳的包打包成檔案,傳到伺服器中直接執行下載下傳:<code>pip3 freeze &gt; requirements.txt</code>

不配置uwsgi配置檔案的基本使用

下載下傳uwsgi

執行:pip3 install uwsgi

檢視 uwsgi 版本:uwsgi --version

啟動一個python的django項目,在項目根目錄下執行指令

uwsgi --http :8000 --wsgi-file test.py

配置uwsgi配置檔案

在項目根目錄下建立uwsgi配置檔案uwsgi.ini

啟動uwsgi伺服器,必須在uwsgi.ini配置檔案所在的目錄中運作下面的指令

注意,在本地環境中必須先把runserver關閉

執行項目指令:

關閉uwsgi(結束項目運作狀态)

執行結束指令:

關閉uwsgi:

結束項目:最笨但是最有效的方式直接執行 <code>kill -9 程序ID号</code>

或者強制删除殺死程序:<code>sudo pkill uwsgi -9</code>

**uWsgi熱加載python程式 **

在啟動指令後面加上參數

uWsgi配置檔案基本參數

master = true

啟動主程序,來管理其他程序,其它的uwsgi程序都是這個master程序的子程序,如果kill這個master程序,相當于重新開機所有的uwsgi程序。

chdir = /web/www/mysite

在app加載前切換到目前目錄, 指定運作目錄

module = mysite.wsgi

加載一個WSGI子產品,這裡加載mysite/wsgi.py這個子產品

py-autoreload=1

監控python子產品mtime來觸發重載 (隻在開發時使用)

lazy-apps=true

在每個worker而不是master中加載應用

socket = /test/myapp.sock

指定socket檔案,也可以指定為127.0.0.1:9000,這樣就會監聽到網絡套接字

processes = 2

啟動2個工作程序,生成指定數目的worker/程序

buffer-size = 32768

設定用于uwsgi包解析的内部緩存區大小為64k。預設是4k。

daemonize = /var/log/myapp_uwsgi.log

使程序在背景運作,并将日志打到指定的日志檔案或者udp伺服器

log-maxsize = 5000000

設定最大日志檔案大小

disable-logging = true

禁用請求日志記錄

vacuum = true

當伺服器退出的時候自動删除unix socket檔案和pid檔案。

listen = 120

設定socket的監聽隊列大小(預設:100)

pidfile = /var/run/uwsgi.pid

指定pid檔案,直接寫檔案名就是在目前目錄目前配置檔案下同級目錄下建立/指定pid檔案。

enable-threads = true

允許用内嵌的語言啟動線程。這将允許你在app程式中産生一個子線程

reload-mercy = 8

設定在平滑的重新開機(直到接收到的請求處理完才重新開機)一個工作子程序中,等待這個工作結束的最長秒數。這個配置會使在平滑地重新開機工作子程序中,如果工作程序結束時間超過了8秒就會被強行結束(忽略之前已經接收到的請求而直接結束)

max-requests = 5000

為每個工作程序設定請求數的上限。當一個工作程序處理的請求數達到這個值,那麼該工作程序就會被回收重用(重新開機)。你可以使用這個選項來默默地對抗記憶體洩漏

limit-as = 256

通過使用POSIX/UNIX的setrlimit()函數來限制每個uWSGI程序的虛拟記憶體使用數。這個配置會限制uWSGI的程序占用虛拟記憶體不超過256M。如果虛拟記憶體已經達到256M,并繼續申請虛拟記憶體則會使程式報記憶體錯誤,本次的http請求将傳回500錯誤。

harakiri = 60

一個請求花費的時間超過了這個harakiri逾時時間,那麼這個請求都會被丢棄,并且目前處理這個請求的工作程序會被回收再利用(即重新開機)

這種一般情況是drf項目部署時需要做的操作,django項目部署直接使用nginx指向static檔案即可。

在settings中配置

然後在pycharm控制台(你自己的IDE控制台或者是cmd的項目目錄下執行檔案收集指令)

安裝epel release

yum install epel-release

安裝supervisor

yum install -y supervisor

配置項與檢查指令

systemctl enable supervisord # 開機自啟動

systemctl start supervisord # 啟動supervisord服務

systemctl status supervisord # 檢視supervisord服務狀态

ps -ef|grep supervisord # 檢視是否存在supervisord程序

基本使用指令

可以通過supervisorctl -c /etc/supervisord.conf的服務台來進行服務任務管理

stop all # 停止所有

start drawer # 任務名

參數形式:

supervisorctl -c /etc/supervisord.conf stop all

supervisorctl -c /etc/supervisord.conf start wyl_drawer

配置檔案配置項

vim /etc/supervisord.conf 編輯配置程序守護

執行:shift+g 指令;跳轉到檔案最後一行,添加配置指令

stopasgroup=true # 預設為false,程序被殺死時,是否向程序組發送stop信号,包括子程序

killasgroup=true # 預設為false,向程序組發送kill信号,包括子程序

另外有一個坑需要注意:如果修改了 /etc/supervisord.conf ,需要執行 supervisorctl reload 來重新加載配置檔案,否則不會生效。。。