一、下載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值