使用nginx+uwsgi+supervisor+pyenv部署flask

這裏是Ubuntu環境

1. 安裝

- nginx
	 1. 安裝:sudo apt-get install nginx
	 2. 查看nginx是否安裝成功:sudo nginx -v
	 3. 啓動:sudo nginx
	 4. nginx配置文件地址:Ubuntu一般都在`/etc/nginx/`目錄下(下面會在這個目錄下添加配置文件)

 - pyenv
	 這裏是教程地址,作者寫的很好,可以按照這個進行配置:https://www.jianshu.com/p/3e93311fe6cb

 - uwsgi
	 直接在上面創建的虛擬環境裏安裝即可:pip install uwsgi

 - supervisor(推薦使用root用戶進行配置,非root用戶會有權限問題)
	 1. 安裝:apt-get install supervisor
	 2. 配置目錄:Ubuntu一般都在`/etc/supervisor/`目錄下
	 3. 啓動:sudo supervisord
	 4. 管理使用:sudo supervisorcrl (使用此命令會進入一個交互環境)
		
		可以在環境裏使用命令:(程序名配置文件中配置)
		查看進程狀態:status
		停止進程:stop 程序名
		停止所有進程:stop all
		開始進程:start 程序名
		重啓進程:restart 程序名
		重新載入所有進程:reload
		新增配置文件後:update (如果不執行update,新的配置不會出現)

2. 安裝項目依賴庫

 - cd進項目目錄然後安裝項目的依賴庫:pip install -r requirements.txt

3. uwsgi配置(先在項目根目錄下創建uwsgi.ini文件)

[uwsgi]
master = true
processes = 2
chmod-socket = 666
uid = root
pythonpath = /home/test/api_test/website
logformat = %(method) %(uri) %(status) %(addr) [%(ctime)]
pidfile = /home/test/run/api_test.pid
socket = /home/test/run/api_test.sock
module = app
callable = app
harakiri = 120
listen = 1024
enable-threads=true
ignore-sigpipe = true
ignore-write-errors = true
disable-write-exception = true

master:使用主進程來管理其他子進程
processes:啓動2個工作進程,生成指定數目的worker/進程
chmod-socket:如果nginx使用socket文件來代理這個服務,需要對這個文件有寫的權限,所以這裏需要設置權限
uid:用戶名
pythonpath:application所在文件目錄
logformat:日誌格式
pidfile:指定進程文件(自行創建目錄存放)
socket:指定socket文件(自行創建目錄存放)
module:application所在文件
callable:指向application的變量名
harakiri:請求超時時間秒
listen:監聽的隊列數
enable-threads:允許application啓動子線程
最後三個是上傳文件時flask創建臨時文件時會出異常,這個是忽略OSError的配置

這裏說下uid,我最開始是在本地mac環境配置的nginx代理,配置完之後請求過來日誌裏出現(13: Permission denied) while connecting to upstream...,意思是沒有權限
所以需要設置nginx.conf裏的user配置,我是sudo啓動的nginx,所以nginx進程的用戶,是root用戶,(也可以使用ps aux | grep nginx查看啓動進程的情況)。
但是我把user設置成root之後,sudo nginx -t 檢查到nginx配置不正確,然後可能是沒有寫用戶組的原因,修改爲user root wheel;檢查nginx配置之後還是不正確,然後在uwsgi.ini中加入uid=root,就可以了,
原因可能是nginx沒有權限去寫這個socket的文件,(但是我明明設置了chmod-socket = 666)。對這裏也不瞭解,所以只能作出猜測,如果有知道的大佬,煩告知。。

4. supervisor配置

1. 首先:cd /etc/supervisor/
2. 發現這個目錄下有一個`supervisord.conf`的配置文件
3. vim supervisord.conf   打開配置文件最後一行(見下面圖)發現導入了同級目錄下的conf.d目錄下的所有.conf後綴的文件,所以把新的配置文件都寫到這個conf.d目錄下
4. cd conf.d  (如果沒有這個目錄創建一個 `sudo mkdir conf.d`)
5. 然後編輯文件:vim example.conf  (文件名可以隨便寫,只要後綴是.conf就可以)
6. 配置如下:
[program:api_test]
command=/home/test/.pyenv/versions/api_test/bin/uwsgi /home/test/api_test/uwsgi.ini
directory=/home/test/api_test
autostart=true
autorestart=true
stdout_logfile=/home/test/logs/uwsgi.api_test.log
redirect_stderr=true
exitcodes=0

圖一
第一行:program: 後面的就是程序名
command:要運行的命令,我這裏是使用虛擬環境裏的uwsgi去根據上面配置好的uwsgi.ini文件去運行
directory:項目地址
autostart:自動啓動
autorestart:自動重啓
stdout_logfile:輸出log文件路徑
redirect_stderr:error log是否重定向到上面寫的輸出log文件
exitcodes:默認爲0.文檔裏寫好像是退出時的code與是否重啓的關係,這裏按照文檔裏的,默認爲0

supervisor配置到這裏就結束了,可以先把superviso根據上面寫的命令先運行起來,進入交互環境後,先update更新配置,然後reload一下,等一會兒之後,status,看一下程序的狀態,如果出錯,可能是哪塊沒配置好根據日誌裏的錯誤信息對應修改就好,修改完之後需要重新reload或者restart一下,這樣supervisor就先運行起來了

5. nginx配置

1. cd /etc/nginx/  進入nginx目錄
2. ls 之後會發現有一個`nginx.conf`的配置文件
3. vim nginx.conf  在`http`塊裏有include包含這兩個目錄下的配置文件(見下圖),新增的配置文件就寫到這倆目錄下(如果沒有這倆目錄需要新建同名目錄)
4. cd /etc/nginx/sites-enabled/   (兩個目錄自行選擇一個)
5. 然後編輯文件:vim example.conf (文件名可以隨便寫,只要後綴是.conf就可以)
6. 配置如下:
server {
    listen 5010;
    client_max_body_size 50M;

    server_name 127.0.0.1;

    location / {
        access_log  /home/test/logs/nginx.api_test.access.log;
        error_log   /home/test/logs/nginx.api_test.error.log;
        include uwsgi_params;
        uwsgi_pass unix:///home/test/run/api_test.sock;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

在這裏插入圖片描述
listen:nginx監聽的端口,可以有多個server指向同一個端口,只要server_name不同就好
client_max_body_size:客戶端最大上傳數據大小
server_name:用於配置基於名稱的虛擬主機(這裏可以直接寫域名也可以寫ip,也可以使用通配符)
location:路由分發塊
access_log和error_log是兩個日誌文件的位置,自行指定
uwsgi_params:是nginx的設置,直接導入即可
uwsgi_pass:指向上面uwsgi.ini文件中的socket文件
剩下的是設置請求頭的一些參數

6. 結束

到這裏就配置完了
設置完之後使用:sudo nginx -s reload 重啓nginx,就可以了
現在訪問:127.0.0.1:5010 已經可以訪問到我的項目了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章