centos7部署django

longsihua2003發表於2024-09-09

問題彙總

由於centos7到現在好像挺老了。有些東西真的逆天。

本次採取的專案為django後端專案

採用的是開源的django部落格系統
程式碼倉庫:https://github.com/liangliangyy/DjangoBlog.git

  • 使用poetry作為包管理工具。

  • uwsgi + nginx進行部署

  • supervisor作為程序管理工具

  • 採取動靜分離的nginx代理設計。

遇到的問題

  1. 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不支援。也問題不大,找教程就行。
  2. 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)
        # 再安裝就行了
    
  3. 結果搞了這麼久,yum裝不了mysql,centos7裝的mariadb

    也可以安裝高版本mariadb,參考文章:https://www.cnblogs.com/pyyu/p/9467289.html,按照配置倉庫,安裝的要求就行,巨詳細。
    沒辦法,原始碼安裝mysql-8,可以參考文章:https://www.cnblogs.com/zhourx/p/17558946.html

  4. 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
    
    
  5. 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;
    	}
    
  6. 完成之後,按道理是正常啟動,可是,還有一點bug

    1. 拿靜態檔案還是拿不到,報403.

      顯然許可權問題,把收集的靜態檔案許可權給nginx,或者直接開啟就是
      chmod 777 /opt/djangostatic/collectedstatic

    2. 首頁重新整理出現404,這個好像常發生在vue專案當中

      在nginx的location當中新增引數
      try_files $url $url/ /index.html

  7. 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
    

相關文章