阿里云:nginx+uwsgi+supervisor+flask部署in Ubuntu

(1)查看阿里云服务器环境

ssh root@47.92.xxx.7 你自己的阿里云IP地址
uname -a
Linux adamanter 4.4.0-105-generic #128-Ubuntu SMP Thu Dec 14 12:42:11 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
 
查看Ubuntu版本
sudo lsb_release -a

LSB Version: core-9.20160110ubuntu0.2-amd64:core-9.20160110ubuntu0.2-noarch:security-9.20160110ubuntu0.2-amd64:security-9.20160110ubuntu0.2-noarch
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04

(2)快速安装相应的包

apt-get install nginx
apt-get install uwsgi
apt-get install supervisor 

(3)程序代码复制到服务器并确保确实能运行

我的helloworld案例,GitHub地址: https://github.com/shoneSolomon/helloworld
cd /users/alex/desktop/flask_other
scp -r helloworld root@47.92.xxx.7:/data/www
没有/data/www目录先ssh上去创建 
首先确保你的程序能正常运行 不然uwsgi起不来
比如:python app.py
比如:flask run

(4)测试你nginx安装好没有并且修改配置文件

启动nginx命令:nginx 或者/etc/init.d/nginx start
浏览器打开网址47.92.xxx.7,存在welcome to nginx页面,说明nginx没有问题
 
nginx没问题的话,配置nginx配置文件
cd /etc/nginx
vi nginx.conf 注释以下两句默认配置文件地址的设置

# include /etc/nginx/conf.d/*.conf;
# include /etc/nginx/sites-enabled/*;

然后编辑nginx 配置文件,将server配置到http中,注意我这里用到了uwsgi配置文件的sock名字 

server {
         listen       80;
         server_name  localhost;
         client_max_body_size 2m;

         location /static {
           root /data/www/helloworld;
         }

         location / { try_files $uri @hello; }
         location @hello {
             include uwsgi_params;
             uwsgi_pass unix:/tmp/hello.sock;
         }

  }

nginx -t  测试配置文件有无语法错误

(5)在项目根目录下新建uwsgi配置文件

在/data/www/helloworld目录内,即和app.py平级目录创建hello_uwsgi.ini文件

vi hello_uwsgi.ini

[uwsgi]
socket = /tmp/hello.sock
chdir = /data/www/helloworld
wsgi-file = /data/www/helloworld/app.py
callable=application
touch-reload=/data/www/helloworld
logto = /var/log/uwsgi/helloworld.log
enable-threads = true
buffer-size = 32768
processes = 4
threads = 2
pidfile = /tmp/uwsgi.pid
vacuum = true
log-maxsize = 50000000
python-autoreload=1
listen = 1024
lazy-apps

vi  /etc/sysctl.conf 在最后加上这句设置并发数1024
net.core.somaxconn = 1024 
如果不配somaxconn和listen,容易导致uWSGI listen queue 队列溢出问题。

(6)配置supervisor

cd /etc/supervisor/conf.d

vi hello.conf

[program:hello]
command = /usr/local/bin/uwsgi --ini /data/www/helloworld/hello_uwsgi.ini
autostart=true
autorestart=true
stdout_logfile=/var/log/uwsgi/super_hello.log
stderr_logfile=/var/log/uwsgi/super_hello_err.log

cd /etc/supervisor
vi supervisor.conf 确保以下在配置文件中没有被注释
[include]
files = /etc/supervisor/conf.d/*.conf 

(7)整体运行流程

以上过程完成了flask代码上传,nginx,uwsgi,supervisor的配置文件的修改,接下来整体运行流程

1.测试程序是否正常。flask run首先确定你的程序在Linux跑正常,运行正常就关掉

2.启动uwsgi。

  启动uwsgi的http方式:uwsgi --http :5000 --wsgi-file app.py --master --processes 4 --threads 2 可以直接使用uwsgi+flask,不使用nginx简单部署。

  执行它后,uWSGI将启动4个应用进程,每个进程有2个线程,和一个master主进程用于监控其他进程状态,如果有进程死了,则重启。

  我们使用了nginx,所以要用sock方式启动。

  启动uwsgi的sock方式有两种,但ctrl+c或者ssh退出,uwsgi进程就终止,.sock文件就会消失,这时访问网站 Nginx 就会报错502,所以使用supervisor。

  (1) /usr/local/bin/uwsgi --ini /data/www/helloworld/hello_uwsgi.ini

  (2) uwsgi -s /tmp/probase.sock --manage-script-name --mount /=app:application

  uwsgi 启动以后,ps aux | grep uwsgi 查看是否确实已经启动

3.启动supervisor。

  确保uwsgi已经启动。

  cd /etc/supervisor 然后:supervisord 

  supervisord 就已经开始守护uwsgi进程,此时ctrl+c或者ssh,uwsgi的进程也是存在的。

  (1)对于整个supervisor服务:

  cd /etc/supervisor

  重新 read 配置文件: supervisorctl reread
  重启服务: supervisorctl reload
  关闭服务: supervisorctl shutdown
  更新服务:supervisorctl update

  (2)对于我们单个flask程序:

  cd /etc/supervisor

  查看hello的状态:supervisorctl status
  启动hello守护uwsgi进程:supervisorctl start hello
  关闭hello守护uwsgi进程:supervisorctl stop hello

4.启动nginx。

  启动:nginx 或者/etc/init.d/nginx start

  或者已经启动的话根据配置文件重新加载:nginx -s reload 。

  停止:/etc/init.d/nginx stop

5.打开你浏览器访问阿里云IP地址。

  正常就可看到helloworld。

  一般网关错误502就是uwsgi没起来。

 

(8)程序更新

更新的时候配置完毕uwsgi和super和nginx以后
停掉以前的hello,杀死以前uwsgi进程
supervisorctl stop hello
killall uwsgi
ps aux | grep uwsgi
 
然后启动uwsgi
/usr/local/bin/uwsgi --ini /data/www/helloworld/hello_uwsgi.ini
supervisor reload
ps aux | grep uwsgi
查看uwsgi 的守护进程确实已经起来之后
ctrl+c终止上面的uwsgi命令,发现网页正常访问那就可以了 

(9) 错误以及排错日志

有时候排错都没有报错,但是uwsgi或者supervisor起不来的时候,重启阿里云服务器就突然好了。

nginx日志以及错误日志:

cd /var/log/nginx; cat access.log; cat error.log;

uwsgi日志以及错误日志:

cd /var/log/uwsgi; cat xxx.log; cat xxx_error.log;

supervisor日志以及错误日志:

cd /var/log/supervisor; cat supervisor.log; cat supervisor_error.log;

 
 
posted @ 2018-05-26 14:39  Adamanter  阅读(336)  评论(0编辑  收藏  举报