天天看點

Centos部署Flask項目

1.安裝git:

sudo yum install git
           

2.安裝mysql用戶端(如果資料庫在本機需要安裝mysql服務端)

wget https://dev.mysql.com/get/mysql-community-client-5.7.25-1.el7.x86_64.rpm

rpm -Uvh mysql-community-client-5.7.25-1.el7.x86_64.rpm
           

如果此處報錯則在後面加上--force --nodeps(由于yum安裝了舊版本的GPG keys造成的)

3.安裝python3

sudo mkdir /usr/local/python3 # 建立安裝目錄

wget --no-check-certificate https://www.python.org/ftp/python/3.6.4/Python-3.6.4.tgz #下載下傳Python源檔案
# 注意:wget擷取https的時候要加上:--no-check-certifica

tar -xzvf Python-3.6.4.tgz # 解壓縮包

cd Python-3.6.4 # 進入解壓目錄

sudo ./configure --prefix=/usr/local/python3 # 指定建立的目錄

sudo make

sudo make install # 編譯安裝
           

配置兩個版本共存:

配置python3軟連接配接

sudo ln -s /usr/local/python3/bin/python3 /usr/bin/python3
           

錯誤解決:

(1)執行./configure時可能會報錯,configure: error: no acceptable C compiler found in $PATH,這是因為未安裝合适的編譯器,安裝下就好了,

sudo yum install gcc-c++

(使用sudo yum install gcc-c++時會自動安裝/更新gcc及其他依賴的包。)

(2)執行sudo make install可能會報錯"zipimport.ZipImportError: can't decompress data; zlib not available"錯誤提示,這是缺少zlib包導緻的,安裝下就好

yum install zlib zlib-devel –y

然後再去編譯 make install python3.6就不會有錯誤提示

(3)在4中安裝requriments.txt報錯

ssl certificate:Can't connect to HTTPS URL because the SSL module is not available。原因是沒有安裝openssl

yum install openssl-devel zilb-devel python3-devel
           

然後安裝python

4.安裝pip

python2的pip安裝:

sudo yum -y install epel-release # 首先安裝 epel 擴充源

sudo yum -y install python-pip # 安裝 python-pip

sudo yum clean all # 清除 cache
           

python3的pip安裝:

wget --no-check-certificate https://github.com/pypa/pip/archive/9.0.1.tar.gz # 下載下傳源代碼

tar -zvxf 9.0.1.tar.gz    # 解壓檔案

cd pip-9.0.1

python3 setup.py install # 使用 Python 3 安裝
           

建立pip3連結:

sudo ln -s /usr/local/python3/bin/pip /usr/bin/pip3
           

更新pip:

pip install --upgrade pip
           

5.安裝gunicorn

Gunicorn (獨角獸)是一個高效的Python WSGI Server,通常用它來運作 wsgi application(由我們自己編寫遵循WSGI application的編寫規範) 或者 wsgi framework(如Django,Paster),地位相當于Java中的Tomcat。WSGI就是這樣的一個協定:它是一個Python程式和使用者請求之間的接口。WSGI伺服器的作用就是接受并分析使用者的請求,調用相應的python對象完成對請求的處理,然後傳回相應的結果。簡單來說gunicorn封裝了HTTP的底層實作,我們通過gunicorn啟動服務,使用者請求與服務相應都經過gunicorn傳輸

建立虛拟環境:

cd /home/www

mkdir venv

python3 -m venv venv
           

激活虛拟環境:

source venv/bin/activate
           

根據requirements.txt檔案安裝依賴包:

pip3 install -r requirements.txt
           

安裝報錯:“ssl certificate:Can't connect to HTTPS URL because the SSL module is not available”。

問題修複:

先退出python虛拟環境找到Python3.6.4安裝目錄先安裝openssl

yum install openssl-devel zilb-devel python3-devel

再重新編譯Python3:make和make install

編譯完成後再重新安裝python requirems.txt檔案安裝依賴包:

pip3 install -r requirements.txt

檢視pip已經安裝python包:pip3 list --format=columns

安裝gunicorn

pip3 install gunicorn
           

6.安裝nginx

nginx 是一個高性能的web伺服器。通常用來在前端做反向代理伺服器。所謂正向與反向(reverse),隻是英文說法翻譯。代理服務,簡而言之,一個請求經過代理伺服器從區域網路發出,然後到達網際網路上伺服器,這個過程的代理為正向代理。如果一個請求,從網際網路過來,先進入代理伺服器,再由代理伺服器轉發給區域網路的目标伺服器,這個時候,代理伺服器為反向代理(相對正向而言)。

正向代理:{ 用戶端 ---》 代理伺服器 } ---》 伺服器

反向代理:用戶端 ---》 { 代理伺服器 ---》 伺服器 }{} 表示區域網路

安裝nginx

yum -y install nginx

啟動nginx服務

systemctl start nginx.service

終止nginx服務

systemctl stop nginx.service

重新開機nginx服務

systemctl restart nginx.service

平滑重新開機,在nginx配置改動了,可以重新加載而不用先關閉再打開

nginx -s reload

nginx的配置

nginx的配置檔案為:/etc/nginx/nginx.conf

server {

        listen 80;

        server_name adisonhyh.com;

        location / {

                proxy_pass http://127.0.0.1:8000;

                proxy_set_header Host $host;

               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }

}
           

用vim指令檢視nginx的配置檔案

vim /etc/nginx/nginx.conf

出現“-bash: vim: command not found”錯誤是vim沒有安裝或者安裝不全,可以用rpm -qa|grep vim檢視已經安裝的vim工具:

vim-enhanced-7.0.109-7.el5

vim-minimal-7.0.109-7.el5

vim-common-7.0.109-7.el5

如果缺少其中任何一條,比如 vim-enhanced 的,就用指令 yum -y install vim-enhanced 來安裝

 檢視nginx配置:

server {

        listen       80;

        #server_name  _;

        server_name     serverIP;

        charset         utf-8;

        #root         /usr/share/nginx/html;

        # Load configuration files for the default server block.

        include /etc/nginx/default.d/*.conf;


        location / {

                #include     uwsgi_params;

                proxy_pass http://127.0.0.1:8000;

                #uwsgi_pass  127.0.0.1:8000;

                #uwsgi_param UWSGI_PYTHON /usr/local/python3;

                #uwsgi_param UWSG_CHDIR /home/zhy/SocketServer;

                #uwsgi_param UWSG_SCRIPT run:app;

                proxy_set_header Host $host;

                proxy_set_header X-Real-IP $remote_addr;

                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }



        error_page 404 /404.html;

            location = /40x.html {

        }


        error_page 500 502 503 504 /50x.html;

            location = /50x.html {

        }

    }
           

7.安裝supervisor

如果你需要程序一直執行,若該程序因各種原因中斷,也會自動重新開機的話,supervisor是一個很好的選擇。supervisor管理程序,是通過fork/exec的方式将這些被管理的程序當作supervisor的子程序來啟動,是以我們隻需要将要管理程序的可執行檔案的路徑添加到supervisor的配置檔案中就好了。此時被管理程序被視為supervisor的子程序,若該子程序異常終端,則父程序可以準确的擷取子程序異常終端的資訊,通過在配置檔案中設定autostart=true,可以實作對異常中斷的子程序的自動重新開機。

安裝supervisor:

pip3 install supervisor

添加項目supervisor.conf配置檔案

[program:blog]

command=/home/www/blog/venv/bin/gunicorn -w4 -b0.0.0.0:8000 wsgi:application    ;supervisor啟動指令

directory=/home/www/blog                              ; 項目的檔案夾路徑

startsecs=0                                           ; 啟動時間

stopwaitsecs=0                                        ; 終止等待時間

autostart=false                                                           ; 是否自動啟動

autorestart=false                                     ; 是否自動重新開機

stdout_logfile=/home/www/blog/logs/gunicorn.log       ; log 日志

stderr_logfile=/home/www/blog/logs/gunicorn.err       ; 錯誤日志
           

使用 supervsior 啟動 gunicorn,

supervisord -c supervisor.conf

sudo supervisorctl start program_name
           

檢視supervisor程序:

 pstree -ap|grep supervisor

報錯"pstree:command not found",安裝psmic即可:

yum install psmisc -y

8.參考資料

(1)CentOS 部署 flask項目

   https://www.jianshu.com/p/da28ec28ef4b 

(2)解決unix:///tmp/supervisor.sock no such file的問題

  https://blog.csdn.net/qq_28885149/article/details/79364685

繼續閱讀