1、虛擬環境之virtualenvwrapper
爲何須要 virtualenvwrapper
爲何須要 virtualenvwrapper?而不是virtualenv?這要從 virtualenv 提及。virtualenv 的一個最大的缺點就是,每次開啓虛擬環境以前要去虛擬環境所在目錄下的 bin 目錄下 source 一下 activate,這就須要咱們記住每一個虛擬環境所在的目錄。html
一種可行的解決方案是,將全部的虛擬環境目錄全都集中起來,好比放到 ~/virtualenvs/,並對不一樣的虛擬環境使用不一樣的目錄來管理。virtualenvwrapper 正是這樣作的。而且,它還省去了每次開啓虛擬環境時候的 source 操做,使得虛擬環境更加好用。前端
安裝virtualenvwrapper
版本virtualenvwrapper 4.8.4node
[root@web ~]# pip3 install virtualenvwrapper Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Collecting virtualenvwrapper Downloading ... Installing collected packages: virtualenv-clone, pbr, stevedore, virtualenvwrapper Running setup.py install for virtualenvwrapper ... done Successfully installed pbr-5.4.4 stevedore-1.32.0 virtualenv-clone-0.5.3 virtualenvwrapper-4.8.4 [root@web ~]#
配置virtualenvwrapper
設置Linux的環境變量,每次啓動就加載virtualenvwrapperpython
把下面兩行代碼添加到 ~/.bashrc文件中
打開文件
解釋說明
vi ~/.bashrc 寫入如下兩行代碼 export WORKON_HOME=~/Envs #設置virtualenv的統一管理目錄 export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' #添加virtualenvwrapper的參數,生成乾淨隔絕的環境 export VIRTUALENVWRAPPER_PYTHON=/opt/python347/bin/python3 #指定python解釋器 source /opt/python34/bin/virtualenvwrapper.sh #執行virtualenvwrapper安裝腳本 -- INSERT --
具體操做react
[root@web ~]# vi ~/.bashrc # .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' export WORKON_HOME=~/Envs export VIRTUALENVWRAPPER_VIRTUALENV_ARGS='--no-site-packages' export VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python3 source /usr/local/bin/virtualenvwrapper.sh
保存退出
讀取文件,使得生效(也能夠重啓終端使之生效),此時已經可使用virtalenvwrapperlinux
[root@web ~]# source ~/.bashrc virtualenvwrapper.user_scripts creating /root/Envs/premkproject virtualenvwrapper.user_scripts creating /root/Envs/postmkproject virtualenvwrapper.user_scripts creating /root/Envs/initialize virtualenvwrapper.user_scripts creating /root/Envs/premkvirtualenv virtualenvwrapper.user_scripts creating /root/Envs/postmkvirtualenv virtualenvwrapper.user_scripts creating /root/Envs/prermvirtualenv virtualenvwrapper.user_scripts creating /root/Envs/postrmvirtualenv virtualenvwrapper.user_scripts creating /root/Envs/predeactivate virtualenvwrapper.user_scripts creating /root/Envs/postdeactivate virtualenvwrapper.user_scripts creating /root/Envs/preactivate virtualenvwrapper.user_scripts creating /root/Envs/postactivate virtualenvwrapper.user_scripts creating /root/Envs/get_env_details [root@web ~]#
virtualenvwrapper基本使用
1.建立虛擬環境 mkvirtualenv env-name mkvirtualenv -p python3 env-name # 指定python的版本號 mkvirtualenv env-name --system-site-packages # 可使用虛擬環境的外部的模塊 2.進入虛擬環境 workon env-name 3.離開虛擬環境 deactivate 4.刪除虛擬環境 rmvirtualenv env-name 5.列出現有的虛擬環境 lsvirtualenv
其餘命令nginx
cdvirtualenv 導航到當前激活的虛擬環境的目錄中,好比說這樣您就可以瀏覽它的 site-packages 。 cdsitepackages 和上面的相似,可是是直接進入到 site-packages 目錄中。 lssitepackages 顯示 site-packages 目錄中的內容。 完整官網介紹:https://virtualenvwrapper.readthedocs.io/en/latest/command_ref.html
2、部署準備:上傳項目代碼、安裝nginx、安裝uwsgi,安裝django
0、上傳項目代碼
使用xftp上傳項目代碼web
建立文件夾sql
[root@web opt]# mkdir ./website/mycrm -p
選擇正確的位置上傳代碼,注意項目不要上傳到/root/ 目錄下,會產生權限問題shell
項目文件樹目錄
. ├── CRM_Project │ ├── __init__.py │ ├── __pycache__ │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── db.sqlite3 ├── manage.py ├── rbac │ ├── admin.py │ ├── apps.py │ ├── forms │ ├── __init__.py │ ├── middlewares │ ├── migrations │ ├── models.py │ ├── __pycache__ │ ├── service │ ├── static │ ├── templates │ ├── templatetags │ ├── tests.py │ ├── urls.py │ ├── views │ ├── ├── requirements.txt ├── stark │ ├── admin.py │ ├── apps.py │ ├── forms │ ├── __init__.py │ ├── migrations │ ├── models.py │ ├── __pycache__ │ ├── service │ ├── static │ ├── templates │ ├── tests.py │ ├── utils │ └── views.py ├── templates └── web ├── admin.py ├── apps.py ├── __init__.py ├── migrations ├── models.py ├── __pycache__ ├── stark.py ├── templates ├── tests.py ├── utils └── views
一、安裝nginx
見nginx之旅(第一篇):nginx下載安裝、nginx啓動與關閉、nginx配置文件詳解、nginx默認網站
nginx 版本nginx/1.15.5
二、安裝uwsgi
uwsgi 版本 2.0.18
建立虛擬環境mycrm
[root@web ~]# mkvirtualenv mycrm created virtual environment in 162ms CPython3Posix(dest=/root/Envs/mycrm, clear=False, global=False) with seeder FromAppData pip=latest setuptools=latest wheel=latest app_data_dir=/root/.local/share/virtualenv/seed-v1 via=copy virtualenvwrapper.user_scripts creating /root/Envs/mycrm/bin/predeactivate virtualenvwrapper.user_scripts creating /root/Envs/mycrm/bin/postdeactivate virtualenvwrapper.user_scripts creating /root/Envs/mycrm/bin/preactivate virtualenvwrapper.user_scripts creating /root/Envs/mycrm/bin/postactivate virtualenvwrapper.user_scripts creating /root/Envs/mycrm/bin/get_env_details (mycrm) [root@web ~]# lsvirtualenv mycrm =====
安裝uwsgi
(mycrm) [root@web ~]# pip3 install uwsgi Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Collecting uwsgi Using cached https://mirrors.aliyun.com/pypi/packages/e7/1e/3dcca007f974fe4eb369bf1b8629d5e342bb3055e2001b2e5340aaefae7a/uwsgi-2.0.18.tar.gz (801 kB) Building wheels for collected packages: uwsgi Building wheel for uwsgi (setup.py) ... done Created wheel for uwsgi: filename=uWSGI-2.0.18-cp37-cp37m-linux_x86_64.whl size=4966936 sha256=a6d1fdbcb6579c916dac8ada124a0ae8b99bcd598789de49add68019ab895a54 Stored in directory: /root/.cache/pip/wheels/f3/f3/79/2ea863fed859eb617614dcc0d42619af0f5109f399b678dd5b Successfully built uwsgi Installing collected packages: uwsgi Successfully installed uwsgi-2.0.18 (mycrm) [root@web ~]# #檢查uwsgi版本 (mycrm) [root@web ~]# uwsgi --version 2.0.18 (mycrm) [root@web ~]# #檢查uwsgi python版本 (mycrm) [root@web ~]# uwsgi --python-version 3.7.1
三、測試uwsgi 安裝是否成功
建立test.py文件,啓動uwsgi
(mycrm) [root@web website]# touch test.py (mycrm) [root@web website]# vi test.py # test.py def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"] # python3 #return ["Hello World"] # python2
保存,啓動uwsgi
測試啓動uwsgi,啓動uWSGI服務器:
uwsgi -- http :8000 --wsgi-file test.py
意思是使用8000端口啓動這個文件,效果以下:
[root@web website]# uwsgi --http :8000 --wsgi-file test.py *** Starting uWSGI 2.0.18 (64bit) on [Sun Mar 1 22:43:24 2020] *** compiled with version: 4.8.5 20150623 (Red Hat 4.8.5-39) on 22 February 2020 03:43:05 os: Linux-3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 nodename: web machine: x86_64 clock source: unix pcre jit disabled detected number of CPU cores: 1 current working directory: /opt/website detected binary path: /usr/local/bin/uwsgi uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** *** WARNING: you are running uWSGI without its master process manager *** your processes number limit is 7243 your memory page size is 4096 bytes detected max file descriptor number: 1024 lock engine: pthread robust mutexes thunder lock: disabled (you can enable it with --thunder-lock) uWSGI http bound on :8000 fd 4 spawned uWSGI http 1 (pid: 5077) uwsgi socket 0 bound to TCP address 127.0.0.1:41799 (port auto-assigned) fd 3 uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** Python version: 3.7.1 (default, Feb 15 2020, 22:39:51) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)] *** Python threads support is disabled. You can enable it with --enable-threads *** Python main interpreter initialized at 0x1366700 uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** your server socket listen backlog is limited to 100 connections your mercy for graceful operations on workers is 60 seconds mapped 72920 bytes (71 KB) for 1 cores *** Operational MODE: single process *** WSGI app 0 (mountpoint='') ready in 0 seconds on interpreter 0x1366700 pid: 5076 (default app) uWSGI running as root, you can use --uid/--gid/--chroot options *** WARNING: you are running uWSGI as root !!! (use the --uid flag) *** *** uWSGI is running in multiple interpreter mode *** spawned uWSGI worker 1 (and the only) (pid: 5076, cores: 1) [pid: 5076|app: 0|req: 1/1] 192.168.199.168 () {36 vars in 654 bytes} [Sun Mar 1 22:44:41 2020] GET / => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0) [pid: 5076|app: 0|req: 2/2] 192.168.199.168 () {36 vars in 606 bytes} [Sun Mar 1 22:44:41 2020] GET /favicon.ico => generated 11 bytes in 0 msecs (HTTP/1.1 200) 1 headers in 44 bytes (1 switches on core 0)
訪問 localhost:8000
顯示 hello world
這就說明uWSGI啓動成功了~後續能夠設置uWSGI啓動django了
四、建立uwsgi配置文件
(mycrm) [root@web mycrm]# vi /etc/uwsgi/mycrm_uwsgi.ini [uwsgi] uid = www gid = www http=0.0.0.0:8000 socket = 127.0.0.1:8001 chdir = /opt/website/mycrm/CRM_Project wsgi-file = /opt/website/mycrm/CRM_Project/CRM_Project/wsgi.py stats = 0.0.0.0:9191 master = true vhost = true workers = 2 threads=2 reload-mercy = 10 vacuum = true max-requests = 1000 limit-as = 512 buffer-size = 30000 pidfile = /var/run/uwsgi8000.pid daemonize = /var/log/uwsgi8000.log pythonpath = /root/Envs/mycrm/lib/python3.7/site-packages
保存退出
注意,這裏再也不須要home/virtualenv參數了,否則會出現
Fatal Python error: initfsencoding: Unable to get the locale encoding ModuleNotFoundError: No module named 'encodings'
錯誤
緣由是--home參數,之前uwsgi須要這個參數來指定python環境變量的目錄,如今不須要這個參數
五、安裝django
(mycrm) [root@web mycrm]# pip3 install django==1.11.1 Looking in indexes: https://mirrors.aliyun.com/pypi/simple/ Collecting django==1.11.1 Downloading https://mirrors.aliyun.com/pypi/packages/2b/2c/019d6d5f7ed2889082ed96f849bf462c57265087a3a568a19b0d4c53bc55/Django-1.11.1-py2.py3-none-any.whl (6.9 MB) |███████▊ | 1.7 MB 1.1 MB/s eta 0:00:05 ...
六、啓動uwsgi
(mycrm) [root@web mycrm]# ls /etc/uwsgi/ mycrm_uwsgi.ini uwsgi.ini (mycrm) [root@web mycrm]# uwsgi --ini /etc/uwsgi/mycrm_uwsgi.ini [uWSGI] getting INI configuration from /etc/uwsgi/mycrm_uwsgi.ini
測試uwsgi是否啓動
七、測試uwsgi狀態下的測試頁面
錯誤1
發現session一直出現錯誤
SuspiciousOperation at /login/ The request's session was deleted before the request completed.
修改settings.py,設置session在數據庫讀取
#SESSION存放位置設置 SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認) SESSION_COOKIE_NAME = "crmsessionid"
錯誤2
attempt to write a readonly database
緣由:
sqlite3所在的文件夾沒有讀寫權限,或者權限不足
解決方案
[root@web CRM_Project]# chmod 777 db.sqlite3
錯誤3
unable to open database file
緣由
sqlite庫在對數據庫進行操做時(本人估計是寫操做),會在數據庫的當前文件夾下建立一個臨時文件,當操做結束時,該臨時文件將被刪除。 而遠程用戶通常不具有有對臨時文件足夠的權限 因此會形成 沒法打開、寫或者刪除臨時文件
解決方案
將數據庫所在文件夾設置爲任何用戶都有可讀可寫可刪的權限。
[root@web CRM_Project]# pwd /opt/website/mycrm/CRM_Project [root@web CRM_Project]# chmod -R 777 /opt/website/mycrm/CRM_Project
八、針對Nginx訪問不了Django中的靜態文件作處理,須要作靜態文件收集
因爲項目中有多個app都有static,,項目根目錄沒有static, 處理方式是在項目的settings.py文件裏增長
STATIC_URL = '/static/' STATIC_ROOT= os.path.join(BASE_DIR,'statics/') STATICFILES_DIRS = ( os.path.join(BASE_DIR, "rbac/static/"), os.path.join(BASE_DIR, "stark/static/"), )
在項目根目錄執行
[root@web CRM_Project]# python3 manage.py collectstatic
九、配置nginx配置文件
(mycrm) [root@web conf]# cd /usr/local/nginx/conf (mycrm) [root@web conf]# vi nginx.conf #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { include /usr/local/nginx/conf/uwsgi_params; uwsgi_pass 127.0.0.1:8001; client_max_body_size 35m; } location /static { alias /opt/website/mycrm/CRM_Project/statics; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }
十、啓動uwsgi、啓動nginx
啓動uwsgi
mycrm) [root@web conf]# uwsgi --ini /etc/uwsgi/mycrm_uwsgi.ini [uWSGI] getting INI configuration from /etc/uwsgi/mycrm_uwsgi.ini
啓動nginx
(mycrm) [root@web nginx]# ./sbin/nginx
測試頁面,成功
3、使用supervisor管理
介紹supervisor
用Supervisor管理的進程,當一個進程意外被殺死,supervisort監聽到進程死後,會自動將它從新拉起,很方便的作到進程自動恢復的功能,再也不須要本身寫shell腳原本控制。
- supervisord
運行 Supervisor 時會啓動一個進程 supervisord,它負責啓動所管理的進程,並將所管理的進程做爲本身的子進程來啓動,並且能夠在所管理的進程出現崩潰時自動重啓。
- supervisorctl
是命令行管理工具,能夠用來執行 stop、start、restart 等命令,來對這些子進程進行管理。
supervisor是全部進程的父進程,管理着啓動的子進展,supervisor以子進程的PID來管理子進程,當子進程異常退出時supervisor能夠收到相應的信號量。
安裝supervisor
因爲supervisor在python3下沒法使用,所以只能用python2去下載
#注意此時已經退出虛擬環境了!!!!! [root@web nginx]# yum install supervisor Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile ... [root@web nginx]# easy_install supervisor Searching for supervisor Reading https://pypi.python.org/simple/supervisor/ ... warning: no previously-included files matching '*' found under directory 'docs/.build' Adding supervisor 4.1.0 to easy-install.pth file Installing echo_supervisord_conf script to /usr/bin Installing pidproxy script to /usr/bin Installing supervisorctl script to /usr/bin Installing supervisord script to /usr/bin Installed /usr/lib/python2.7/site-packages/supervisor-4.1.0-py2.7.egg Processing dependencies for supervisor Finished processing dependencies for supervisor [root@web nginx]#
配置Supervisor
經過命令生成配置文件
[root@web local]# mkdir /usr/supervisor [root@web local]# echo_supervisord_conf > /usr/supervisor/supervisord.conf
配置文件詳解
# 指定了socket file的位置 [unix_http_server] file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 會使用 ;chmod=0700 ;socket文件的mode,默認是0700 ;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid #用於啓動一個含有前端的服務,能夠從Web頁面中管理服務。其中,port用於設置訪問地址,username和password用於設置受權認證。 ;[inet_http_server] ;HTTP服務器,提供web管理界面 ;port=127.0.0.1:9001 ;Web管理後臺運行的IP和端口,若是開放到公網,須要注意安全性 ;username=user ;登陸管理後臺的用戶名 ;password=123 ;登陸管理後臺的密碼 # 管理服務自己的配置 [supervisord] logfile=/tmp/supervisord.log ;日誌文件,默認是 $CWD/supervisord.log logfile_maxbytes=50MB ;日誌文件大小,超出會rotate,默認 50MB,若是設成0,表示不限制大小 logfile_backups=10 ;日誌文件保留備份數量默認10,設爲0表示不備份 loglevel=info ;日誌級別,默認info,其它: debug,warn,trace pidfile=/tmp/supervisord.pid ;pid 文件 nodaemon=false ;是否在前臺啓動,默認是false,即以 daemon 的方式啓動 minfds=1024 ;能夠打開的文件描述符的最小值,默認 1024 minprocs=200 ;能夠打開的進程數的最小值,默認 200 [supervisorctl] serverurl=unix:///tmp/supervisor.sock ;經過UNIX socket鏈接supervisord,路徑與unix_http_server部分的file一致 ;serverurl=http://127.0.0.1:9001 ; 經過HTTP的方式鏈接supervisord ; [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信號,包括子進程 # 對事件進行的管理 ;[eventlistener:theeventlistenername] # 對任務組的管理 ,包含其它配置文件 ;[group:thegroupname] ;programs=progname1,progname2 ; each refers to 'x' in [program:x] definitions ;priority=999 ; the relative start priority (default 999) [include] files = supervisord.d/*.ini ;能夠指定一個或多個以.ini結束的配置文件
使用示例:
設置配置文件,經過supervisor管理uwsgi\nginx,使得uwsgi\nginx意外關閉後自動重啓,
在 supervisord.conf末尾添加
[program:uwsgi] command=/root/Envs/mycrm/bin/uwsgi --ini /etc/uwsgi/mycrm_uwsgi.ini autostart=true ; 在supervisord啓動的時候也自動啓動 startsecs=10 ; 啓動10秒後沒有異常退出,就表示進程正常啓動了,默認爲1秒 autorestart=true ;程序退出後自動重啓,可選值:[unexpected,true,false],默認爲unexpected,表示進程意外殺死後才重啓 startretries=3 ; 啓動失敗自動重試次數,默認是3 ; 中止等待時間 stopwaitsecs=0 stopasgroup=true ;因爲uwsgi是多進程的,因此須要設置 killasgroup=true stdout_logfile=/usr/local/uwsgi/log/ss_uwsgi_access.log stderr_logfile=/usr/local/uwsgi/log/ss_uwsgi_error.log [program:nginx] command=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf autostart=true ; 在supervisord啓動的時候也自動啓動 startsecs=10 ; 啓動10秒後沒有異常退出,就表示進程正常啓動了,默認爲1秒 autorestart=true ;程序退出後自動重啓,可選值:[unexpected,true,false],默認爲unexpected,表示進程意外殺死後才重啓 startretries=3 ; 啓動失敗自動重試次數,默認是3 ; 中止等待時間 stopwaitsecs=0 stopasgroup=true ;因爲uwsgi是多進程的,因此須要設置 killasgroup=true stdout_logfile=/usr/local/nginx/logs/ss_nginx_access.log stderr_logfile=/usr/local/nginx/logs/ss_nginx_error.log ;設置一個能夠前端查看的頁面 [inet_http_server] port=192.168.199.169:9001 ;IP按需配置 username=user password=123
啓動supervisor
supervisord -c /usr/supervisor/supervisord.conf
測試
能夠看到supervisor啓動,uwsgi已經啓動,nginx已經啓動
[root@web supervisor]# ps aux |grep super root 7191 0.0 0.5 217676 10416 ? Ss 14:23 0:00 /usr/bin/python /usr/bin/supervisord -c /usr/supervisor/supervisord.conf root 7208 0.0 0.0 112712 964 pts/1 R+ 14:24 0:00 grep --color=auto super [root@web supervisor]# ps aux |grep uwsgi www 7194 0.5 1.4 243528 27272 ? S 14:23 0:00 /root/Envs/mycrm/bin/uwsgi --ini /etc/uwsgi/mycrm_uwsgi.ini www 7195 0.0 1.2 243528 22792 ? S 14:23 0:00 /root/Envs/mycrm/bin/uwsgi --ini /etc/uwsgi/mycrm_uwsgi.ini www 7196 0.0 1.2 243528 22792 ? S 14:23 0:00 /root/Envs/mycrm/bin/uwsgi --ini /etc/uwsgi/mycrm_uwsgi.ini www 7197 0.0 1.1 243528 22308 ? S 14:23 0:00 /root/Envs/mycrm/bin/uwsgi --ini /etc/uwsgi/mycrm_uwsgi.ini root 7210 0.0 0.0 112712 964 pts/1 R+ 14:24 0:00 grep --color=auto uwsgi [root@web supervisor]# ps aux |grep super root 7320 0.1 0.5 219756 10432 ? Ss 14:57 0:00 /usr/bin/python /usr/bin/supervisord -c /usr/supervisor/supervisord.conf root 7341 0.0 0.0 112712 964 pts/1 S+ 14:57 0:00 grep --color=auto super
web頁面查看
supervisor操做方式
supervisor包含兩個東西,一個是服務端(Server),咱們使用的命令是supervisord;一個是客戶端(Client),咱們使用的命令是supervisorctl。服務端面向程序,負責進程的運行,客戶端面向用戶,負責進程的管理。如今咱們要對supervisor進行管理,所以須要用supervisorctl命令,下面是經常使用的命令:
方式一,經過web頁面進行管理
在瀏覽器輸入配置文件設置的ip:port精管理
方式二經過命令進行管理
#查看全部進程的運行狀態 supervisorctl status #查看某一進程的運行狀態 supervisorctl status 進程名 #啓動某一進程 supervisorctl start 進程名 #啓動全部進程 supervisorctl start all #中止某一進程 supervisorctl stop 進程名 #中止全部進程 supervisorctl stop all #重啓某一進程 supervisorctl restart 進程名 #重啓全部進程 supervisorctl restart all #新增進程後,更新進程(不影響其餘進程運行) supervisorctl update #新增進程後,重啓全部進程 supervisorctl reload
錯誤解決
一、uwsgi出現Exited too quickly (process log may have details)
緣由:
supervisor 比較適合監控業務應用,且只能監控前臺程序
解決方案:
以前咱們在uwsgi的配置文件中設置了一個日誌文件保存位置的參數:
daemonize = /home/mysite_uwsgi/mysite.log
可是這個參數的配置與Supervisor的日誌輸出配置是有衝突的,須要註釋掉它,由於在前面加個#
:
nginx出現相同的錯誤方式解決方式
... daemon off; ... events { ... } http { ... }
把配置文件的daemon改成off