[环境] :centos+supervisor+gunicorn+flask
在 /www/blog 目录下,运行是正常的
/www/blog/venv/bin/gunicorn -b 0.0.0.0:5000 -w 4 microblog:app
[状态] :添加到 supervisor 配置中却一直重复在 running
$ supervisorctl status
microblog RUNNING pid 12499, uptime 0:00:02
[配置] 如下:
[supervisord]
http_port=/var/tmp/supervisor.sock ; (default is to run a UNIX domain socket server)
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (logging level;default info; others: debug,warn)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
[supervisorctl]
serverurl=unix:///var/tmp/supervisor.sock ; use a unix:// URL for a unix socket
[program:microblog]
command=/www/blog/venv/bin/gunicorn -b 0.0.0.0:5000 -w 4 microblog:app
directory=/www/blog
user=root
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
1
ericls 2018-06-28 03:33:09 +08:00 1
log?
|
2
defunct9 2018-06-28 04:55:18 +08:00 via iPad 3
开 ssh,让我上去看看
|
3
0xABCD 2018-06-28 08:01:10 +08:00 via Android 1
日志贴出来
|
4
knktc 2018-06-28 08:07:01 +08:00 via iPhone 1
不是和 venv 有关系?
|
5
yylucifer 2018-06-28 09:14:33 +08:00 1
没 log 我只能等 dalao 来 review 你的配置了..
|
6
summerwar 2018-06-28 09:20:19 +08:00 1
话说 running 不是运行中的意思吗?是网站打不开还是
|
7
tempdban 2018-06-28 10:36:54 +08:00 via Android 1
兄弟你用了 venv 你环境变量却没设置啊
|
8
robinlovemaggie 2018-06-28 11:29:00 +08:00 1
不用用 root 去跑非系统程序,不用用 root 去跑非系统程序,不用用 root 去跑非系统程序……
ps: supervisor 官网文档了解一下? |
9
bolide2005 2018-06-28 11:30:31 +08:00 1
running 有啥问题啊…… running 是正常运行中
|
10
Pooc OP @ericls @0xABCD @yylucifer /var/tmp 下的日志是空的。。。
@defunct9 小哥,怎么联系。。。 @knktc @tempdban 我也觉得是很 venv 有关系,但是我添加了环境变量了,在 venv 在没有进入 venv 的情况下能正常使用。。。在 venv/bin/activate 跟 /etc/profile 都添加了 export FLASK_APP=microblog.py 会不会是这个有误? @summerwar @bolide2005 running 几秒钟就重复 start,running,block。。。 |
11
Pooc OP @robinlovemaggie 是的,老哥,的确是不要在 root 下跑非系统程序。。。
|
12
knktc 2018-06-29 17:42:02 +08:00 1
@Pooc 这个其实不会执行 active 脚本的,所以我感觉修改 active 脚本没有用处的。
我感觉不行就是得给 supervisor 的 program 配置中加入 environment=PATH="/www/blog/venv/bin" 这样环境配置试试 |
13
tempdban 2018-06-29 17:47:52 +08:00 via Android 1
program: microblog
里面可以加环境变量 加的是 VIRTUAL_ENV 你仔细看看 venv/bin/activate 都干了啥 |
14
tempdban 2018-06-29 17:49:01 +08:00 via Android 1
所有的 Python venv 方案都要改 VIRTUAL_ENV 环境变量
|
15
Pooc OP @ericls @0xABCD @yylucifer
日志找到了。。。原来我看错了,是在 logfile=/var/log/supervisor/supervisord.log ``` 2018-06-29 17:07:08,984 CRIT Running without any HTTP authentication checking 2018-06-29 17:07:08,989 INFO daemonizing the process 2018-06-29 17:07:08,991 INFO supervisord started with pid 5375 2018-06-29 17:07:08,995 INFO spawned: 'microblog' with pid 5376 2018-06-29 17:07:09,866 INFO exited: microblog (exit status 3; not expected) 2018-06-29 17:07:09,867 INFO received SIGCLD indicating a child quit 2018-06-29 17:07:10,870 INFO spawned: 'microblog' with pid 5382 2018-06-29 17:07:11,864 INFO exited: microblog (exit status 3; not expected) 2018-06-29 17:07:11,865 INFO received SIGCLD indicating a child quit 2018-06-29 17:07:13,871 INFO spawned: 'microblog' with pid 5389 2018-06-29 17:07:14,576 INFO exited: microblog (exit status 1; not expected) 2018-06-29 17:07:14,576 INFO received SIGCLD indicating a child quit 2018-06-29 17:07:17,581 INFO spawned: 'microblog' with pid 5396 2018-06-29 17:07:18,413 INFO exited: microblog (exit status 1; not expected) 2018-06-29 17:07:18,413 INFO received SIGCLD indicating a child quit 2018-06-29 17:07:19,414 INFO gave up: microblog entered FATAL state, too many start retries too quickly 2018-06-29 17:33:58,601 CRIT Supervisor running as root (no user in config file) 2018-06-29 17:33:58,635 INFO localhost:0 - - [29/Jun/2018:09:33:58 +0800] "GET / HTTP/1.0" 200 2204 2018-06-29 17:35:16,200 CRIT Supervisor running as root (no user in config file) 2018-06-29 17:35:16,232 INFO localhost:0 - - [29/Jun/2018:09:35:16 +0800] "GET / HTTP/1.0" 200 2204 2018-06-29 17:37:37,650 CRIT received SIGTERM indicating exit request 2018-06-29 17:37:58,299 CRIT Supervisor running as root (no user in config file) 2018-06-29 17:37:58,311 INFO /var/tmp/supervisor.sock:Medusa (V1.1.1.1) started at Fri Jun 29 17:37:58 2018 Hostname: <unix domain socket> Port:/var/tmp/supervisor.sock 2018-06-29 17:37:58,363 CRIT Running without any HTTP authentication checking 2018-06-29 17:37:58,365 INFO daemonizing the process 2018-06-29 17:37:58,366 INFO supervisord started with pid 5702 2018-06-29 17:37:58,368 INFO spawned: 'microblog' with pid 5703 2018-06-29 17:37:58,851 INFO exited: microblog (exit status 3; not expected) 2018-06-29 17:37:58,852 INFO received SIGCLD indicating a child quit 2018-06-29 17:37:59,855 INFO spawned: 'microblog' with pid 5707 2018-06-29 17:38:00,681 INFO exited: microblog (exit status 3; not expected) 2018-06-29 17:38:00,682 INFO received SIGCLD indicating a child quit 2018-06-29 17:38:02,687 INFO spawned: 'microblog' with pid 5713 2018-06-29 17:38:03,381 INFO exited: microblog (exit status 3; not expected) 2018-06-29 17:38:03,381 INFO received SIGCLD indicating a child quit 2018-06-29 17:38:06,386 INFO spawned: 'microblog' with pid 5720 2018-06-29 17:38:07,114 INFO exited: microblog (exit status 1; not expected) 2018-06-29 17:38:07,114 INFO received SIGCLD indicating a child quit 2018-06-29 17:38:08,115 INFO gave up: microblog entered FATAL state, too many start retries too quickly 2018-06-29 17:38:53,721 INFO localhost:0 - - [29/Jun/2018:09:38:53 +0800] "POST /RPC2 HTTP/1.0" 200 254 2018-06-29 17:38:53,724 INFO localhost:0 - - [29/Jun/2018:09:38:53 +0800] "POST /RPC2 HTTP/1.0" 200 1242 2018-06-29 17:38:56,321 INFO localhost:0 - - [29/Jun/2018:09:38:56 +0800] "POST /RPC2 HTTP/1.0" 200 254 2018-06-29 17:38:56,325 INFO localhost:0 - - [29/Jun/2018:09:38:56 +0800] "POST /RPC2 HTTP/1.0" 200 1242 2018-06-29 17:39:00,612 INFO localhost:0 - - [29/Jun/2018:09:39:00 +0800] "POST /RPC2 HTTP/1.0" 200 254 2018-06-29 17:39:00,614 INFO localhost:0 - - [29/Jun/2018:09:39:00 +0800] "POST /RPC2 HTTP/1.0" 200 1242 2018-06-29 17:45:58,505 INFO localhost:0 - - [29/Jun/2018:09:45:58 +0800] "POST /RPC2 HTTP/1.0" 200 254 2018-06-29 17:45:58,509 INFO localhost:0 - - [29/Jun/2018:09:45:58 +0800] "POST /RPC2 HTTP/1.0" 200 1242 ``` |
16
defunct9 2018-06-29 18:08:14 +08:00 via iPhone 1
微信:defunct
|
17
robinlovemaggie 2018-06-29 23:19:42 +08:00 1
用 pyenv 隔离一套 python 环境,保证 python,venv,程序目录和 supervisor 在同一用户下,这是算是最理想的部署环境。
|
18
defunct9 2018-07-01 21:35:48 +08:00 via iPhone 1
搞定,mark 一下,走人。
|
19
Pooc OP @defunct9 多谢老哥帮助!!!
其实是跟 @robinlovemaggie 老哥你的想法一致,也跟上面的各位 dalao 想法一致的。 我把 @defunct9 老哥解决方法说一下,以便后面的同学能及时处理这个问题。 @defunct9 原话: 原因是 venv 跟 gunicorn 必须是同一个 shell 引导,否则无法继承环境变量。 解决方法: ``` # cat /etc/supervisord.conf [supervisord] http_port=/var/tmp/supervisor.sock ; (default is to run a UNIX domain socket server) logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (logging level;default info; others: debug,warn) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=false ; (start in foreground if true;default false) minfds=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) [supervisorctl] serverurl=unix:///var/tmp/supervisor.sock ; use a unix:// URL for a unix socket [program:microblog] command=/www/blog/venv/bin/gunicorn_start directory=/www/blog user=root autostart=true autorestart=true stopasgroup=true killasgrouv=true stdout_logfile=/www/blog/logs/microblog.log redirect_stderr=true # cat /www/blog/venv/bin/gunicorn_start #!/bin/sh export FLASK_APP=microblog.py cd /www/blog/ source venv/bin/activate /www/blog/venv/bin/gunicorn -b localhost:3000 -w 4 microblog:app ``` 直接通过一个 sh 脚本处理同一个 shell 引导, 这个时候由 gunicorn 启动的 microblog 应用服务器现在运行在本地端口 3000, 然后我再设置一下 Nginx 就可以将应用程序暴露给外部世界。 |