[关闭]
@gzm1997 2018-06-08T16:14:47.000000Z 字数 4632 阅读 1192

nginx+supervisor部署aiohttp

deploy ubuntu


前言

服务器上的部署问题一直很让我头疼 因为我一直是一个在windows平台上开发的 但是vps一直都是选择ubuntu16.04居多 因为在windos系统上 权限是一个总是不是被注意的事情 但是在ubuntu系统上部署web后端的时候 权限问题尤为重要


部署

为什么选择nginx+supervisor这样的组合来部署 因为

优点

缺点

参考链接

由于选择使用nginx+superviosr的组合方式部署aiohttp 所以要先下载nginx和supervisor 这个没什么问题 自行谷歌即可 但是要注意点

因为aiohttp是只可以支持python3.5.3+的 但是好巧不巧ubuntu16.04的自带python版本是python3.5.2 这下有点蛋疼 我给的建议是保留python3.5 另外安装python3.6

因为ubuntu系统以及很多像sublime等软件都是依赖py2或者py3.5的 一旦卸载或者修改了/use/bin/python的链接
会导致一系列版本不兼容的问题 我试过最严重的是卸载了python3.5 并且修改默认python版本为3.6 系统崩溃
折腾了很久最后只能重装系统

为什么我要说这个呢 因为supervisor依赖于ubuntu的py2的
所以最好不要卸载任何版本python和修改系统默认的python版本 最好就另行安装python3.6 终端中使用python3.6调用即可

项目代码放置于/var/www/aio_ooad下
image_1cff1giub10gmo07k6b16gjv339.png-71.6kB


nginx配置

/etc/nginx/nginx.conf

  1. http {
  2. server {
  3. listen 80;
  4. client_max_body_size 4G;
  5. server_name localhost;
  6. location / {
  7. proxy_set_header Host $http_host;
  8. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  9. proxy_redirect off;
  10. proxy_buffering off;
  11. proxy_pass http://aiohttp;
  12. }
  13. location /static {
  14. # path for static files
  15. root /var/www/aio_ooad/static;
  16. }
  17. }
  18. upstream aiohttp {
  19. # fail_timeout=0 means we always retry an upstream even if it failed
  20. # to return a good HTTP response
  21. # Unix domain servers
  22. server unix:/var/www/aio_ooad/example_1.sock fail_timeout=0;
  23. server unix:/var/www/aio_ooad/example_2.sock fail_timeout=0;
  24. server unix:/var/www/aio_ooad/example_3.sock fail_timeout=0;
  25. server unix:/var/www/aio_ooad/example_4.sock fail_timeout=0;
  26. # Unix domain sockets are used in this example due to their high performance,
  27. # but TCP/IP sockets could be used instead:
  28. # server 127.0.0.1:8081 fail_timeout=0;
  29. # server 127.0.0.1:8082 fail_timeout=0;
  30. # server 127.0.0.1:8083 fail_timeout=0;
  31. # server 127.0.0.1:8084 fail_timeout=0;
  32. }
  33. }

上面大部分内容都是常规的

指明静态文件路径 nginx提供静态文件的支持是很快的 这是选择nginx部署的原因之一

  1. location /static {
  2. # path for static files
  3. root /var/www/aio_ooad/static;
  4. }

选择使用unix domian sockets文件的方式设置upstream 下面的注释也说到也可以使用TCP/IP sockets的方式 但是unix domain socket效果更好 一共配置了四个sockets文件 意味着后台一共有四个web app实例可以供nginx轮询选择

  1. upstream aiohttp {
  2. # fail_timeout=0 means we always retry an upstream even if it failed
  3. # to return a good HTTP response
  4. # Unix domain servers
  5. server unix:/var/www/aio_ooad/example_1.sock fail_timeout=0;
  6. server unix:/var/www/aio_ooad/example_2.sock fail_timeout=0;
  7. server unix:/var/www/aio_ooad/example_3.sock fail_timeout=0;
  8. server unix:/var/www/aio_ooad/example_4.sock fail_timeout=0;
  9. # Unix domain sockets are used in this example due to their high performance,
  10. # but TCP/IP sockets could be used instead:
  11. # server 127.0.0.1:8081 fail_timeout=0;
  12. # server 127.0.0.1:8082 fail_timeout=0;
  13. # server 127.0.0.1:8083 fail_timeout=0;
  14. # server 127.0.0.1:8084 fail_timeout=0;
  15. }

supervisor配置

修改/etc/supervisor/supervisord.conf 最后一行处为

  1. [include]
  2. files = conf.d/*.ini ;

/etc/supervisor/conf.d/example.ini

  1. [program:aiohttp]
  2. numprocs = 4
  3. numprocs_start = 1
  4. process_name = example_%(process_num)s
  5. ; Unix socket paths are specified by command line.
  6. command=python3.6 /var/www/aio_ooad/test_main.py --path=/var/www/aio_ooad/example_%(process_num)s.sock --port=808%(process_num)s
  7. ; We can just as easily pass TCP port numbers:
  8. ; command=/path/to/aiohttp_example.py --port=808%(process_num)s
  9. user=www-data
  10. autostart=true
  11. autorestart=true
numprocs = 4
numprocs_start = 1
process_name = example_%(process_num)s

一共四个进程 进程号从1到4 进程名字由进程号决定 则为example_1 example_2 example_3 example_4

command=python3.6 /var/www/aio_ooad/test_main.py --path=/var/www/aio_ooad/example_%(process_num)s.sock --port=808%(process_num)s
user=www-data

后台运行此命令 也即是运行web app所在的py文件 执行用户为www-data

这里坑就比较多了

1.python模块问题
因为supervisor是由root用户运行的 所以在supervisor里面后台执行python命令也是在root用户下执行的

正如我开始所说 我一直依赖都是windows系统下进行开发的 对权限的意识不是很足

下面我们来看看一个模块安装问题
因为我是使用普通用户gzm进行安装aiohttp模块的 但是在部署之后日志显示没有安装aiohttp模块

让我们在普通用户gzm下打开python3终端 查看模块安装目录
image_1cff2k7ie1nqkpra1a7t1pp81e0q2m.png-40kB
我们会发现里面有个路径为

/home/gzm/.local/lib/python3.6/site-packages

进入之后发现aiohttp正是安装在这个路径下面
image_1cff2pkee1quh1kbssklugl167p33.png-66kB

然后让我们切换为root用户 查看模块安装路径 发现没有/home/gzm/.local/lib/python3.6/site-packages 这个路径 这就解释了为什么即使我真的在gzm这个用户下安装了aiohttp等模块 但是运行supervisor还是会在日志中报错没有此模块 所以正确的方式是切换到root安装需要的模块
image_1cff2sipucq2gtm1qid5141fvd4g.png-40.1kB

还有一个问题是

--path=/var/www/aio_ooad/example_%(process_num)s.sock

意味着www-data用户需要在/var/www/aio_ooad目录下创建四个.socket文件 以支持nginx 所以/var/www/aio_ooad这个文件需要把所有权改为www-data 不然会在日志中报错permission denied

sudo chown -R www-data:www-data /var/www/aio_ooad/

web app所在py

test_main.py

  1. #!/usr/bin/env python3
  2. from aiohttp_polls import main
  3. from aiohttp import web
  4. import argparse
  5. parser = argparse.ArgumentParser(description="aiohttp server example")
  6. parser.add_argument('--path')
  7. parser.add_argument('--port')
  8. app = main.app
  9. args = parser.parse_args()
  10. web.run_app(app, host="0.0.0.0", port=args.port, path=args.path)

nginx supervisor重启命令

  1. sudo /etc/init.d/nginx restart
  2. sudo supervisorctl reload
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注