[求助] flask 部署, supervisor 配置出现问题,不能正常运行,需要 dalao 们指点迷津,谢谢!

2018-06-28 03:22:36 +08:00
 Pooc

[环境] :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
5665 次点击
所在节点    Python
19 条回复
ericls
2018-06-28 03:33:09 +08:00
log?
defunct9
2018-06-28 04:55:18 +08:00
开 ssh,让我上去看看
0xABCD
2018-06-28 08:01:10 +08:00
日志贴出来
knktc
2018-06-28 08:07:01 +08:00
不是和 venv 有关系?
yylucifer
2018-06-28 09:14:33 +08:00
没 log 我只能等 dalao 来 review 你的配置了..
summerwar
2018-06-28 09:20:19 +08:00
话说 running 不是运行中的意思吗?是网站打不开还是
tempdban
2018-06-28 10:36:54 +08:00
兄弟你用了 venv 你环境变量却没设置啊
robinlovemaggie
2018-06-28 11:29:00 +08:00
不用用 root 去跑非系统程序,不用用 root 去跑非系统程序,不用用 root 去跑非系统程序……
ps: supervisor 官网文档了解一下?
bolide2005
2018-06-28 11:30:31 +08:00
running 有啥问题啊…… running 是正常运行中
Pooc
2018-06-29 17:20:33 +08:00
@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。。。
Pooc
2018-06-29 17:22:48 +08:00
@robinlovemaggie 是的,老哥,的确是不要在 root 下跑非系统程序。。。
knktc
2018-06-29 17:42:02 +08:00
@Pooc 这个其实不会执行 active 脚本的,所以我感觉修改 active 脚本没有用处的。
我感觉不行就是得给 supervisor 的 program 配置中加入 environment=PATH="/www/blog/venv/bin" 这样环境配置试试
tempdban
2018-06-29 17:47:52 +08:00
program: microblog
里面可以加环境变量
加的是 VIRTUAL_ENV
你仔细看看 venv/bin/activate
都干了啥
tempdban
2018-06-29 17:49:01 +08:00
所有的 Python venv 方案都要改 VIRTUAL_ENV 环境变量
Pooc
2018-06-29 17:49:31 +08:00
@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

```
defunct9
2018-06-29 18:08:14 +08:00
微信:defunct
robinlovemaggie
2018-06-29 23:19:42 +08:00
用 pyenv 隔离一套 python 环境,保证 python,venv,程序目录和 supervisor 在同一用户下,这是算是最理想的部署环境。
defunct9
2018-07-01 21:35:48 +08:00
搞定,mark 一下,走人。
Pooc
2018-07-02 18:06:32 +08:00
@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 就可以将应用程序暴露给外部世界。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/466429

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX