经验分享Linux在Ubuntu搭建一个flask+Vue的项目
ELIX说明
目标:获取一个资讯网站的新闻信息,并部署到远程服务器上,做一个简易的信息聚合平台。
准备:云服务器、域名(可选)
架构:前后端分离,前端使用Vue部署;后端使用python-flask,并使用Docker部署到服务器
服务器配置
本项目中,由于使用了Docker和Nginx,很大程度降低了对服务器环境的依赖。
服务器上也是只需要配置这两个环境即可。
Docker:apt install docker.io
Nginx: apt install nginx
Docker配置镜像源
(apt和docker的镜像源总得有一个好用的…)
1 2 3 4 5 6 7 8
| sudo vim /etc/docker/daemon.json <<EOF { "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me" ] } EOF
|
项目部署
一、Docker部署flask项目
首先本地调试flask爬取网站信息,并调试通过,本文主要讨论项目部署,故不赘述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| from flask import Flask, jsonify from flask_cors import CORS import requests from bs4 import BeautifulSoup
app = Flask(__name__) CORS(app)
@app.route('/') def index(): url = 'https://website.com' response = requests.get(url) if response.status_code == 200: soup = BeautifulSoup(response.text, 'html.parser') message_grids = soup.find_all(class_='tgme_widget_message_text js-message_text') data = [{ "content": grid.get_text(strip=True)} for grid in message_grids] else: data = [{ "content": ""}] return jsonify(data)
if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')
|
运行后进入localhost:5000,能看到返回json信息即可。
要部署到服务器上,且考虑移植性和可用性,可选用Docker进行部署,排除对服务器环境的依赖。
安装好Docker环境后,在项目根目录编写Dockerfile
1 2 3 4 5 6 7 8 9 10 11 12
| FROM python:3.9
WORKDIR /app
COPY . /app
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 5000
CMD ["python", "main.py"]
|
再执行docker build -t endapp .
构建镜像,docker run --privileged -p 5000:5000 endapp
创建容器并运行。构建时可能遇到找不到依赖问题,考虑更新docker镜像源
此时可达到和上面运行flask项目相同的效果。
docker本地正常运行后,就要导出镜像并部署到服务器上,参考:
导出和导入镜像:https://www.hangge.com/blog/cache/detail_2411.html
注意:若跨平台部署镜像(如windows生成镜像到ubuntu部署,则部署时执行的是docker load -i your_images.tar)
导出镜像:docker save your_images_ID > your_images.tar
将生成的tar包上传到服务器,并找到tar包所在位置后,
在服务器导入镜像:docker load -i your_images.tar
导入完成后,可执行docker images
查看是否有自己的镜像,执行docker run --privileged -d -p 5000:5000 IMAGE_ID
即可后台运行Docker服务。
二、Nginx部署前段Vue静态页面
Nginx 是一个高性能的 HTTP 和反向代理 Web 服务器,很适合部署静态页面,能够满足Vue的需求。
同样,现在本地调试好前端页面
App.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <template> <div id="app"> <a>sss</a> <MessageGrid :messages="messages" /> </div> </template>
<script> import { ref, onMounted } from 'vue'; import axios from 'axios'; import MessageGrid from './components/MessageGrid.vue';
export default { name: 'App', components: { MessageGrid }, setup() { const messages = ref([]);
onMounted(() => { fetchData(); });
const fetchData = async () => { try { const response = await axios.get('http://38.55.239.55:5000/'); // 替换为你的后端接口地址 messages.value = response.data; } catch (error) { console.error('Error fetching data:', error); } };
return { messages }; } }; </script>
|
MessageGrid.vue
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| <template> <div> <el-card v-for="(item, index) in messages" :key="index" class="box-card"> <div class="message-content"> <h3>{{ item.title }}</h3> <p>{{ item.content }}</p> </div> </el-card> </div> </template> <script> export default { props: { messages: Array } }; </script> <style scoped> .box-card { margin-bottom: 20px; } .message-content { padding: 10px; } </style>
|
main.js
1 2 3 4 5 6 7 8
| import { createApp } from 'vue'; import App from './App.vue'; import ElementPlus from 'element-plus'; import 'element-plus/dist/index.css';
const app = createApp(App); app.use(ElementPlus); app.mount('#app');
|
构建项目npm run build
,这会生成一个 dist
文件夹,里面包含所有静态资源(HTML、CSS、JavaScript 等)
将dist文件上传到服务器
安装nginx:sudo apt-get install nginx
查看nginx版本:nginx -v
进入目录:cd /etc/nginx/sites-enabled
该目录下新建amedia.conf:
1 2 3 4 5 6 7 8 9 10 11 12
| server { listen 8070 default_server;
root /var/www/a-media/dist;
index index.html;
server_name xx.xx.xxx.xx; location / { try_files $uri $uri/ =404; } }
|
将nginx添加到用户组:sudo usermod -a -G root www-data
查看是否添加成功:getent group ubuntu
检查Nginx配置是否有语法错误:sudo nginx -t
重启Nginx:sudo systemctl restart nginx
绑定域名
首先在域名网站进行绑定,指向服务器公网IP,类型为A。
在服务器Nginx进行修改,修改默认路径下的/etc/nginx/sites-enabled/default
,按照如下规则修改:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| server { listen 80 default_server; listen [::]:80 default_server;
root /var/www/a-media/dist;
index index.html;
server_name xx.xx.xx.xx;
location / { try_files $uri $uri/ =404; } }
|
–其实就是修改默认80端口的指向内容,这样访问公网ip,就默认指向你的前端页面了。
总结
没有总结
参考资料
其它参考资料:
Flask部署:https://cloud.tencent.com/developer/article/2280871
Nginx部署:https://blog.csdn.net/weixin_53459689/article/details/136177562
Docker镜像源:https://cloud.tencent.com/developer/article/2485043