1. 程式人生 > >使用Nginx+Uwsgi在CentOS伺服器上部署Python Flask應用

使用Nginx+Uwsgi在CentOS伺服器上部署Python Flask應用

寫在開頭

        第一次用Flask做Web(也是第一次用Python做Web),在部署的時候遇到了不少問題,現在將過程就下來,供在這方面也有疑惑的人蔘考.(PS:使用Apache+mod_wsgi部署模式的可以參考另一個博主的這篇文章:http://blog.elnmp.com/post/python/apache-mod_wsgi-flask-pipenvxiang-mu-bu-shu)

專案及伺服器環境

        Python版本:3.6.5

        Flask版本:1.0.2

        伺服器版本:CentOS 7.4

        Nginx與Uwsgi版本皆為目前最新

部署開始

Web專案

虛擬環境

        為了防止Python包的版本之間起衝突,我們需要使用虛擬環境將各個專案隔離開來,一般對於這種情況網上的教程都會選擇用原生的virtualenv,但是這裡推薦一個超好用的第三方工具,據說也是Python官方推薦的虛擬環境管理工具,名字叫pipenv,使用方法自行百度,安裝方法如下:

    pip install pipenv

        安裝完成後,進入Flask專案根目錄,使用pipenv建立虛擬環境,值得一提的是,pipenv不一定要用正規的install命令來建立環境,使用進入虛擬環境shell的命令也一樣可以,pipenv會自動在虛擬環境列表中匹配當前專案的虛擬環境,如果找不到則會自動幫你新建立一個,具體如下:

    [[email protected] Fisher] pipenv shell
    Creating a virtualenv for this project…
    Using /usr/local/bin/python3.6 (3.6.5) to create virtualenv…
    Spawning environment shell (/bin/bash). Use 'exit' to leave.
    . /home/shenghun/.local/share/virtualenvs/Fisher-kuuv-2eR/bin/activate
    [[email protected]
Fisher] . /home/shenghun/.local/share/virtualenvs/Fisher-kuuv-2eR/bin/activate     (Fisher-kuuv-2eR) [[email protected]]

        之後,由於虛擬環境間相互獨立.因此需要重新安裝一下包否則Python找不到包會造成程式崩潰,另外,由於pipenv生成的包統一會放在一個地方,和原生的virtualenv直接放在專案根目錄不一樣,所以注意記錄下虛擬環境的地址,之後在配置Uwsgi和Nginx的時候用的上,地址為".home/shenghun/.local/share/virtualenvs/Fisher-kuuv-2eR",問我在哪看?你猜啊(~ ̄▽ ̄)~ 

        Uwsgi

        Uwsgi是一個Web伺服器,具體資訊就不再贅述了,自己找度娘,要使用Uwsgi,首先需要安裝Python中的Uwsgi包,最好在全域性環境和虛擬環境中都裝上(起碼我是這樣的,如果不都裝上會發生什麼我也不知道),但需要注意的一點是,Uwsgi需要一些其他環境的支援,因此在安裝Uwsgi前要把先行條件準備好:

    yum -y install gcc  gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel GeoIP gd libXpm libxslt sqlite-devel

        完成之後,再使用pip install uwsgi(虛擬環境中使用pipenv install)安裝Uwsgi.

        裝完Uwsgi,我們還要在專案根目錄下建立一個Uwsgi配置檔案,實際上Uwsgi可以用命令使其帶引數啟動,但有了配置檔案就不用每次寫一大串命令了,為了方便,我直接把檔案命名為uwsgi.ini, 大致配置如下:

    [uwsgi]
    # Http access port. 
    # If this option comes into effect, we can visit our web site on http://[our IP]:[Port]
    # http=:5001

    # Uwsgi's ip and port when it is loaded by Nginx
     socket=127.0.0.1:5001
    
    # Point to the main directory of the Web Site
     chdir=/home/Servers_Nginx/Fisher/
    
    # Setting up a virtual environment
     virtualenv=/root/.local/share/virtualenvs/Fisher-e_ddg0zZ

    # Python startup file
     wsgi-file=fisher.py

    # The application variable of Python Flask Core Oject 
     callable=app

    # The maximum numbers of Processes
     processes=1

    # The maximum numbers of Threads
     threads=2 

        其他的配置沒什麼好說的,英語稍微有點水平的都能看懂寫的什麼,重點在http和socket上,這兩個配置是不能同時存在的(起碼在我印象中),http是用來使外網能直接訪問Uwsgi的,而socket是用來和Nginx通訊的,Nginx獲取到外網的請求後,就通過這個地址轉發給Uwsgi處理,socket的用法在下面Nginx的配置檔案中會看到.

        配置好了之後,可以用uwsgi uwsgi.ini命令檢視是否成功配置,如果沒問題,則會有以下啟動資訊(只擷取一部分,事實上有老大一串):

    [uWSGI] getting INI configuration from uwsgi.ini
    *** Starting uWSGI 2.0.17 (64bit) on [Tue Jul  3 22:42:15 2018] ***
    compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-16) on 02 July 2018 14:12:13
    os: Linux-3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018
    nodename: shenghun
    machine: x86_64
    clock source: unix
    pcre jit disabled
    detected number of CPU cores: 1
    current working directory: /home/Servers_Nginx/Fisher
    detected binary path: /usr/bin/uwsgi
    uWSGI running as root, you can use --uid/--gid/--chroot options

        Ctrl+C結束執行,開始Nginx的安裝與配置

        Nginx

        Nginx是什麼

        雖然只有Uwsgi也可以直接部署專案,但是為了安全,需要Nginx來進行請求代理,眾所周知類似於學校之類的內部計算機通過資訊中心伺服器訪問外網的行為稱為正向代理,所有的訪問請求都由中央伺服器代理,此時正常情況下外網是不知道你的計算機的地址的;而Nginx的作用就是實現反向代理,正向代理代理的是內部計算機,而反向代理代理的是內部伺服器,正是有Nginx存在,Uwsgi的真正接口才不會暴露在網路上,伺服器的安全才有了一定的保障(當然,惡意攻擊另說),此外,Nginx還自帶防DDoS攻擊機制.可以說日常使用是非常省心了.

        Nginx安裝

        關於Nginx的安裝,有很多種方法,這裡選擇了yum源安裝(其他linux發行版也有類似的安裝方法).

        yum源配置

        首先在/etc/yum.repo.d/資料夾下新增yum源,名字就叫做Nginx.repo吧(為了方便懶得起名)

    [[email protected] yum.repos.d] vim Nginx.repo

        輸入以上命令進入檔案編輯,完成相關配置,對於yum源的配置官方文件是這麼說的:


        其中baseurl中的OS需要改成自己的系統名,OSRELEASE需要改成系統的髮型版本號.完成之後配置檔案如下:

    [Nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/centos/7/$basearch/
    gpgcheck=0
    enabled=1

        配置完成後還沒完,需要使用一下命令重新載入yum源:

    [[email protected] yum.repos.d] yum clear all
    [[email protected] yum.repos.d] yum makecache

        出現以下資訊即為成功:

        yum源安裝

        之後就很簡單了,直接yum install nginx就行,如果不想提示是否繼續可以再加上-y引數像這樣:

[[email protected] /] yum -y install nginx

        回車以後會自動安裝nginx,稍等一會,等螢幕出現successful install nginx就可以了,由於我這裡已經安裝成功了,所以是這樣的:


        另外說一下,我這裡選擇yum除了安裝方便外,還有一個很重要的因素,那就是yum安裝可以自動將Nginx加入系統服務,不用再傻傻地到安裝目錄下適用./nginx或者一大串路徑啟動了,直接用systemctl(CentOS 6使用service)的start,stop,restart就可以完成啟動,停止,過載,甚至可以用systemctl status nginx就可以直接看到nginx啟動狀態,非常方便:


     Nginx配置

        Nginx安裝完成後,接下來就需要配置虛擬主機用以部署專案了,進入nginx配置檔案目錄,如果不知道在哪的可以使用一下方法找到:

    [[email protected] /] whereis nginx


        第一個路徑是啟動快捷鍵,第二個Nginx依賴的一下庫,第四個是nginx專案目錄,第五個看名字就知道應該是文件之類的,所以配置檔案目錄是/etc/nginx沒跑了.

        檢視資料夾目錄:


編輯主配置檔案

        主配置檔案就是nginx.conf,使用vim進入編輯:


        新檔案的worker_processes的值是1,這裡最好改成auto,這樣nginx可以根據需要自動匹配工作程序數,其他的就不用動了,關於虛擬主機的配置在最後一行有,意思就是每次啟動nginx的時候自動載入/etc/nginx/conf.d/下的全部.conf檔案,至於這些.conf檔案是什麼,等下就知道了.

新建虛擬主機

        進入conf.d資料夾後檢視資料夾目錄發現,這裡只有一個default.conf,使用vim檢視一下:


        原來這就是虛擬主機的配置檔案,預設監聽的是80埠,如果80埠已經有程序佔用了會啟動失敗,遇到啟動失敗的情況可以試著更改一下監聽埠,此時啟動Nginx就已經可以訪問到歡迎頁面了,這裡我們改成6000埠試試:

    [[email protected] conf.d] systemctl restart nginx

        在瀏覽器中使用http://IP地址:埠號檢視一下


        成功啟動!

        接下來就是正式的虛擬機器配置了,在conf.d資料夾下新建一個.conf檔案,名字就用專案名吧(方便些),使用vim進入,配置如下:

    upstream flask{
        server 127.0.0.1:5001;
    }


    # Virtual host, with this option, we can visit our web site on server_name.
    # If the server_name is an ip address and we has configured a DNS, 
    # we can also use the corresponding domain name.

    server {

        listen              5000;

        # domain name or ip address
        server_name         www.shenghuntianlang.xin;

        charset             utf-8;


        # the web site resources path    
        location / {
            include         uwsgi_params;

            # The inner address whilch point to Uwsgi. all the requests will resend to Uwsgo to resolve.
            # If we has configured the upstream options, we can fill in the upstream name instead.
            uwsgi_pass      flask;

            # If the following options are already exists in 'Uwsgi.ini'.these options can be ignored.
            # Configure Uwsgi's running environment path.
            # uwsgi_param   UWSGI_PYHOME    /root/.local/share/virtualenvs/Fisher-e_ddg0zZ;

            # Configure the main directory of web site
            # uwsgi_param   UWSGI_CHDIR     /home/Servers_Nginx/Fisher;

            # Configure the Flask Core Object
            # uwsgi_param   UWSGI_SCRIPT    fisher:app;

            }
    }    

        每個選項的作用都寫在註釋中了,不過還是稍微解釋一下吧,首先upstream是用來做負載均衡的Nginx在接收到請求後,會將請求轉發到其中的伺服器上,這裡的每一個server就是一個伺服器,另外,127.0.0.1:5001是不是有點熟悉?是滴,就是上面配置的Uwsgi的socket,Nginx通過socket連線Uwsgi把請求傳送到Uwsgi伺服器,Uwsgi處理後把響應反饋給Nginx再由Nginx轉發給客戶端,使用upstream時只需要將設定的upstream名(這裡是flask)填入server中的location中的uwsgi_pass就可以了,另外也可以不配置upstream,直接把Uwsgi的socket填入uwsgi_pass也行得通,

        其次是server的location,其中的include是載入uwsgi_params檔案(本身在Nginx配置目錄/etc/nginx下就有一個,可以看上面的截圖),這個檔案是用來確定Uwsgi的執行資訊的,由於Nginx配置目錄下有現成的,所以就不用管了,直接指向那個檔案即可(如果有需要需要置頂到特定檔案則需要填入絕對地址),還有就是下面全部註釋掉的配置資訊,這些是用來額外配置Uwsgi的啟動配置的,如果Uwsgi的.ini檔案裡面有相關配置(虛擬環境啊核心APP物件啊什麼的)就不需要了,因此這裡只給了兩個配置,uwsg_params檔案和Uwsgi的socket.

        到此虛擬環境就配置成功了,另外配置完Nginx之後可以使用nginx -t測試配置檔案,如果成功就萬事大吉,有錯誤的話會有相關資訊彈出,之後使用systemctl restart nginx重啟Nginx,就可以用配置的server_name加埠訪問Nginx了.

        雜記

       ※檢視埠號監聽狀態與關閉監聽程序

        檢視埠號

    [[email protected] /] netstat -ntlp | grep 5000
    tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN      10316/nginx: master 

        通過pid關閉監聽程序

    [[email protected] /] kill -9 pid

        使用場景:埠被佔用,服務起不來

        注:其中pid是監聽程序的名字的'/'前面的那個數字

        ※檢視服務名相關執行資訊並關閉

        檢視服務名相關執行資訊

    [[email protected] /] ps -ef | grep nginx
    root     10316     1  0 10:37 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
    nginx    10317 10316  0 10:37 ?        00:00:00 nginx: worker process
    root     10589  8661  0 11:22 pts/6    00:00:00 grep --color=auto nginx

        關閉此服務

    [[email protected] /] pkill -9 nginx

        使用場景:同名服務已存在,需要重新啟動新服務

        注:此方式是關閉此服務名下的所有程序,如果需要精準關閉,可以使用通過pid方式,此外,就算關閉所有程序,仍然會有一個名為'grep --color=auto nginx'的程序存在(Uwsgi以及其他一些服務也是),屬於正常情況,不比特別在意

        ※Nginx和Uwsgi無法同時啟動

        解決方法:Nginx的監聽埠不要和Uwsgi的埠一樣,不然會起衝突導致其中一個起不來.

        ※自定義執行命令

        編輯使用者目錄下的.bashrc可以自定義執行命令:

    [[email protected] ~] vim .bashrc

            

        編輯完成後儲存退出,並使.bashrc生效:

    [[email protected] ~] source .bashrc

        此後就可以使用新命令了,另外可以用alias臨時定義執行命令,只不過是暫時的,退出終端之後就沒了.

        ※※切換程式前後臺並在退出終端(xshell之類的工具同理)後繼續執行

        切換前後臺

        執行一個命令:

    [[email protected] Fisher] uwsgi uwsgi.ini

        此時Uwsgi會在前臺執行,在當前終端中無法進行其他操作,

        切換到後臺,先Ctrl+Z掛起程式

            

        然後使用:

    [[email protected] Fisher] bg

            

        此時程式在後臺執行,終端解鎖,可以進行其他操作,使用fg可以將後臺的程式調到前臺

            

        其他用法可以自行找度娘

        此外,即使程式在後臺執行,一旦退出終端,程式程序仍舊會被系統kill掉,可以使用tmux工具:

        建立新會話:

    [[email protected] ~] tmux new -s 會話名(自定)

        之後會進入新回話,底部會有綠色提示


        在這裡面執行程式程式執行後,使用Ctrl+b | d(先輸入Ctrl+b,再輸入單個d)退出當前會話,此時會回到前面的終端環境

            

        使用Ctrl+b | s可以檢視所有會話

            

        進入先前會話

    [[email protected] ~] tmux attach -t uwsgi-fisher
        

相關推薦

使用Nginx+Uwsgi在CentOS伺服器部署Python Flask應用

寫在開頭        第一次用Flask做Web(也是第一次用Python做Web),在部署的時候遇到了不少問題,現在將過程就下來,供在這方面也有疑惑的人蔘考.(PS:使用Apache+mod_wsgi部署模式的可以參考另一個博主的這篇文章:http://blog.elnm

如何部署python + flask應用

一、介紹   最近開發要用一個測試環境,是這樣的Nginx+uwsgi+flask 的一個結構。下面是一些記錄,在Centos 系統上使用Flask 架構部署一個簡單的Python應用。然後使用Nginx作為前端反向代理,設定uWSGI應用閘道器處理web應用程式。 二、

使用Nginx和Gunicorn在伺服器部署Flask專案

Flask作為一個Web框架雖然自帶Web伺服器,但其Web伺服器主要用於開發階段的測試,在生產環境中應該選擇更專業的Web伺服器。當然在Web框架和Web伺服器之間還需要一個實現了WSGI協議的容器協助Web框架和Web伺服器之間通訊。 常用的WSGI協議容器有Gunicorn和uWSGI,當

當“伺服器部署多個Web應用”,使用Nginx反向代理配置

當同一伺服器上部署了多個不同的web應用時,可以使用Nginx進行管理配置。 舉個例子:假如 www.aabbccdd.com 站點有好幾個web  App(web應用): finance(金融)、product(產品)、admin(使用者中心)。 訪問這些應用的方式通過

weblogic在linux伺服器部署應用

  SSH軟體連線伺服器: 伺服器地址:xxx.xxx.xxx.40 使用者名稱:xxxx 密碼:xxxx     新建資料夾,用來放新程式碼版本,後面為程式碼版本號 路徑:/home/weblogic 命令:mkdir wzgcyth_xx

nginx+docker同一伺服器部署多個docker實現負載均衡

在提到負載均衡的時候,大多數人都是想著幾臺伺服器甚至幾十臺伺服器組成一個群組 也就是橫向拓展伺服器來實現負載均衡吧 但是還有一種情況是縱向拓展 也就是當你的專案在一臺伺服器上佔用的資源很少,其實是可以在同一臺伺服器上部署多個專案來實現負載均衡的 這裡利用nginx+dock

關於在WebLogic伺服器部署應用時錯誤的累積

先貼專案中所引入的jar包: antlr-2.7.6.jar   aopalliance-1.0.jar  asm-3.1.jar aspectjrt-1.7.0.jar aspectjweaver-1.7.0.jar  axis-1.4.jar  backport-uti

在LNMP伺服器部署Laravel專案----nginx的配置檔案

在此之前我們已經上傳laravel專案到對應的伺服器資料夾並且用composer安裝了對應的擴充套件包了。在LNMP伺服器上部署Laravel專案,步驟如下:將域名解析到你的LNMP伺服器;開啟php的cgi.fix_pathinfo配置,在php.ini檔案下尋找cgi.f

windows10使用apache部署python flask專案

由於需要在學校機房部署,所以必須選擇windows系統。 本人電腦win10 需要清楚的事情: 生產環境所使用的python的版本,從cmd中進入python後,版本資訊將列印在cmd中。本人使用的為32位的py3.5 on win32 下載

使用Nginx+Uwsgi部署Python Flask項目

工具 stream sources ali set 最好 nginx配置 working 定義 第一次用Flask做Web(也是第一次用Python做Web),在部署的時候遇到了不少問題,現在將過程就下來,供在這方面也有疑惑的人參考.(PS:使用Apache

在Windows雲伺服器部署javaweb專案

javaWeb專案部署到Windows雲伺服器上 工具 / 材料 方法 / 步驟 建立web專案 & 匯出war包 設定遠端桌面連線資訊 在雲伺服器上安裝JDK(版本必須在1.7以上) Tomcat 的安裝與使用

阿里雲伺服器部署tomcat,並進行訪問測試

    要求將一個專案部署到新買的阿里雲伺服器上。使用xshell遠端連線(連線使用的ip是例項的公網ip)。     在部署配置tomcat之前首先進行JDK的部署,先說明一下,我使用的CentOS7.4.     選擇JDK1.

如何在 Linux 伺服器部署多個 Tomcat

開發管理專案時多多少少會遇到伺服器不夠用、一個專案分成多個子專案的情況,故研究了一下如何在一臺伺服器部署多個 Tomcat。 具體操作: 1、在 /tomcat/ 下部署多個 tomcat。   2、修改 /etc/profile 檔案末尾,加入如下內容: ##########f

總想自己動動手系列·1·本地和外網(Liunx伺服器部署的web專案)按照自定義的報文格式進行互動(一)

一、準備工作 (1)有一臺屬於自己的雲伺服器,併成功部署和釋出一個web專案(當然,本質上來說Java-Project也沒問題),通過外網IP可以正常訪問該web專案。   需要說明的是:任何web專案,只要成功部署後在外網上能訪問到即可。本案例注重修改web對請求的監聽和過濾的處

在Windows下用Apache+wsgi部署python+flask專案

一. 安裝Apache 從http://www.apachelounge.com/download/  下載最近版本的Apache 解壓到D盤下,我的80埠已經被佔用了,所以需要修改配置檔案:D:/Apache24/conf/httpd.conf 找到Define SRVR

伺服器執行Python專案

     直接在筆記本里跑Python專案實在是太慢了,師兄給了實驗室伺服器一個節點,安排上了!      首先下載了師兄給的bitvise安裝包,其實我之前用的是Xshell5,我也不造有什麼區別,就又安裝了一個。對比之後我發現bit

如何在雲伺服器部署你的web專案和一些遇到的問題

第一次寫部落格,寫的不好的地方請見諒。 1、首先你的雲伺服器一定要開啟 2、然後遠端桌面連線你的雲伺服器(它就像是一臺電腦一樣)通過給你的外網ip地址連線,密碼如果給你了的話你就用給你的密碼登入,如果沒有給密碼就重置密碼(這個可以在你的雲伺服器的管理中心裡面弄),我的是百度雲的,找不到重

在雲伺服器部署你的JAVA WEB專案

第一次在阿里雲伺服器上部署自己的java web專案,從一無所知的小小白到現在略微有一點專案部署經驗的小白(hahahaha),這個過程中真的是一路艱辛,各種頭疼,各種痛苦。但是,不積小流無以成江海,不積跬步無以至千里,現在每一步看似很難的操作和痛苦的學習過程,都是在為自己通往大神之路打基礎做積累。

在雲伺服器部署專案(

1、 購買騰訊雲主機 首先我們先了解一下雲伺服器的概念: 雲伺服器:        高效能高穩定的雲虛擬機器,可在雲中提供彈性可調節的計算容量,不讓計算能束縛您的想象;您可以輕鬆購買自定義配置的機型,在幾分鐘內獲取到新伺服器,並根據您的需要使用映象進行快速的擴容。

在雲伺服器部署Django專案後無法正常顯示網頁的原因

nginx+Django+uwsgi部署專案成功,並且開啟伺服器埠之後可以正常訪問網頁,但是載入不出圖片只有文字,起初以為是因為某些原因網頁尾本被禁用了,後來發現這種問題應該不可能出現,查詢一下相關問題,在https://blog.csdn.net/baidu_35085676/article/de