<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                雖然 Flask 內置了服務器,其輕便且易于使用,但是 **Flask 的內建服務器不適用于生產**,也不能很好 的擴展。 ## 獨立 WSGI 容器 - Gunicorn Gunicorn (綠色獨角獸) 是一個 Python WSGI UNIX 的 HTTP 服務器。這是一個 pre-fork worker 的模型,從 Ruby 的獨角獸([Unicorn](http://www.oschina.net/p/unicorn))項目移植。該 Gunicorn 服務器大致與各種 Web 框架兼容,實現非常簡單,輕量級的資源消耗。Gunicorn 直接用命令啟動,不需要編寫配置文件,相對 uWSGI 要容易很多。 ### 安裝 gunicorn ``` (.venv) root@airvip:~/python_app/flask-demo# pip install gunicorn ``` 安裝成功后,通過命令行的方式可以查看如何使用 gunicorn ``` (.venv) root@airvip:~/python_app/flask-demo# gunicorn -h usage: gunicorn [OPTIONS] [APP_MODULE] optional arguments: -h, --help show this help message and exit -v, --version show program's version number and exit ``` 運行我們的項目 ``` (.venv) root@airvip:~/python_app/flask-demo# gunicorn -w 4 -b 127.0.0.1:8889 manage:app [2021-01-12 07:29:33 +0000] [22184] [INFO] Starting gunicorn 20.0.4 [2021-01-12 07:29:33 +0000] [22184] [INFO] Listening at: http://127.0.0.1:8889 (22184) [2021-01-12 07:29:33 +0000] [22184] [INFO] Using worker: sync [2021-01-12 07:29:33 +0000] [22187] [INFO] Booting worker with pid: 22187 [2021-01-12 07:29:33 +0000] [22188] [INFO] Booting worker with pid: 22188 [2021-01-12 07:29:33 +0000] [22189] [INFO] Booting worker with pid: 22189 [2021-01-12 07:29:33 +0000] [22190] [INFO] Booting worker with pid: 22190 # gunicorn 記錄日志 gunicorn -w 4 -b 127.0.0.1:8889 manage:app --access-logfile /root/python_app/flask-demo/logs/access.log --error-logfile /root/python_app/logs/flask-demo/error.log ``` 測試 ``` root@airvip:~# curl 127.0.0.1:8889 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <link rel="stylesheet" type="text/css" href="/static/css/style.css"> <title>前后端分離靜態頁面</title> </head> <body> * 前后端分離的靜態 HTML </body> </html> ``` 傳送門:[Flask 部署方式更多使用技巧](https://dormousehole.readthedocs.io/en/latest/deploying/index.html#deployment) ## 進程管理工具 supervisor Supervisor 是一個 Python 開發的通用的進程管理程序,可以管理和監控 Linux 上面的進程,能將一個普通的命令行進程變為后臺 daemon,并監控進程狀態,異常退出時能自動重啟。 ### 安裝 supervisor ``` root@airvip:~# apt-get install supervisor ``` supervisor 是一個 Python 開發的,當然也可以使用 pip 安裝。 ### 配置 ``` root@airvip:/etc/supervisor/conf.d# vim flask_demo.conf ``` 內容如下 ``` [group:flask_demo] ; programs=flask-demo-app ,flask-demo-celery programs=flask-demo-app ; [program:xx] 被管理的進程配置參數,xx 是進程的名稱 [program:flask-demo-app] ; directory 腳本目錄 directory=/root/python_app/flask-demo ; command 執行的命令 command=/root/python_app/flask-demo/scripts/manage.sh ; autostart 在supervisord啟動的時候也自動啟動 autostart=true ; startsecs 啟動10秒后沒有異常退出,就表示進程正常啟動了,默認為1秒 startsecs=10 ; autorestart 程序退出后自動重啟,可選值:[unexpected,true,false],默認為 unexpected,表示進程意外殺死后才重啟 autorestart=true ; startretries 啟動失敗自動重試次數,默認是3 startretries=3 ; user 用哪個用戶啟動進程,默認是root user=root ; priority 進程啟動優先級,默認999,值小的優先啟動 priority=999 ; redirect_stderr 改為 true 則把 stderr 重定向到 stdout,默認 false redirect_stderr=true ; stdout_logfile_maxbytes 日志文件大小,默認 50MB stdout_logfile_maxbytes=50MB ; stdout_logfile_backups 日志文件備份數,默認是 10 stdout_logfile_backups=10 ; stdout_logfile 需要注意當指定目錄不存在時無法正常啟動,所以需要手動創建目錄(supervisord 會自動創建日志文件) stdout_logfile=/mnt/logs/xx_stdout.log stderr_logfile=/mnt/logs/xx_stderr.log loglevel=info stopsignal=KILL ; stopasgroup 默認為 false,進程被殺死時,是否向這個進程組發送 stop 信號,包括子進程 stopasgroup=true ; killasgroup 默認為 false,向進程組發送 kill 信號,包括子進程 killasgroup=true ``` 在 `/root/python_app/flask-demo/scripts/` 目錄下新建 `manage.sh `,內容如下 ``` #!/bin/bash source ~/.bashrc export FLASK_ENV=production cd /root/python_app/flask-demo/ source .venv/bin/activate exec gunicorn -b 0.0.0.0:8889 --access-logfile /root/python_app/flask-demo/logs/access.log --error-logfile /root/python_app/flask-demo/logs/error.log manage:app ``` 給 `manage.sh` 腳本可執行權限 ``` (.venv) root@airvip:~/python_app/flask-demo/scripts# chmod +x manage.sh ``` 查看 ``` # 查看 supervisor 是否已啟動 root@airvip:/etc/supervisor/conf.d# ps -aux | grep supervisor root 11028 0.0 0.0 13136 1104 pts/2 S+ 09:22 0:00 grep --color=auto supervisor root 27948 0.0 1.0 65548 21372 ? Ss 07:59 0:01 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf root@airvip:~# systemctl status supervisor root@airvip:~# systemctl start supervisor root@airvip:~# systemctl stop supervisor ``` ### supervisorctl supervisor 已經啟動,我們可以利用 supervisorctl 來管理 ``` root@airvip:/etc/supervisor/conf.d# supervisorctl supervisor> update flask_demo: added process group supervisor> status flask_demo:flask-demo-app RUNNING pid 19110, uptime 0:00:19 ``` ### supervisorctl 常用命令 ``` supervisor> status # 查看程序狀態 supervisor> start flask-im # 啟動 flask-im 單一程序 supervisor> stop flask-demo:* # 關閉 flask-demo 組程序 supervisor> start flask-demo:* # 啟動 flask-demo 組程序 supervisor> restart flask-demo:* # 重新啟動 flask-demo 組程序 supervisor> update # 重啟配置文件修改過的程序 supervisor> reload # 重新啟動配置文件中的所有程序 supervisor> exit # 退出 ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看