uwsgi啟動flask項目(venv虛擬環境)


一、下載uwsgi:

pip3 install uwsgi

 

 

 

[uwsgi: command not found]解決辦法:建立軟鏈接 

ln -s pip下載的uwsgi目錄 /usr/bin/uwsgi

例如:ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi3

注意:有些機器配置的不止一個uwsgi,所以要看uwsgi命令映射的是哪個python版本的,也可以像我這樣,給python3環境的uwsgi映射成uwsgi3。

 

二、配置虛擬環境:

方式一:利用venv方式創建虛擬環境

1、通過命令創建一個虛擬環境目錄

python3 -m venv /home/pkuokuo/venv/my_system

會自動生成該目錄

 2、激活虛擬環境

source /home/pkuokuo/venv/my_system/bin/activate

 

3、 進入到虛擬環境下

這里面就可以使用虛擬目錄環境,直接在虛擬環境中pip下載所需要的依賴包。光標前面帶一個括號,代表是在虛擬環境下

 

 

 

 

4、退出虛擬環境命令:

deactivate

 

方式二:配置virtualenv虛擬環境

 

三、啟動uwsgi

1、啟動命令:

uwsgi uwsgi.ini

2、uwsgi.ini:

#uwsgi --ini uwsgi.ini             # 啟動
#uwsgi --reload uwsgi.pid          # 重啟
#uwsgi --stop uwsgi.pid            # 關閉


[uwsgi]
# 字符編碼
env=LC_ALL=en_US.UTF-8

# 指定IP端口
http = :8386

# the local unix socket file than commnuincate to Nginx   用於和 nginx 進行數據交互的端口
#socket = 127.0.0.1:8001

# 項目目錄
chdir = /opt/my_system

# 啟動文件地址
wsgi-file = /opt/my_system/manage.py
#wsgi-file = my_system/manage.py

# uWSGI加載的模塊中哪個變量將被調用
callable = app

# 自動移除unix Socket和pid文件當服務停止的時候
vacuum = true

# socket權限設置
#chmod-socket = 664

# uWSGI服務器運行時的用戶id
uid=root

# uWSGI服務器運行時的用戶組id
gid=root

# 啟用主進程
master = true

# 進程個數,工作進程的最大數量
processes = 5

# 主進程id文件目錄
pidfile = /opt/my_system/uwsgi.pid

# 啟用線程
enable-threads=true

# 在每個輔助進程中啟動的線程數
threads=4

# 一個高階的cheap模式,在啟動的時候只會分配n個工作進程,並使用自適應算法啟動新的進程,must be lower than processes
#cheaper = 10

# 在經過sec秒的不活躍狀態的進程會被銷毀(進入了cheap模式),並最少保留cheaper指定的進程數
#idle = 3600

# 設置自中斷時間,設置一個請求的超時時間(秒),如果一個請求超過了這個時間,則請求被丟棄
harakiri=30

# 當一個請求被harakiri殺掉會,會輸出一條日志
harakiri-verbose = true

# 開啟內存使用情況報告
memory-report = true

# 設置平滑的重啟(直到處理完接收到的請求)的長等待時間(秒)
reload-mercy = 10

# 設置緩沖
#post-buffering=4096

# 控制台輸出日志目錄
daemonize = /var/log/53kf/my_system/my_system.log

# 設置日志監聽對象
#logto=/var/log/53kf/my_system
#touch-logreopen=/var/log/53kf/my_system/.touchforlogrotat

# 通過該端口可以監控 uwsgi 的負載情況
stats = 127.0.0.1:8387

# 配置虛擬環境路徑
virtualenv = /home/pkuokuo/venv/my_system

#設置用於uwsgi包解析的內部緩存區大小為64k。默認是4k。
#buffer-size=65536

#在每個worker而不是master中加載應用
#lazy-apps=true



# 設置工作進程使用虛擬內存超過N MB就回收重啟
#reload-on-as= 1024

# 自動給進程命名
#auto-procname = true

# 為進程指定前綴
#procname-prefix-spaced = xc-mms

# 設置工作進程每處理N個進程就會被回收重啟
#max-requests=500000
 
# 設置工作進程使用物理內存超過N MB就回收重啟
#reload-on-rss=100

# 設置socket超時時間,默認4秒
#socket-timeout=10
 
# 限制http請求體的大小(Bytes)
#limit-post=4096

# clear environment on exit
#vacuum = true

# 不記錄request日志,只記錄錯誤日志
#disable-logging = true
 
# 將日志打印到syslog上
#log-syslog = true

#stats = /opt/my_system/uwsgi.status

 

 

 

3、訪問失敗或者訪問接收不到可能是因為開了防火牆。

centos7查看防火牆狀態:

systemctl status firewalld.service

 

關閉運行的防火牆:

systemctl stop firewalld.service    

 

四、問題總結

 錯誤1:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-40: ordinal not in range(128)

原因是打印日志的時候打印了中文。

log.info('初始化熱門產品')

 解決:

該問題是由於操作系統文件編碼格式的問題,

 可以查看服務器的編碼,利用命令:locale

 

 

(C指的是標准 ISO C的區域機制;區域支持指的是應用遵守文化偏好的問題,包括字母表、排序、數字格式等) 

可以看到除了第一個為utf-8外,其他的都為默認格式。這樣對中文編碼可能會引起中文編碼異常,我們需要將所有參數都配置成utf-8的:

export LC_ALL=en_US.UTF-8

運行上面這句代碼后,便將所有的參數設置成utf-8

 

 這樣運行就不會出現中文編碼錯誤了,但是對於公共系統環境,隨意的更改系統編碼可能會導致其他項目出現問題,所以這里提供的解決辦法:單獨對這一個項目進行配置,所以我們在uwsgi的啟動配置文件uwsgi.ini中加入這個配置:

# 字符編碼
env=LC_ALL=en_US.UTF-8

這樣就完美的解決了這一個項目的字符編碼問題,也不會影響到其他的項目運行。

 

 

注: 

1、 LANG是一個缺省值,所有沒有顯式設置值的LC_*變量都會取LANG的值。
2、 LANGUAGE的優先級比較高,會覆蓋所有設置過的LC_*的值
3、 LC_ALL並不是一個環境變量,而是一個glibc中定義的一個宏,LC_ALL=C這樣的語法實際上是調用了setlocale把所有的LC_*的變量設置了一遍。

從優先級的角度,變量生效的優先順序從高到低如下:

1、 LANGUAGE 優先級最高,指定個人對語言環境值的主次偏好,例如zh_CN:en_US:en,冒號分隔的是多種選擇。 2、 LC_ALL 設置的值 3、 LC_* 可設定locale各方面(category)的值,可以覆蓋LANG的值。 4、LANG 指定默認使用的locale值



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM