|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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开机自启功能)
复制代码 |
|