折腾:
【已解决】把Python3的pipenv的Flask部署到CentOS服务器上
期间,已经本地用gunicorn去运行了flask的app。
接着需要去用supervisor去管理进程。
刚参考:
发现:
“之前使用python3的使用,发现 supervisor是不支持。所以就不打算用supervisor了。”
去搜索看
flask supervisor
flask supervisor python3
supervisor python3
使用supervisor支持Python3程序 | 不正经数据科学家
“Supervisor is a client/server system that allows its users to control a number of processes on UNIX-like operating systems.
Supervisor has been tested and is known to run on Linux (Ubuntu), Mac OS X (10.4, 10.5, 10.6), and Solaris (10 for Intel) and FreeBSD 6.1. It will likely work fine on most UNIX systems.
Supervisor will not run at all under any version of Windows.
Supervisor is known to work with Python 2.4 or later but will not work under any version of Python 3.”
不支持Windows
不支持Python 3,只支持 Python 2.4+
关于python3.x上supervisor安装问题? – 知乎
Supervisor/supervisor: Supervisor process control system for UNIX
“Supervisor 4.0 (unreleased) is designed to work under Python 3 version 3.4 or later and on Python 2 version 2.7.”
但是Latest的最新版本:
还是不支持Python3
supervisor 在python3下的简易解决方案 – CSDN博客
此处pipenv中python3去安装supervisor果然找不到:
<code>➜ robotDemo which python /Users/crifan/.local/share/virtualenvs/robotDemo-HXjMJQEQ/bin/python ➜ robotDemo python --version Python 3.6.4 ➜ robotDemo pipenv install surpervisor Installing surpervisor… Collecting surpervisor Error: An error occurred while installing surpervisor! Could not find a version that satisfies the requirement surpervisor (from versions: ) No matching distribution found for surpervisor </code>
继续用pip试试,也不行:
<code>➜ robotDemo which pip pip: aliased to noglob pip ➜ robotDemo which pip3 /Users/crifan/.local/share/virtualenvs/robotDemo-HXjMJQEQ/bin/pip3 ➜ robotDemo pip3 --version pip 10.0.0 from /Users/crifan/.local/share/virtualenvs/robotDemo-HXjMJQEQ/lib/python3.6/site-packages/pip (python 3.6) ➜ robotDemo pip3 install supervisor Collecting supervisor Downloading https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz (419kB) 100% |████████████████████████████████| 419kB 772kB/s Complete output from command python setup.py egg_info: Supervisor requires Python 2.4 or later but does not work on any version of Python 3. You are using version 3.6.4 (default, Mar 22 2018, 13:54:22) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)]. Please install using a supported version. ---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/46/2hjxz38n22n3ypp_5f6_p__00000gn/T/pip-install-3zz2e51v/supervisor/ </code>
然后虽然已退出pipenv了,而且本地Mac系统中python是2的,但是由于之前pip被强制重新安装未为pip3的了,导致安装也失败:
<code>➜ robotDemo exit ➜ robotDemo which python /usr/bin/python ➜ robotDemo python --version Python 2.7.10 ➜ robotDemo pip install supervisor Collecting supervisor Using cached https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz Complete output from command python setup.py egg_info: Supervisor requires Python 2.4 or later but does not work on any version of Python 3. You are using version 3.6.4 (default, Mar 22 2018, 13:54:22) [GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)]. Please install using a supported version. ---------------------------------------- Command "python setup.py egg_info" failed with error code 1 in /private/var/folders/46/2hjxz38n22n3ypp_5f6_p__00000gn/T/pip-install-3woroxix/supervisor/ ➜ robotDemo which pip pip: aliased to noglob pip ➜ robotDemo where pip pip: aliased to noglob pip /usr/local/bin/pip ➜ robotDemo pip --version pip 10.0.0 from /usr/local/lib/python3.6/site-packages/pip (python 3.6) </code>
所以此处好像需要去:
【已解决】Mac中把Python3的pip重新换成Python2的pip
然后再去用python2的pip去安装supervisor
<code>➜ robotDemo pip install supervisor Collecting supervisor Using cached https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz Collecting meld3>=0.6.5 (from supervisor) Downloading https://files.pythonhosted.org/packages/b6/ae/e6d731e4b9661642c1b20591d8054855bb5b8281cbfa18f561c2edd783f7/meld3-1.0.2-py2.py3-none-any.whl Building wheels for collected packages: supervisor Running setup.py bdist_wheel for supervisor ... done Stored in directory: /Users/crifan/Library/Caches/pip/wheels/05/9f/2f/49c4d02a06ef353b5647ddc018f971a44809fe65c772d95511 Successfully built supervisor pipenv 11.10.0 requires certifi, which is not installed. pipenv 11.10.0 requires requests[security], which is not installed. pipenv 11.10.0 requires virtualenv, which is not installed. matplotlib 1.3.1 requires nose, which is not installed. matplotlib 1.3.1 requires tornado, which is not installed. Installing collected packages: meld3, supervisor Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/meld3-1.0.2.dist-info' Consider using the `--user` option or check the permissions. ➜ robotDemo ll /Library/Python/2.7/site-packagesme/ ➜ robotDemo ll /Library/Python/2.7/site-packages/meld3-1.0.2.dist-info ls: /Library/Python/2.7/site-packages/meld3-1.0.2.dist-info: No such file or directory ➜ robotDemo ➜ robotDemo ls -lha /Library/Python/2.7/site-packages total 0 drwxr-xr-x 4 root wheel 128B 10 26 00:34 . drwxr-xr-x 3 root wheel 96B 9 12 2017 .. -rwxr-xr-x 1 root wheel 157B 7 16 2017 Extras.pth -rw-r--r-- 1 root wheel 119B 7 16 2017 README ➜ robotDemo ➜ robotDemo ➜ robotDemo pip install supervisor --user Collecting supervisor Collecting meld3>=0.6.5 (from supervisor) Using cached https://files.pythonhosted.org/packages/b6/ae/e6d731e4b9661642c1b20591d8054855bb5b8281cbfa18f561c2edd783f7/meld3-1.0.2-py2.py3-none-any.whl pipenv 11.10.0 requires certifi, which is not installed. pipenv 11.10.0 requires requests[security], which is not installed. pipenv 11.10.0 requires virtualenv, which is not installed. matplotlib 1.3.1 requires nose, which is not installed. matplotlib 1.3.1 requires tornado, which is not installed. Installing collected packages: meld3, supervisor The scripts echo_supervisord_conf, pidproxy, supervisorctl and supervisord are installed in '/Users/crifan/Library/Python/2.7/bin' which is not on PATH. Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location. Successfully installed meld3-1.0.2 supervisor-3.3.4 ➜ robotDemo </code>
搜:
echo_supervisord_conf
另外看到:
<code>➜ robotDemo ll /Users/crifan/Library/Python/2.7/bin total 80 -rwxr-xr-x 1 crifan staff 253B 4 17 10:19 easy_install -rwxr-xr-x 1 crifan staff 253B 4 17 10:19 easy_install-2.7 -rwxr-xr-x 1 crifan staff 221B 4 20 16:13 echo_supervisord_conf -rwxr-xr-x 1 crifan staff 221B 4 20 16:13 pidproxy -rwxr-xr-x 1 crifan staff 215B 4 20 15:50 pip -rwxr-xr-x 1 crifan staff 215B 4 20 15:50 pip2 -rwxr-xr-x 1 crifan staff 215B 4 20 15:50 pip2.7 -rwxr-xr-x 1 crifan staff 226B 4 20 16:13 supervisorctl -rwxr-xr-x 1 crifan staff 224B 4 20 16:13 supervisord -rwxr-xr-x 1 crifan staff 212B 4 20 15:26 wheel </code>
所以还是要去把:
/Users/crifan/Library/Python/2.7/bin
加到PATH中。
<code>➜ robotDemo ll /Users/crifan/Library/Python/2.7/bin total 80 -rwxr-xr-x 1 crifan staff 253B 4 17 10:19 easy_install -rwxr-xr-x 1 crifan staff 253B 4 17 10:19 easy_install-2.7 -rwxr-xr-x 1 crifan staff 221B 4 20 16:13 echo_supervisord_conf -rwxr-xr-x 1 crifan staff 221B 4 20 16:13 pidproxy -rwxr-xr-x 1 crifan staff 215B 4 20 15:50 pip -rwxr-xr-x 1 crifan staff 215B 4 20 15:50 pip2 -rwxr-xr-x 1 crifan staff 215B 4 20 15:50 pip2.7 -rwxr-xr-x 1 crifan staff 226B 4 20 16:13 supervisorctl -rwxr-xr-x 1 crifan staff 224B 4 20 16:13 supervisord -rwxr-xr-x 1 crifan staff 212B 4 20 15:26 wheel ➜ robotDemo ll /Users/crifan/Library/Python/3.6/bin total 40 -rwxr-xr-x 1 crifan staff 242B 4 17 14:35 pewtwo -rwxr-xr-x 1 crifan staff 226B 4 17 14:35 pipenv -rwxr-xr-x 1 crifan staff 237B 4 17 14:35 pipenv-resolver -rwxr-xr-x 1 crifan staff 232B 4 17 11:06 virtualenv -rwxr-xr-x 1 crifan staff 237B 4 17 11:06 virtualenv-clone ➜ robotDemo vi ~/.bashrc ➜ robotDemo cat ~/.bashrc export NVM_DIR="/Users/crifan/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm export PATH="/Users/crifan/Library/Python/2.7/bin:/Users/crifan/Library/Python/3.6/bin:$PATH" ➜ robotDemo source ~/.bashrc ➜ robotDemo echo $PATH /Users/crifan/Library/Python/2.7/bin:/Users/crifan/Library/Python/3.6/bin:/Users/crifan/.nvm/versions/node/v5.4.1/bin:/Users/crifan/Library/Python/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin ➜ robotDemo which python /usr/bin/python </code>
使用supervisor支持Python3程序 | 不正经数据科学家
然后去试试:
<code>➜ robotDemo echo_supervisord_conf > /etc/supervisor/supervisord.conf zsh: no such file or directory: /etc/supervisor/supervisord.conf ➜ robotDemo echo_supervisord_conf > /etc/supervisord.conf zsh: permission denied: /etc/supervisord.conf </code>
参考:
Installing — Supervisor 3.3.4 documentation
去保存到项目本地:
<code>➜ robotDemo echo_supervisord_conf > supervisord.conf </code>
看看内容:
然后去配置
Running Supervisor — Supervisor 3.3.4 documentation
Python Web 部署: 使用 flask + gunicorn + supervisor… – 简书
然后再去命令行运行,竟然没有任何输出:
<code>➜ robotDemo supervisord -c supervisord.conf </code>
但却发现奇怪的事情:
【未解决】supervisord的普通stdout的log却输出到表示错误的stderr的log中
不过,接口倒是正常工作了好像:
Chrome浏览器去直接访问了,有返回json:
对应的supervisord的log是:
而gunicorn的log是:
再去试试正常访问:
log:
logs/gunicorn_access.log:
logs/gunicorn_error.log:
没有变化 -》 只是在启动时才有输出log
而此处的,之所以可以让
本身不支持Python3的,当然用python2(的pip安装)的supervisor,能够正常运行Python3的pipenv虚拟环境中的gunicorn和Flask的关键一步是:
参考了
Ubuntu部署python3-flask-nginx-uwsgi-supervisor完美-joker-51CTO博客
的
<code>[program:python] command=/root/.virtualenvs/py3-zqcms/bin/uwsgi --uid www --gid www --ini /www/wwwroot/uwsgi.ini </code>
和:
flask + nginx + uwsgi + python3 + supervisor做flask的nginx代理 | 禹都一只猫
<code>[program:flask] command=/root/.virtualenvs/py3_flask/bin/uwsgi /root/flask/hello.ini </code>
中的command中,要运行的uwsgi是虚拟环境中的程序
-》uwsgi换成此处我用的gunicorn(或者是虚拟环境中的python3),才能正常运行虚拟环境中的Python3的程序(Flask)
然后去试试supervisorctl命令行管理app
<code>➜ robotDemo supervisorctl status all myapp RUNNING pid 10323, uptime 0:36:26 ➜ robotDemo supervisorctl stop all myapp: stopped ➜ robotDemo supervisorctl status all myapp STOPPED Apr 20 05:50 PM ➜ robotDemo supervisorctl start all myapp: started ➜ robotDemo supervisorctl status all myapp RUNNING pid 10794, uptime 0:00:07 ➜ robotDemo supervisorctl stop all myapp: stopped ➜ robotDemo supervisorctl start all myapp: started ➜ robotDemo supervisorctl stop all myapp: stopped ➜ robotDemo supervisorctl start all myapp: started ➜ robotDemo supervisorctl stop all myapp: stopped </code>
在把默认的app的名字:myapp改为:robotDemo
后,再去试试reload:
<code>➜ robotDemo supervisorctl reload all Error: reload accepts no arguments reload Restart the remote supervisord. ➜ robotDemo supervisorctl reload Restarted supervisord ➜ robotDemo supervisorctl stop all robotDemo: stopped ➜ robotDemo supervisorctl start all robotDemo: started ➜ robotDemo supervisorctl status all robotDemo RUNNING pid 10912, uptime 0:00:00 ➜ robotDemo </code>
抽空再去试试:
用supervidord管理运行的gunicorn的reload是否有效:故意改动代码,看看能否自动重启gunicorn
-》是可以的
-〉改了代码后,新请求的接口就是最新的代码返回的结果了:
且之前的gunicorn的reload也检测到文件改动了:
然后以及:
在request的代码中,写错语法,然后去测试接口,导致server 500内部出错 -》 看看 supervisor(或gunicorn)是否可以自动 autorestart
故意改错代码:
然后去访问对应接口,使得出现:
{“message”: “Internal Server Error”}
内部log也显示代码出错了:
然后是:
内部应该是重启了?
总之是可以正常访问其他接口的:
【总结】
此处用supervisor去管理gunicorn的话,本来很简单。
但是考虑到此处是Python3的Flask,所以要有些特殊的注意事项:
supervisord.conf
配置文件中的:
command中的gunicorn,要是虚拟环境中的(带绝对路径)gunicorn
完整的supervisord.conf配置如下:
<code>[unix_http_server] ;file=/tmp/supervisor.sock ; the path to the socket file file=/var/run/supervisor.sock ; the path to the socket file chmod=0766 ; socket file mode (default 0700) ;chown=nobody:nogroup ; socket file uid:gid owner ;username=user ; default is no username (open server) ;password=123 ; default is no password (open server) ;[inet_http_server] ; inet (TCP) server disabled by default ;port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface ;username=user ; default is no username (open server) ;password=123 ; default is no password (open server) [supervisord] ;logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log ;logfile=/var/run/supervisord.log ; main log file; default $CWD/supervisord.log logfile=/Users/crifan/dev/dev_root/company/naturling/projects/robotDemo/logs/supervisord.log ;logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB logfile_maxbytes=2MB ; max main logfile bytes b4 rotation; default 50MB logfile_backups=10 ; # of main logfile backups; 0 means none, default 10 ;loglevel=info ; log level; default info; others: debug,warn,trace loglevel=debug ; log level; default info; others: debug,warn,trace ;pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid 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 ;umask=022 ; process file creation umask; default 022 ;user=chrism ; default is current user, required if root ;identifier=supervisor ; supervisord identifier, default is 'supervisor' ;directory=/tmp ; default is not to cd during start ;nocleanup=true ; don't clean up tempfiles at start; default false ;childlogdir=/tmp ; 'AUTO' child log dir, default $TEMP ;environment=KEY="value" ; key value pairs to add to environment ;strip_ansi=false ; strip ansi escape codes in logs; def. false [supervisorctl] ;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket ;username=chris ; should be same as in [*_http_server] if set ;password=123 ; should be same as in [*_http_server] if set ;prompt=mysupervisor ; cmd line prompt (default "supervisor") ;history_file=~/.sc_history ; use readline history if available [program:robotDemo] command=/Users/crifan/.local/share/virtualenvs/robotDemo-HXjMJQEQ/bin/gunicorn -c gunicorn_config.py app:app ;user=root directory=/Users/crifan/dev/dev_root/company/naturling/projects/robotDemo startsecs=0 stopwaitsecs=0 autostart=true autorestart=true stdout_logfile=/Users/crifan/dev/dev_root/company/naturling/projects/robotDemo/logs/supervisord_out.log stdout_logfile_maxbytes=2MB stdout_logfile_backups=10 stderr_logfile=/Users/crifan/dev/dev_root/company/naturling/projects/robotDemo/logs/supervisord_err.log stderr_logfile_maxbytes=2MB stderr_logfile_backups=10 </code>
注意:
在你的:
[program:robotDemo]
之前,默认配置中已有了:
[supervisord]
[supervisorctl]
不要自己再(像我之前不知道)在配置文件最后单独去加了:
[supervisord]
和
[supervisorctl]
了。
应该基于上面的配置去修改才对。
之后即可去运行和管理了:
<code>➜ robotDemo supervisorctl reoad ➜ robotDemo supervisorctl status all ➜ robotDemo supervisorctl stop all ➜ robotDemo supervisorctl start all ➜ robotDemo supervisorctl restart all </code>