鱼C论坛

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

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

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

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

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

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

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

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

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

#apt update

#apt upgrade

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

#apt-get install python3.6 python3-pip

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

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

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

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


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

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

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

mkvirtualenv blogvir

报错内容



设置环境变量:

# 1、创建目录用来存放虚拟环境
mkdir $HOME/.virtualenvs (~/.virtualenvs是一个效果)
 
# 2、打开~/.bashrc文件,并最低下添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
 
# 3、使用source加载刚才添加的内容
source ~/.bashrc


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

./virtualenvwrapper.sh: line 230: : command not found
virtualenvwrapper.sh: There was a problem running the initialization hooks.
 
If Python could not import the module virtualenvwrapper.hook_loader,
check that virtualenvwrapper has been installed for
VIRTUALENVWRAPPER_PYTHON= and that PATH is
set properly.

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

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

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

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


# 退出虚拟环境
deactivate blogvir


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

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

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


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

>git add --all
>git commit -m "deploy my mybluelog"

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

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

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

>git pull origin master

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

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

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

git push origin master

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

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

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

#git --version
#apt-get install git

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

#echo $?

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

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



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

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


结构:
~#ls
mybluelog > mybluelog
                  > tests
                  > migrations
                  > requirements.txt
                  > ......


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

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

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

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

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

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

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

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

#ufw allow 22
#ufw allow 80
#ufw allow 443
#ufw allow 465

开启防火墙

#ufw enable

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

查看防火墙的状态:

#ufw status

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

至                          动作          来自
-                          --          --
11211                      ALLOW       Anywhere                  
22                         ALLOW       Anywhere                  
80                         ALLOW       Anywhere                  
443                        ALLOW       Anywhere                  
465                        ALLOW       Anywhere                  
9001                       ALLOW       Anywhere                  
11211 (v6)                 ALLOW       Anywhere (v6)             
22 (v6)                    ALLOW       Anywhere (v6)             
80 (v6)                    ALLOW       Anywhere (v6)             
443 (v6)                   ALLOW       Anywhere (v6)             
465 (v6)                   ALLOW       Anywhere (v6)             
9001 (v6)                  ALLOW       Anywhere (v6)        


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

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

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

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

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

#mysql -uroot -p
Enter password:******

mysql>use productionmybluelog;
mysql>show tables;

+-------------------------------+
| Tables_in_productionmybluelog |
+-------------------------------+
| admin                         |
| category                      |
| comment                       |
| link                          |
| post                          |
+-------------------------------+
5 rows in set (0.09 sec)


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

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

开启访问端口:
ufw allow 8000

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

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

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

现在关闭这个端口

#ufw delete allow 8000


Nginx代理服务器使用

#apt install nginx

配置文件处理:

#rm /etc/nginx/sites-enabled/default
#vim /etc/nginx/sites-enabled/bluelog

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

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


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



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

我们不使用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的配置文件一直在更新。

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

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

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


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



所有参考文章:

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配置)

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

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

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

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

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

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

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

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 14:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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