赞
踩
写了个可以挂在后端运行的FastAPI的服务, 想要把它挂在服务器上运行, 还记得一开始折腾的时候非常痛苦, 用的centos7, 装Python3装了半天碰到各种奇奇怪怪的报错, 如何FastAPI的接口文档显示不出来. 然后就是端口被防火墙墙了, 系统自带一个Nginx又把80端口占了1, 运行的时候没指定host是’0.0.0.0’又访问不了, 后边又有跨域的问题.
好不容易运行好了之后, 发现终端一关闭服务器的应用也退了, 又搜了半天这么让他挂在后台. 然后就是服务器重启的时候应用不能自启.
还有很多运行的时候路径引用出了问题的, 这么多问题加起来对于当时还是新手的我简直是连续坐牢, 经常是碰到一个问题搜半天才解决.
还有就是当时改文件也花了很长时间, 每次修改都要复制粘贴到对应的文件里, 相当麻烦.
于是乎今天特此来总结一下从本地的后端写完到服务器部署于运维的一些小技巧, 以便后人不要再做我曾经做过的牢了.
急性子的老哥可以直接看加粗的部分跟着来, 然后用最简单粗暴的方式就可以部署自己的服务了. 别看文章一个大标题下还有些小标题, 在简单粗暴的标题前都有一个!!!
符号直接按照这个来就很快, 很多如果图快都可以跳过的, 总的来说一个字: 快 !
另外, 这篇文章按照标题顺序提供了一个从本地到云部署简单粗暴的路线, 但有些地方难免不够具体, 有一定概率运行不成功, 这时候就可以详细搜索对应的问题解决后再进入下一步了.
本篇博客的目的是帮助一个写完一个WebAPP并购买了服务器的新手快速把应用部署到服务器上, 并提供简单的运维. 通常情况下由于新手对相关知识了解并不多, 因此采用很小的篇幅和简单粗暴的方式有时候也可以帮助新手快速达到目的, 过于详细的描述和过长的篇幅有可能一看就不想看了, 其实真的部署起来并不难, 选好平台还是很快的.
对于有些开发经验的人来说这篇文章看起来过于肤浅. 笔者认为, 部署程序这些本质上和玩电脑没什么不同, 只是在习惯一种操作系统, 用的多了就会了然于胸, 并不需要一上来就学Linux各种的东西怎么用, 碰到了慢慢解决, 过个几年就很熟悉了, 重点在于先上手做.
推荐使用Ubuntu最新版本的操作系统, 安装需要的软件直接apt-get install就安装了, 非常非常的方便, 省时省力. 像是常见的Jdk, python3, Mysql, Redis, gitlab这些,都是一句话就装上了, 根本不需要找一些很长的教程一步步对着操作.
对于新手来说, 是省时省力的首选.
买好了服务器装好了系统之后, 很有可能是有两个防火墙的, 第一个是服务器所在的平台提供的, 比如说腾讯云在控制台那里就有个防火墙. 然后第二个防火墙是操作系统自带的, 如果要使用ssh或者是tcp这些还是要放行相应的端口的.
也可以添加规则, 这样感觉比较安全.
然后登录进去服务器之后可以直接把系统里的防火墙关了(简单粗暴), 也可以放行, 这样感觉安全一些.
sudo ufw status
sudo ufw disable
sudo systemctl disable ufw.service
首先,确保ufw服务已启动:sudo systemctl start ufw.service
将需要放行的端口添加到防火墙规则中:sudo ufw allow <port>/tcp
其中,<port>
为需要放行的端口号。
重新加载防火墙规则:sudo ufw reload
推荐使用WindTerm.
界面如下:
像我的服务器密码都是可以改的, 直接改一下记住简单粗暴
然后就可以登录了
及其推荐使用Ubuntu-Server, 如果不是的话也建议换成Ubuntu-Server. 因为确实是太方便了. 安装这些包也就复制粘贴一下一条命令就好了.
sudo apt update sudo apt install python3 sudo apt install openjdk-17-jdk sudo apt install mysql-server sudo apt install redis-server # EMQX wget https://www.emqx.io/downloads/broker/v5.1.5/emqx-ubuntu22.04-v5.1.5_amd64.deb # 请注意,以上命令中的软件包版本可能不是最新的,请根据需要替换软件包的版本号。 sudo dpkg -i emqx-ubuntu22.04-v5.1.5_amd64.deb sudo systemctl start mysql sudo systemctl status mysql sudo systemctl start redis sudo systemctl status redis sudo systemctl start emqx sudo systemctl status emqx #测试Python3/JDK: python3 --version javac -version # 如果您看到输出的版本号,则表示Python 3和JDK已成功安装。
Mysql之前每次都是头大, 装上之后不会设置总是出错. FLUSH PRIVILEGES;
这句话特别重要, 运行了什么权限相关的命令一定要刷新一下权限, 这样才会生效!
mysql -u root -p
CREATE USER 'root'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost';
FLUSH PRIVILEGES;
exit;
有了用户名密码之后本地就可以访问了, 如果之前在本机开发测试通过了, Mysql用户密码创建的和本机的一样就不用改什么了, 可以直接运行.
然而, 我当时做为新手的时候代码老是出bug, 于是就去数据库看看有没有添加进去, 为了方便远程连接, 可以再修改
sudo mysql
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
在MySQL服务器上运行以下命令:
sudo nano 'bind-address' /etc/mysql/mysql.conf.d/mysqld.cnf
找到这个bind-address,改成这个就可以监听所有的了
bind-address = 0.0.0.0
最简单粗暴的方式, 就右键,单击一下就有这些选项, 按需操作即可
另外WindTerm还提供了下载重传的功能, 就是说下载下来改了的文件按一下保存, 会提示要不要把服务器里这个文件也改了, 还是很方便的.
先把文件push到Github/Gitlab/Gitee仓库, 然后下载即可.
#本地推代码 先装git 然后找个Github/Gitlab/Gitee建个账号, 建一个仓库, 记住仓库克隆的网址
git init
git add .
git commit -m "x"
git remote add origin 你的代码仓库网址
git push origin master:main
#服务器拉代码
git clone 你的代码仓库地址
# 然后代码仓库的文件夹就出现在运行这个指令的目录下了
还有一些其它软件比如说宝塔之类的或者其它集成了一些服务的终端都可以上传文件, 甚至是百度网盘哈哈哈哈, 一开始只会用wget索性就传到百度网盘里上传文件现在想想也挺有意思.
还有使用IDE自带的远程部署功能以及docker部署等方法,后期随缘更新相关内容啦
按照步骤来说到这里环境已经要装好
切换到指定的文件夹按照自己包依赖的文件装包然后运行即可.
到这里已经可以在终端运行了, 只不过退出终端服务也就关了. 而且难受的是有时候还不知道开没开成功, 想关的时候也不是那么好关掉.
nohup
是一个简单有效的让程序在后台运行且忽略挂起信号的方法。使用nohup
运行程序时,你可以通过将程序的输出重定向到文件来记录日志,以便稍后查看。
nohup python3 app.py > output.log 2>&1 &
这将在后台启动程序并将输出写入output.log
文件。要停止程序,需要手动查找并结束进程。
到这里就简单粗暴服务之间挂上去了, 这里提供一个简单粗暴根据运行的端口号关闭服务的脚本, 把它找个地方保存一下,然后在这个地方运行这个脚本比如我这里是:python3 kill_pory.py 8080
这个kill_port.py
是保存的脚本的名称, 8080是我要杀掉的端口.
#!/usr/bin/python3 ''' 杀掉占用指定端口的程序 如果程序占用后台的80端口,运行后程序将关闭 例如: python3 kill_port.py 80 ''' import os import subprocess import sys if len(sys.argv)<2: print("您未输入参数,请重新输入") sys.exit(1) port=sys.argv[1] cmd = f"netstat -tunlp|grep 0.0.0.0:{port}" res = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True) pid_port = 0 for line in res.stdout.readlines(): l = line.decode("utf-8") l = l.split() if l[3] == f'0.0.0.0:{port}': pid_port = l[len(l) - 1].split('/')[0] # print('80端口,进程: '+pid_80) if type(pid_port) == str: os.system("kill -9 " + pid_port) print(f'{port}端口,进程: ' + pid_port + ' 已关闭,查看以确认是否关闭成功') else: print("没找到,请手动关闭") os.system(f"netstat -tunlp|grep {port}")
看到这里的老哥应该已经把服务挂上了, 这样只要服务器不关机服务就能一直跑啦,一般买的服务器是不会轻易关机的. 成功!
Systemd是Linux系统的一个服务管理器,可以用来管理和控制服务。要使用Systemd运行程序,需要创建一个服务配置文件。
/etc/systemd/system/myapp.service
,并编辑内容如下:[Unit]
Description=MyApp
After=network.target
[Service]
User=myuser
Group=mygroup
WorkingDirectory=/path/to/your/app
ExecStart=python3 /path/to/your/app/app.py
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl start myapp.service
sudo systemctl enable myapp.service
你可以使用Python的subprocess
模块在后台运行程序,同时记录程序的输出。
import subprocess
def run_app():
cmd = "python3 app.py"
with open("output.log", "wb") as f:
subprocess.Popen(cmd, stdout=f, stderr=subprocess.STDOUT, shell=True)
if __name__ == "__main__":
run_app()
将此代码保存为run_app.py
,并运行它以在后台启动程序。
将运维功能直接集成到应用程序中,例如使用daemonize
库来将Python程序转换为守护进程。这样,你可以更好地控制程序的启动、停止和监控。
首先,安装daemonize
库:
pip3 install daemonize
然后,修改你的app.py
,添加以下内容:
from daemonize import Daemonize
import sys
def main():
# 这里是你的应用程序代码
pid_file = "/tmp/my_app.pid"
daemon = Daemonize(app="my_app", pid=pid_file, action=main)
daemon.start()
现在,当你运行app.py
时,它将在后台作为守护进程运行。
其实这里每一个部分还是颇有讲究的, 为了简单粗暴方便快速部署, 这里使用了多种非常简单粗暴的方法. 后续可能随缘进一步再发一篇文章补充一下剩下的技巧.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。