部署基於python的web發佈環境(第四篇):環境部署5:centos7發佈網站示例nginx+uWSGI+django+virtualenvwrapper+supervisor發佈web服務器

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

相關文章
相關標籤/搜索