溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

docker部署fastapi項目及日志掛載的方法是什么

發布時間:2023-03-15 09:53:10 來源:億速云 閱讀:540 作者:iii 欄目:開發技術

今天小編給大家分享一下docker部署fastapi項目及日志掛載的方法是什么的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    docker部署fastapi項目以及日志掛載

    最近在嘗試用docker部署fastapi項目

    他的基本架構是由nginx+guvicorn+uvicorn+fastapi項目組成的

    Nginx

    nginx起到反向代理的作用

    可能有人會問,為什么要用nginx反向代理,我直接訪問項目不行嗎?

    其實nginx不只是反向代理的功能,還有很多像負載均衡、請求攔截、靜態文件訪問等等功能,而且他還隱藏了web服務的地址。

    uvicorn

    uvicorn是什么呢?大家都知道,fastapi使用的是ASGI協議,它是WSGI協議的一種升級版

    而uvicorn是一個高性能的ASGI服務器,它建立在uvloop和httptools之上,

    我們在本地開發時可以使用uvicorn來做服務器,

    不過雖然uviorn也可以啟動和運行多個進程,但是在處理工作進程的能力上更有限。

    gunicorn

    所以我使用gunicorn來做進程管理器,雖然gunicorn是一個WSGI服務器,本身與fastapi不兼容,但是你只要告訴它使用哪個特定的工作進程類,他就可以使用這個類啟動一個或多個工作進程

    這不就巧了嗎?uvicorn就有一個gunicorn兼容的worker類

    下面我們來講一下究竟怎么啟動

    首先我們需要下載uvicorn和gunicorn

    pip install "uvicorn[standard]"
    pip install gunicorn

    然后我們就可以啟動了

    不過官方展示的是命令行啟動:

    gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80

    并沒有展示文件啟動的方式,我們還是習慣配置文件啟動,其實也很簡單。

    我們只需要在項目根路徑下建立一個config.py文件作為配置文件即可。

    import multiprocessing
    
    # 是否開啟debug
    debug = True
    
    # 設置守護進程
    daemon = True
    
    # 綁定ip和端口號
    bind = '0.0.0.0:8000'
    
    # 超時時間
    timeout = 30
    
    # 工作模式
    worker_class = 'uvicorn.workers.UvicornWorker'
    
    # 進程數
    workers = multiprocessing.cpu_count() * 2 + 1
    
    # 設置證書
    # keyfile = ''
    # certfile = ''
    
    # 日志級別,這個日志級別指的是錯誤日志級別,而訪問日志的級別無法設置
    loglevel = 'debug'
    
    #設置執行路徑
    chdir = './sql_app'
    
    # 日志配置
    # 訪問日志文件
    accesslog = "/app/sql_app/log/access.log"
    # 錯誤日志文件
    errorlog = "/app/sql_app/log/error.log"

    這里我們只要把worker_class 工作模式設置成’uvicorn.workers.UvicornWorker’,他就可以啟動我們的uvicorn服務器了。

    注意設置好執行路徑和日志文件

    然后執行啟動命令

    gunicorn -c config.py main:app

    其中main為項目的初始化文件

    docker日志掛載的問題

    關鍵是本地服務器沒有寫入的權限 

    關鍵看這里吧(Permission denied), 一直沒有看正方,以為是配置日志文件 找不到有問題,下面是部分異常

    10:35:09,498 |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - openFile(null,true) call failed. java.io.FileNotFoundException: logs/bandwidth.log.2019-04-25.log (Permission denied)
            at java.io.FileNotFoundException: logs/bandwidth.log.2019-04-25.log (Permission denied)
            at      at java.io.FileOutputStream.open0(Native Method)
            at      at java.io.FileOutputStream.open(FileOutputStream.java:270)
            at      at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
            at      at ch.qos.logback.core.recovery.ResilientFileOutputStream.<init>(ResilientFileOutputStream.java:26)
            at      at ch.qos.logback.core.FileAppender.openFile(FileAppender.java:204)
            at      at ch.qos.logback.core.FileAppender.start(FileAppender.java:127)
            at      at ch.qos.logback.core.rolling.RollingFileAppender.start(RollingFileAppender.java:100)
            at      at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
            at      at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
            at      at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)

    嘗試好多遍,才真正看懂原因也是從網上看到的一點啟發,希望大家也能注意到,我用如下命令完美解決

    docker run   -it --privileged=true    -v /dockerlogs:/app/logs   -d -p 5080:5080  82edb4bbc79b

    掛載宿主機已存在目錄后,在容器內對其進行操作,報“Permission denied”

    可通過兩種方式解決:

    1> 關閉selinux。

    臨時關閉:# setenforce 0

    永久關閉:修改/etc/sysconfig/selinux文件,將SELINUX的值設置為disabled。

    2> 以特權方式啟動容器 

    指定--privileged參數

    如:

    # docker run -it --privileged=true -v /test:/softlogs

    以上就是“docker部署fastapi項目及日志掛載的方法是什么”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女