問題彙總
由於centos7到現在好像挺老了。有些東西真的逆天。
本次採取的專案為django後端專案
採用的是開源的django部落格系統
程式碼倉庫:https://github.com/liangliangyy/DjangoBlog.git
-
使用poetry作為包管理工具。
-
uwsgi + nginx進行部署
-
supervisor作為程序管理工具
-
採取動靜分離的nginx代理設計。
遇到的問題
-
python3.6裝不了coverage==7.3.2
原始碼換python3.9進行重新安裝部署。- 中間出的問題是,poetry卸掉了python3.6配置檔案沒解除安裝。
--使用yum安裝回python3.6,先透過pip3把poetry卸了。再裝新的環境的包。 - poetry下包巨慢
--換源:poetry source add tsinghua https://pypi.tuna.tsinghua.edu.cn/simple
注意這個好像3.6下的poetry不支援。也問題不大,找教程就行。
- 中間出的問題是,poetry卸掉了python3.6配置檔案沒解除安裝。
-
mysqlclient包安不上
好傢伙包這個錯:
Exception: Can not find valid pkg-config name. Specify MYSQLCLIENT_CFLAGS and MYSQLCLIENT_LDFLAGS env vars manually [end of output]
--解決方法
試著用yum安裝pkg-config。找不到包和其他問題話。總結配置環境變數# 找到 mysql_config 檔案的路徑 [root@localhost Backend]# which mysql_config /usr/local/mysql8/bin/mysql_config # 配置MYSQLCLIENT_CFLAGS 和 MYSQLCLIENT_LDFLAGS 環境變數,將 mysql_config 的路徑傳遞給它們 [root@localhost Backend]# export MYSQLCLIENT_CFLAGS=$(mysql_config --cflags) [root@localhost Backend]# export MYSQLCLIENT_LDFLAGS=$(mysql_config --libs) # 再安裝就行了
-
結果搞了這麼久,yum裝不了mysql,centos7裝的mariadb
也可以安裝高版本mariadb,參考文章:https://www.cnblogs.com/pyyu/p/9467289.html,按照配置倉庫,安裝的要求就行,巨詳細。
沒辦法,原始碼安裝mysql-8,可以參考文章:https://www.cnblogs.com/zhourx/p/17558946.html -
uwsgi.ini配置問題
重要配置
- chdir:一定是專案根目錄,也就是uwsgi.ini的位置
- module:這個必須得是根目錄開始,找到wsgi的目錄application
- wsgi-file:和module基本一致,就是去找wsgi.py
- home: 虛擬環境路徑
- 通訊方式:socket/http。內部通訊使用socket,比如說和nginx通訊;外部通訊使用http,可以直接展示與頁面
[uwsgi] project=djangoblog # uid=www-data # gid=www-data base=/root/DjangoBlog chdir = %(base) # 專案application路徑,也就是django的wsgi.py路徑 module = %(project)/wsgi:application wsgi-file = %(project)/wsgi.py # 虛擬環境路徑 home = /root/.cache/pypoetry/virtualenvs/djangoblog-h-y_BC25-py3.9 # chown-socket =%(uid):www-data # chmod-socket =664 # 使用http協議與nginx通訊 # 監聽在埠號8888上 # http =0.0.0.0:8000 # 使用socket和nginx通訊,不暴露http socket =0.0.0.0:8888 # 伺服器的緩衝區大小設定為64KB(65536位元組) buffer-size =65536 # 用於儲存當前執行的程序ID,以便在需要時可以重新啟動或停止該程序 pidfile =/tmp/%(project)-master.pid # 啟用了自動清理功能 vacuum =True # 每個程序允許處理的最大請求數為5000次 max-requests =5000 # 日誌檔案 # daemonize =/tmp/%(project)-uwsgi.log # 生成一個監聽的檔案, # touch .touchforlogrotat 相當於修改了建立時間,系統會重新reload日誌 # touch-logreopen =/tmp/.touchforlogrotat #設定一個請求的超時時間(秒),如果一個請求超過了這個時間,則請求被丟棄 harakiri=60 #當一個請求被harakiri殺掉會,會輸出一條日誌 harakiri-verbose=true master = True # worker數,多個worker則多程序 processes = 4 #開啟記憶體使用情況報告 memory-report = true #設定平滑的重啟(直到處理完接收到的請求)的長等待時間(秒) reload-mercy = 10 #設定工作程序使用虛擬記憶體超過N MB就回收重啟 reload-on-as= 1024 # uwsgi熱載入 py-autoreload=1 # uwsgi後臺執行 daemonize = yes
-
nginx做動靜分離時。
因為django靜態檔案的問題,得把靜態檔案搞出來:設定setting的三個主要引數
STATIC_ROOT='/opt/nginx1-12/static' STATIC_URL = '/static/' STATICFILES_DIRS=[ os.path.join(BASE_DIR,"static"), ]
接下來做靜態檔案的收集(收集於STATIC_ROOT路徑當中)和nginx配置
# 收集靜態檔案 python3 manage.py collectstatic # 記得記錄收集的檔案根目錄檔案以配置nginx # 配置nginx虛擬主機(server)加個location,來標記static別名位置,可以直接透過nginx拿靜態檔案而不走django location /static { alias /opt/djangostatic/collectedstatic; }
-
完成之後,按道理是正常啟動,可是,還有一點bug
-
拿靜態檔案還是拿不到,報403.
顯然許可權問題,把收集的靜態檔案許可權給nginx,或者直接開啟就是
chmod 777 /opt/djangostatic/collectedstatic
-
首頁重新整理出現404,這個好像常發生在vue專案當中
在nginx的location當中新增引數
try_files $url $url/ /index.html
-
-
supervisor程序管理工具
管理程序組開關,並且把配置檔案多的命令搞成一個專案,已控制啟動和關閉。
- pip安裝或者yum安裝和簡單配置
# pip安裝 pip3 install supervisor # yum安裝 yum install python-setuptools easy_install supervisor # 拿配置檔案(將配置檔案生成在哪) echo_supervisord_conf > /etc/supervisord.conf # 書寫uwsgi的配置(記得用which拿命令絕對路徑) # 在配置檔案最後加上 [program:my] command=/opt/venv/bin/uwsgi --ini /etc/uwsgi_nginx.ini ;需執行命令 stopasgroup=true ;預設為false,程序被殺死時,是否向這個程序組傳送stop訊號,包括子程序 killasgroup=true ;預設為false,向程序組傳送kill訊號,包括子程序
- 配置檔案詳解
# supervisord.conf配置檔案引數解釋 [program:xx]是被管理的程序配置引數,xx是程序的名稱 [program:xx] command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程式啟動命令 autostart=true ; 在supervisord啟動的時候也自動啟動 startsecs=10 ; 啟動10秒後沒有異常退出,就表示程序正常啟動了,預設為1秒 autorestart=true ; 程式退出後自動重啟,可選值:[unexpected,true,false],預設為unexpected,表示程序意外殺死後才重啟 startretries=3 ; 啟動失敗自動重試次數,預設是3 user=tomcat ; 用哪個使用者啟動程序,預設是root priority=999 ; 程序啟動優先順序,預設999,值小的優先啟動 redirect_stderr=true ; 把stderr重定向到stdout,預設false stdout_logfile_maxbytes=20MB ; stdout 日誌檔案大小,預設50MB stdout_logfile_backups = 20 ; stdout 日誌檔案備份數,預設是10 ; stdout 日誌檔案,需要注意當指定目錄不存在時無法正常啟動,所以需要手動建立目錄(supervisord 會自動建立日誌檔案) stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out stopasgroup=false ;預設為false,程序被殺死時,是否向這個程序組傳送stop訊號,包括子程序 killasgroup=false ;預設為false,向程序組傳送kill訊號,包括子程序
- 執行常用命令
# 帶著配置檔案啟動 supervisord -c /etc/supervisord.conf # 查詢配置檔案更新 supervisorctl reread # 更新配置檔案 supervisorctl update # 進入supervisor管理頁面 supervisorctl # 啟動重啟停止 start/restart/stop program1 # 停止所有專案 stop all # 檢視某專案狀態 status program1 # 退出 exit