鱼C论坛

 找回密码
 立即注册
查看: 2417|回复: 0

[学习笔记] flask gunicorn nginx supervisor部署项目整个流程

[复制链接]
发表于 2020-10-26 00:48:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 金刚 于 2020-10-27 20:21 编辑
  1. Flask应用部署到Ubuntu18.04(使用的是vmware虚拟机工具)

  2. 这里使用SecureCRT远程连接工具,使用SecureCRT登录到Linux主机

  3. root用户登录后一系列操作(我的一系列操作都是root用户下执行的):
  4. 如果想普通用户操作,可以创建root权限的超级用户(#adduser greyli  usermod -aG sudo greyli #su greyli)

  5. 把Ubuntu18.04的源换成国内的清华园,这样做Ubuntu中下载软件快,而且不出现找不到源而发生错误

  6. #apt update

  7. #apt upgrade

  8. 我的系统中默认有python3.6.9,所以不安装了,pip好像也有了。如果你们没有(python3.6和python3.7都可以安装,选择一个就可以。):

  9. #apt-get install python3.6 python3-pip

  10. 先运行一下python看看,并查看pip版本:

  11. root@qingmingwu-virtual-machine:~# python3
  12. Python 3.6.9 (default, Oct  8 2020, 12:12:24)
  13. [GCC 8.4.0] on linux
  14. Type "help", "copyright", "credits" or "license" for more information.
  15. >>>

  16. root@qingmingwu-virtual-machine:~# pip3 --version
  17. pip 20.2.4 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)

  18. 确认了一下,python3和pip3,都是python3.6.9里面的。


  19. 我们为mybluelog web程序使用虚拟环境来运行,我们这里使用virtualenv和virtualenvwrapper来管理虚拟环境

  20. #pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenv
  21. #pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple virtualenvwrapper

  22. 安装完虚拟环境包后创建一个虚拟环境试一试,如果报错,需要设置环境变量:

  23. mkvirtualenv blogvir

  24. 报错内容



  25. 设置环境变量:

  26. # 1、创建目录用来存放虚拟环境
  27. mkdir $HOME/.virtualenvs (~/.virtualenvs是一个效果)

  28. # 2、打开~/.bashrc文件,并最低下添加如下:
  29. export WORKON_HOME=$HOME/.virtualenvs
  30. source /usr/local/bin/virtualenvwrapper.sh

  31. # 3、使用source加载刚才添加的内容
  32. source ~/.bashrc


  33. 如果环境变量也设置了报下面的错误:

  34. ./virtualenvwrapper.sh: line 230: : command not found
  35. virtualenvwrapper.sh: There was a problem running the initialization hooks.

  36. If Python could not import the module virtualenvwrapper.hook_loader,
  37. check that virtualenvwrapper has been installed for
  38. VIRTUALENVWRAPPER_PYTHON= and that PATH is
  39. set properly.

  40. 文件中的230行出了问题,VIRTUALENVWRAPPER_PYTHON是出错的关键点,把下面的which python换成which python3就可以了,源码是:

  41. 1 # Locate the global Python where virtualenvwrapper is installed.
  42. 2 if [ "${VIRTUALENVWRAPPER_PYTHON:-}" = "" ]
  43. 3 then
  44. 4     VIRTUALENVWRAPPER_PYTHON="$(command \which python3)"    # 原本是写的\which python,这里贴出来的是我修改为python3后的。
  45. 5 fi

  46. 这个报错的原因是virtualenvwrapper进入的解释器是错误的,对于我们的Linux系统而言,python的话进入python2.7的环境,换成python3才可以正确进入安装virtualenv和virtualwrapper的python3解释器。另一个方法是直接把python3的环境变量也改成python,然后删除python2.7的快捷方式,只留下python2快捷运行就行了。

  47. # 进入虚拟环境
  48. root@qingmingwu-virtual-machine:~# workon blogvir
  49. (blogvir) root@qingmingwu-virtual-machine:~#


  50. # 退出虚拟环境
  51. deactivate blogvir


  52. 现在python的虚拟环境创建好了,下一步工作是程序中依赖的所有软件包需要下载。在本地开发的mybluelog项目中,进入项目根目录和虚拟环境,使用命令:

  53. (本地是windows环境)>pip freeze > requirements.txt

  54. 现在发现mybluelog根目录下生成了requirements.txt文件,里面记录了所有使用的软件包。


  55. 本地项目mybluelog所有测试和代码质量通过之后就可以上传到github托管服务器上了,进入根目录mybluelog:

  56. >git add --all
  57. >git commit -m "deploy my mybluelog"

  58. 如果有github账户,登录进去,创建一个mybluelog仓库,然后本地和远程仓库相互建立关系,上传到远程仓库(敏感信息的文件.env不能上传,可以.gitignore中写进这个文件名,就可忽略上传到托管服务器github上了):

  59. >git remote add origin git@github.com:qingmingwu/mybluelog.git (在本地运行此命令,这个命令也是在mybluelog根目录下)

  60. 建立好关系后拉取并合并远程代码:

  61. >git pull origin master

  62. 把本地库的所有内容推送到远程仓库

  63. >git push -u origin master -f (新建立的远程仓库里面没内容,所以第一次推送代码时需要加-u参数,如果不行加-f参数强推送就可以了)

  64. 然后下一次推送就不用加-u了:

  65. git push origin master

  66. 现在完美上传到远程仓库了,现在可以把mybluelog拉取到Linux(Ubuntu)远程服务器上了。

  67. 上传之前我们还需要做两件事情,先远程主机上安装git,git配置ssh上传(这个先可以用http协议上传,不用ssh配置),执行下面命令:

  68. 好像是自带git,所以呢就不用安装git了,首先检查是否安装,但还是附上安装命令(ubuntu命令行):

  69. #git --version
  70. #apt-get install git

  71. 再执行检查上一条命令是否发生错误:

  72. #echo $?

  73. 返回0表示没有错误,其他有错误,需要重新安装。

  74. git配置ssh,现阶段还没有做,使用了http协议直接clone到服务器root目录上的,



  75. root@qingmingwu-virtual-machine:~#git clone https://github.com/qingmingwu/mybluelog.git

  76. 使用SecureCRT的上传工具单独上传.env文件即可(Transfer > Zmodem Upload List),再内容中添加FLASK_ENV=production FLASK_CONFIG=production


  77. 结构:
  78. ~#ls
  79. mybluelog > mybluelog
  80.                   > tests
  81.                   > migrations
  82.                   > requirements.txt
  83.                   > ......


  84. 现在可以安装所有依赖包了,进入项目根目录mybluelog并进入虚拟化境blogvir:

  85. root@qingmingwu-virtual-machine:~#cd mybluelog
  86. root@qingmingwu-virtual-machine:~/mybluelog#workon blogvir
  87. (blogvir) root@qingmingwu-virtual-machine:~/mybluelog#

  88. 进入上面有括号中包含虚拟环境的命令界面表名已经进入虚拟环境,

  89. (blogvir) root@qingmingwu-virtual-machine:~/mybluelog#pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt

  90. 执行安装完再执行echo $?,检查上一个命令是否正确。

  91. 如果有错误重新执行即可,一直安装完成为止:

  92. (blogvir) root@qingmingwu-virtual-machine:~/mybluelog#pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ -r requirements.txt

  93. 这些完成之后到了设置防火墙,ubuntu自带ufw防火墙工具,我们需要使用它来设置开放的端口:

  94. #ufw allow 22
  95. #ufw allow 80
  96. #ufw allow 443
  97. #ufw allow 465

  98. 开启防火墙

  99. #ufw enable

  100. 然后弹出确认弹窗y|n?y回车即可

  101. 查看防火墙的状态:

  102. #ufw status

  103. (blogvir) root@qingmingwu-virtual-machine:~/mybluelog# ufw status
  104. 状态: 激活

  105. 至                          动作          来自
  106. -                          --          --
  107. 11211                      ALLOW       Anywhere                  
  108. 22                         ALLOW       Anywhere                  
  109. 80                         ALLOW       Anywhere                  
  110. 443                        ALLOW       Anywhere                  
  111. 465                        ALLOW       Anywhere                  
  112. 9001                       ALLOW       Anywhere                  
  113. 11211 (v6)                 ALLOW       Anywhere (v6)            
  114. 22 (v6)                    ALLOW       Anywhere (v6)            
  115. 80 (v6)                    ALLOW       Anywhere (v6)            
  116. 443 (v6)                   ALLOW       Anywhere (v6)            
  117. 465 (v6)                   ALLOW       Anywhere (v6)            
  118. 9001 (v6)                  ALLOW       Anywhere (v6)        


  119. 远程主机中,更新数据库之前,需要安装mysql服务器:

  120. #apt install mysql-server-5.7
  121. #echo $?
  122. #0(返回0表示安装没有问题)
  123. mysql安装的其他信心可以看下面链接:
  124. url: https://fishc.com.cn/forum.php?mod=viewthread&tid=183140&ctid=1795

  125. 现在可以更新数据库了,使用我们在项目中初始化数据库的函数命令:

  126. (blogvir) root@qingmingwu-virtual-machine:~/mybluelog#flask initdb
  127. (blogvir) root@qingmingwu-virtual-machine:~/mybluelog#flask init --username=xxxxxx --password=xxxxxxx

  128. 现在进入mysql数据库中就可以查到所有数据表全都创建了:

  129. #mysql -uroot -p
  130. Enter password:******

  131. mysql>use productionmybluelog;
  132. mysql>show tables;

  133. +-------------------------------+
  134. | Tables_in_productionmybluelog |
  135. +-------------------------------+
  136. | admin                         |
  137. | category                      |
  138. | comment                       |
  139. | link                          |
  140. | post                          |
  141. +-------------------------------+
  142. 5 rows in set (0.09 sec)


  143. 现在为止已经把项目的所有初始化操作全都做完了,现在可以开始做运行项目的阶段了。

  144. 使用Gunicorn运行程序:
  145. (blogvir)#pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gunicorn

  146. 开启访问端口:
  147. ufw allow 8000

  148. gunicorn语法:
  149. gunicorn [OPTIONS] 模块名:变量名

  150. (blogvir)#gunicorn -w 4 -b 0.0.0.0:8000 wsgi:app
  151. 尝试使用浏览器访问,ip:8000,首先获取linux IP地址:
  152. # ip addr
  153. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  154.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  155.     inet 127.0.0.1/8 scope host lo
  156.        valid_lft forever preferred_lft forever
  157.     inet6 ::1/128 scope host
  158.        valid_lft forever preferred_lft forever
  159. 2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
  160.     link/ether 00:0c:29:dc:2c:11 brd ff:ff:ff:ff:ff:ff
  161.     inet 192.168.247.131/24 brd 192.168.247.255 scope global dynamic noprefixroute ens32
  162.        valid_lft 1500sec preferred_lft 1500sec
  163.     inet6 fe80::f97c:ce3c:7604:6d3a/64 scope link noprefixroute
  164.        valid_lft forever preferred_lft forever

  165. 2:里面的inet 192.168.247.131就是IP地址
  166. 浏览器:192.168.247.131:8000即可访问网站主页

  167. 现在关闭这个端口

  168. #ufw delete allow 8000


  169. Nginx代理服务器使用

  170. #apt install nginx

  171. 配置文件处理:

  172. #rm /etc/nginx/sites-enabled/default
  173. #vim /etc/nginx/sites-enabled/bluelog

  174. vim中保存即可创建bluelog配置文件,vim命令不会的可以看小甲鱼vim课程。

  175. nginx配置文件(总配置文件可以加载sites-enabled中的文件,所以在这个目录下添加配置即可。nginx配置文件修改后必须重启nginx,要不然配置文件修改不生效):
  176. 命令:#nginx -t #检查配置文件是否正确
  177.          #service nginx restart
  178. /etc/nginx/nginx.conf
  179.   只写修改的内容:
  180.   #这个是root权限执行的(这个不设置会在浏览器中静态文件加载时浏览器调试兰中会报403 forbidden错误,所以就是这个权限的问题。我在这个错误中饶了好长时间才弄明白的。当时参考的是:https://www.cnblogs.com/smiler/p/8624145.html)
  181.   user root; #user nobody;
  182.   http{
  183.           # include的意思是加载子配置文件的意思
  184.           include /etc/nginx/conf.d/*.conf;
  185.         include /etc/nginx/sites-enabled/*;
  186.   }
  187. /etc/nginx/sites-enabled/bluelog
  188.   1 # 配置服务器
  189.   2 server {
  190.   3     listen 80;
  191.   4     server_name 192.168.247.131;
  192.   5     access_log /var/log/nginx/access.log;
  193.   6     error_log /var/log/nginx/error.log;
  194.   7     location / {
  195.   8         proxy_pass http://127.0.0.1:8000;
  196.   9         proxy_redirect off;
  197. 10         proxy_set_header Host $host;
  198. 11         proxy_set_header X-Real-IP $remote_addr;
  199. 12         proxy_set_header X-Forward-Proto $scheme;
  200. 13     }
  201. 14     location /static{
  202. 15         alias /root/mybluelog/mybluelog/static/;
  203. 16         expires 30d;
  204. 17     }
  205. 18 }


  206. 现在可以运行程序mybluelog:
  207. #gunicorn -w 4 wsgi:app
  208. 浏览器中输入192.168.247.131即可访问网站主页



  209. 使用supervisor管理gunicorn运行关闭mybluelog的进程,这样更加稳定,并且服务器意外重启也会重新启动supervisor进程,进而管理运行gunicorn:

  210. 我们不使用apt安装supervisor,因为这样的话他默认会安装到python2.7当中,因为supervisor中调用的是python,而且是系统python,不是虚拟环境的python3.所以我们用虚拟环境中的pip3安装supervisor。啊,好像supervisor不区分系统python还是虚拟环境python,只要能启动supervisor,再启动gunicorn即可,大家可以试试,可能最初想错了,因为当时supervisor启动后gunicorn一直没有启动而导致mybluelog一直不能启动,页面显示502 nginx错误,所以才以为是supervisor不在一个解释器里的原因,后来gunicorn启动了就不是这个问题了。所以也可用apt安装supervisor,下次我试试。如果能apt安装supervisor,linux系统自启supervisor就解决了,不用设置了。如果用pip安装的话linux自启是不能启动supervisor的,需要自己手动配置一些文件才行。网上搜索了很长时间pip安装的supervisor系统自启而启动没有多少资料,有的资料都已经过期了,因为ubuntu18.04的配置文件一直在更新。

  211. 我是这样想的,只要linux系统启动的时候,supervisor就需要启动了。supervisor的后台启动文件在python中,就是supervisord,然后把supervisord的绝对路径加到ubuntu的启动配置文件中就可以带动supervisor启动。但是网上查资料都说rc.local是启动时使用的配置文件,但是现在都没有这个文件了。突然想到一个办法。现在不是使用systemd管理启动的功能,然后再做个软连接,再调用rc.local就可以了,这个rc.local现在自己创建,权限需要改成755,要不然系统文件没有权限启动这个rc.local文件。然后里面添加supervisord启动的绝对路径即可,不分虚拟和本地环境,只要能启动supervisor就可以了。

  212. 上面文字内容的参考文章:https://blog.csdn.net/a912952381/article/details/81205095   (rc.local的文件权限更改)
  213.                                         :https://blog.csdn.net/qq_41782149/article/details/89001226   (解决了supervisor开机自启功能)

  214. 一开始的想法不一样,所以在这里写直接的命令就可以了:
  215. /root/.virtualenvs/blogvir/bin/ 下面的命令都在这个文件加下运行的,因为这个下面生成了supervisor的命令,supervisord,supervisorctl等。这是python虚拟环境的bin二进制文件夹:
  216. 1. supervisor安装成功
  217. 2. ./echo_supervisord_conf > /etc/supervisor/supervisored.conf
  218.   配置内容暂时不展示,vim中不能看全部内容,需要翻页看。所以就不能复制了。
  219. 3. 创建子配置文件:/etc/supervisor/conf.d/bluelog.conf
  220.   1 [program:mybluelog]
  221.   2 ;command=/bin/bash -c "/root/.virtualenvs/blogvir/bin/gunicorn --bind 127.0.0.1:8000 --chdir /root/mybluelog -w 4 wsgi:app"
  222.   3 command=/root/.virtualenvs/blogvir/bin/gunicorn -w 4 wsgi:app
  223.   4 directory=/root/mybluelog
  224.   5 user=root
  225.   6 autostart=true
  226.   7 startsecs=0
  227.   8 autorestart=true
  228.   9 startretries=3
  229. 10 stopasgroup=false
  230. 11 priority=999
  231. 12 killasgroup=false
  232. 13 redirect_stderr = true
  233. 14 enviroment=PATH="/root/.virtualenvs/blogvir/bin"
  234. 15 [supervisord]
  235. 16 loglevel=info
  236. 17 [supervisorctl]
  237. 4.全部内容配置完成后就需要后台启动了,就可以启动gunicorn:
  238. ./supervisord -c /etc/supervisor/supervisored.conf
  239. 现在查看网页输入ip地址就可以访问网站首页了
  240. 5.supervisor客户端操作:
  241. ./supervisorctl -c /etc/supervisor/supervisored.conf
  242. >stop mybluelog
  243. >start mybluelog
  244. >restart mybluelog


  245. 几次测试linux自启都能启动网站,所以到此部署完成所有项目。



  246. 所有参考文章:

  247. https://blog.csdn.net/liuxiao723846/article/details/89577983?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-1-89577983.nonecase&utm_term=%E6%9F%A5%E7%9C%8Bsupervisor%E8%BF%9B%E7%A8%8B&spm=1000.2123.3001.4430  (整体supervisor配置)

  248. https://askubuntu.com/questions/911994/supervisorctl-3-3-1-http-localhost9001-refused-connection/911998  (supervisor配置)

  249. https://www.liaoxuefeng.com/wiki/897692888725344/956179536673472 (廖雪峰)

  250. https://www.datadoghq.com/blog/nginx-502-bad-gateway-errors-gunicorn/  (外网挺好, 这里解决了我的gunicorn启动的问题)

  251. https://www.jianshu.com/p/8e5b2b995b90  (gunicorn指定项目地址)

  252. https://www.jianshu.com/p/03619bf7d7f5 (supervisor自启,后面可能都会用这个, 外网知识稳定)

  253. https://blog.csdn.net/a912952381/article/details/81205095   (rc.local的文件权限更改)

  254. https://blog.csdn.net/qq_41782149/article/details/89001226   (解决了supervisor开机自启功能)

复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 22:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表