news 2026/5/3 2:07:29

AI掘金头条项目部署实践指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI掘金头条项目部署实践指南

项目部署文档 - Red Hat Enterprise Linux 10.1 虚拟机部署

项目概述

本项目包含两个部分:

  • 前端: Vue 3 + Vite + Vant 移动端新闻应用 (端口: 5173)
  • 后端: FastAPI + MySQL 新闻API服务 (端口: 8000)

一、环境准备

1.1 系统配置

项目最低配置推荐配置
CPU2核4核
内存4GB8GB
磁盘40GB80GB
操作系统Red Hat Enterprise Linux 10.1RHEL 10.1

1.3 安装基础软件

# 安装基础依赖 (Python 3.12 已预装)sudodnfinstall-ypython3-pipgitcurlunzipnginx redis

1.4 创建项目用户

sudouseradd-m-s/bin/bash deploysudomkdir-p/root/xwzx-newssudochown-Rdeploy:deploy /root/xwzx-news

1.5 关闭 SELinux 和配置 Firewalld (可选)

# 临时关闭 SELinux (生产环境建议配置策略)sudosetenforce0# 永久关闭 (需重启)sudosed-i's/SELINUX=enforcing/SELINUX=disabled/g'/etc/selinux/config# 配置防火墙sudofirewall-cmd--permanent--add-service=httpsudofirewall-cmd--permanent--add-service=httpssudofirewall-cmd--permanent--add-port=8000/tcpsudofirewall-cmd--reload

二、数据库安装与配置 (MySQL 8.4.8)

2.1 安装 MySQL 8.4.8 (RHEL 10 官方仓库)

RHEL 10 默认仓库没有 mysql-server,需要添加 MySQL 官方 YUM 仓库:

# 1. 下载 MySQL 8.4.8 Yum 仓库 RPM 包dnfinstall-yhttps://dev.mysql.com/get/mysql84-community-release-el10-2.noarch.rpm# 2. 安装 MySQL 8.4.8yuminstallmysql-community-server-y# 3. 启动并设置开机启动sudosystemctl start mysqldsudosystemctlenablemysqld# 4. 获取临时密码 (首次安装会生成临时密码)sudogrep'temporary password'/var/log/mysqld.log# 5. 登录mysqlmysql-uroot-p".+ky6+LEL<qv"# 6. 更改root默认密码alter user'root'@'localhost'identified by'MySQL@123';

2.2 导入数据库表结构

# 把前后端的项目代码源文件上传到服务器[root@localhost ~]# lltotal208-rw-------.1root root752Apr1815:36 anaconda-ks.cfg -rw-r--r--.1root root208012May216:17 database.sql drwxr-xr-x.12root root184May216:05 toutiao_backend drwxr-xr-x.5root root136May216:06 xwzx-news# 导入数据库 (先创建数据库用户)mysql-uroot-p'MySQL@123'-e"CREATE DATABASE IF NOT EXISTS news_app CHARACTER SET utf8mb4;"# 导入表结构和数据mysql-uroot-p'MySQL@123'news_app<database.sql

2.3 数据库表说明

导入的表结构:

  • user- 用户信息表
  • user_token- 用户令牌表
  • news_category- 新闻分类表
  • news- 新闻表
  • related_news- 相关新闻关联表
  • favorite- 收藏表
  • history- 浏览历史表

三、缓存服务 (Redis)

3.1 安装 Redis (源码编译)

Redis 不在 RHEL 10 默认仓库中,采用源码编译安装:

# 1. 安装编译依赖sudodnfinstall-ygccmake# 2. 下载 Redis 7.4.2 源码,直接去浏览器下载,然后上传https://github.com/redis/redis/archive/refs/tags/7.4.2.tar.gz# 3. 编译安装tarxzf redis-7.4.2.tar.gzcdredis-7.4.2make-j$(nproc)sudomakeinstall# 4. 创建配置目录并复制配置文件sudomkdir-p/etc/redissudocpredis.conf /etc/redis/# 5. 修改配置以守护进程运行sudosed-i's/^daemonize no/daemonize yes/'/etc/redis/redis.confsudosed-i's/^bind 127.0.0.1/bind 0.0.0/'/etc/redis/redis.conf

3.2 启动 Redis

# 直接运行 Redis 服务器/usr/local/bin/redis-server /etc/redis/redis.conf# 验证redis-cliping# 应返回: PONG

四、后端部署 (FastAPI)

4.1 安装 Python 虚拟环境依赖

# 进入后端目录cdtoutiao_backend/# 创建虚拟环境 (RHEL 10 使用 python3)python3-mvenv venv# 激活虚拟环境sourcevenv/bin/activate# 安装依赖pipinstallfastapi uvicorn sqlalchemy aiomysql python-josepasslib==1.7.4 python-multipart pydantic pydantic-settingsbcrypt==3.2.2 redis

4.2 修改数据库配置

编辑config/db_config.py,修改数据库连接信息:

# 数据库URL - 使用 localhost,如果密码包含特殊字符需要 URL 编码# 例如 @ 编码为 %40ASYNC_DATABASE_URL="mysql+aiomysql://root:MySQL%40123@localhost:3306/news_app?charset=utf8mb4"

注意:如果 MySQL 允许远程连接,可以使用服务器 IP,但需确保 MySQL 用户有对应主机的权限。

4.3 使用 systemd 管理后端服务

# 创建 systemd 服务文件sudocat>/etc/systemd/system/xwzx-news-backend.service<<'EOF' [Unit] Description=XWZX News API Backend After=network.target mysqld.service [Service] User=root Group=root WorkingDirectory=/root/toutiao_backend ExecStart=/root/toutiao_backend/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 Restart=always RestartSec=5 Environment="PYTHONPATH=/root/toutiao_backend" [Install] WantedBy=multi-user.target EOF# 重新加载 systemd 配置sudosystemctl daemon-reload# 启动服务sudosystemctl start xwzx-news-backend# 设置开机启动sudosystemctlenablexwzx-news-backend# 查看服务状态sudosystemctl status xwzx-news-backend

4.4 验证后端服务

# 检查服务状态sudosystemctl status xwzx-news-backend# 测试 APIcurlhttp://localhost:8000/# 应返回: {"message":"Hello World"}

五、前端部署 (Vue + Vite)

5.1 安装 Node.js (RHEL 10)

# 使用 NodeSource 仓库安装 Node.js 20 LTScurl-fsSLhttps://rpm.nodesource.com/setup_20.x|sudobash-sudodnfinstall-ynodejs

5.2 前端 API 配置

修改src/config/api.js必须使用空字符串

// API基础URL配置 - 必须为空字符串exportconstapiConfig={baseURL:''}

注意baseURL不能为/,否则拼接后变成//api/user/register被浏览器当成协议相对 URL,导致请求失败。

5.3 构建前端

cd/root/xwzx-news# 安装依赖npminstall# 构建生产版本npmrun build# 复制到 Nginx 目录sudorm-rf/usr/share/nginx/html/xwzx-newssudocp-r/root/xwzx-news/dist /usr/share/nginx/html/xwzx-news# 启动 Nginxsudosystemctl start nginxsudosystemctlenablenginx

5.4 nginx反向代理配置

[root@localhost ~]# cat /etc/nginx/nginx.confuser nginx;worker_processes auto;error_log /var/log/nginx/error.log notice;pid /run/nginx.pid;events{worker_connections1024;}http{log_format main'$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;tcp_nopush on;keepalive_timeout65;types_hash_max_size4096;include /etc/nginx/mime.types;default_type application/octet-stream;server{listen80;server_name _;root /usr/share/nginx/html/xwzx-news;index index.html;location /{try_files$uri$uri/ /index.html;}location ~*\.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)${expires 1y;add_header Cache-Control"public, immutable";}location /api/{proxy_pass http://127.0.0.1:8000/api/;proxy_http_version1.1;proxy_set_header Host$host;proxy_set_header X-Real-IP$remote_addr;proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto$scheme;}}}

六、部署检查清单

6.1 服务启动顺序

# 1. 确保 MySQL 运行sudosystemctl status mysqld# 2. 启动 Redis/usr/local/bin/redis-server /etc/redis/redis.conf# 3. 启动后端 APIsudosystemctl start xwzx-news-backend# 4. 检查后端是否正常curlhttp://localhost:8000/# 5. 确保 Nginx 运行sudosystemctl status nginx

6.2 常见问题排查

问题解决方法
后端无法连接数据库检查 MySQL 服务状态 (sudo systemctl status mysqld) 和密码配置
前端 API 请求失败检查api.js中的baseURL配置
502 Bad GatewayNginx 无法连接后端,检查后端服务是否运行
静态资源加载失败检查 Nginxroot路径是否正确
SELinux 拒绝访问执行sudo setenforce 0临时关闭,或配置正确的安全上下文

6.3 日志查看

# 后端日志sudojournalctl-uxwzx-news-backend-f# MySQL 日志sudojournalctl-umysqld-fsudotail-f/var/log/mysqld.log# Nginx 日志sudotail-f/var/log/nginx/error.logsudotail-f/var/log/nginx/access.log

七、安全配置 (生产环境必做)

7.1 修改数据库密码

编辑config/db_config.py使用强密码

7.2 配置 CORS

编辑main.py,将allow_origins=["*"]改为具体的前端域名:

app.add_middleware(CORSMiddleware,allow_origins=["https://your-domain.com"],# 只允许指定域名allow_credentials=True,allow_methods=["*"],allow_headers=["*"],)

7.3 配置 Firewalld (RHEL 10)

# 只开放必要端口sudofirewall-cmd--permanent--add-service=sshsudofirewall-cmd--permanent--add-service=httpsudofirewall-cmd--permanent--add-service=httpssudofirewall-cmd--reload# 查看当前规则sudofirewall-cmd --list-all

7.4 SELinux 配置 (RHEL 10 推荐)

建议不要完全关闭 SELinux,而是配置正确的安全上下文:

# 允许 Nginx 访问网络sudosetsebool-Phttpd_can_network_connect1# 允许 Nginx 访问后端端口sudosetsebool-Pnhttpd_can_network_connect1# 如果需要访问特定目录sudosemanage fcontext-a-thttpd_sys_rw_content_t"/root/xwzx-news(/.*)?"sudorestorecon-R/root/xwzx-news

八、快速部署脚本 (RHEL 10)

将以下脚本保存为deploy.sh并执行:

#!/bin/bashset-ePROJECT_DIR="/root"DB_NAME="news_app"DB_ROOT_PASS="MySQL@123"REDIS_VER="7.4.2"echo"=== XWZX News 部署脚本 (RHEL 10) ==="# 1. 安装系统依赖echo"[1/9] 安装系统依赖..."sudodnfinstall-ypython3-pipgitcurlunzipnginx gccmake# 2. 安装 MySQL 8.4.8echo"[2/9] 安装 MySQL 8.4.8..."curl-fsSLhttps://dev.mysql.com/get/mysql84-community-release-el10-2.noarch.rpm-omysql84-community.rpmsudodnfinstall-ymysql84-community.rpmsudodnfinstall-ymysql-community-serversudosystemctl start mysqldsudosystemctlenablemysqld# 3. 配置 MySQLecho"[3/9] 配置 MySQL..."echo"等待 MySQL 启动..."untilmysql-e"SELECT 1"&>/dev/null;dosleep2donesudomysql-e"CREATE DATABASE IF NOT EXISTS${DB_NAME}CHARACTER SET utf8mb4;"sudomysql-e"ALTER USER 'root'@'localhost' IDENTIFIED BY '${DB_ROOT_PASS}';"# 4. 导入数据库echo"[4/9] 导入数据库..."mysql-uroot-p"${DB_ROOT_PASS}"${DB_NAME}</root/database.sql# 5. 安装 Redis (源码编译)echo"[5/9] 安装 Redis..."cd/tmpcurl-fsSLhttps://github.com/redis/redis/archive/refs/tags/${REDIS_VER}.tar.gz-oredis-${REDIS_VER}.tar.gztarxzf redis-${REDIS_VER}.tar.gzcdredis-${REDIS_VER}make-j$(nproc)sudomakeinstallsudomkdir-p/etc/redissudocpredis.conf /etc/redis/sudosed-i's/^daemonize no/daemonize yes/'/etc/redis/redis.confsudosed-i's/^bind 127.0.0.1/bind 0.0.0/'/etc/redis/redis.conf /usr/local/bin/redis-server /etc/redis/redis.conf# 6. 创建 Python 虚拟环境echo"[6/9] 创建 Python 虚拟环境..."cd${PROJECT_DIR}/toutiao_backend python3-mvenv venv# 创建 requirements.txtcat>requirements.txt<<'EOF' fastapi==0.115.0 uvicorn[standard]==0.30.6 sqlalchemy==2.0.35 aiomysql==0.2.0 python-jose[cryptography]==3.3.0 passlib[bcrypt]==1.7.4 python-multipart==0.0.12 pydantic==2.9.2 pydantic-settings==2.5.2 bcrypt==3.2.2 redis EOF${PROJECT_DIR}/toutiao_backend/venv/bin/pipinstall-r${PROJECT_DIR}/toutiao_backend/requirements.txt# 7. 创建 systemd 服务echo"[7/9] 创建后端服务..."sudocat>/etc/systemd/system/xwzx-news-backend.service<<'EOF' [Unit] Description=XWZX News API Backend After=network.target mysqld.service [Service] User=root Group=root WorkingDirectory=/root/toutiao_backend ExecStart=/root/toutiao_backend/venv/bin/uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 Restart=always RestartSec=5 Environment="PYTHONPATH=/root/toutiao_backend" [Install] WantedBy=multi-user.target EOFsudosystemctl daemon-reloadsudosystemctlenablexwzx-news-backendsudosystemctl start xwzx-news-backend# 8. 安装 Node.js 并构建前端echo"[8/9] 构建前端..."curl-fsSLhttps://rpm.nodesource.com/setup_20.x|sudobash-sudodnfinstall-ynodejscd${PROJECT_DIR}/xwzx-newsnpminstallnpmrun buildsudorm-rf/usr/share/nginx/html/xwzx-newssudocp-r${PROJECT_DIR}/xwzx-news/dist /usr/share/nginx/html/xwzx-news# 9. 配置 Nginxecho"[9/9] 配置 Nginx..."sudocp/etc/nginx/nginx.conf /etc/nginx/nginx.conf.baksudocat>/etc/nginx/nginx.conf<<'NGINXCONF' user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /run/nginx.pid; events { worker_connections 1024; } http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; keepalive_timeout 65; types_hash_max_size 4096; include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 80; server_name _; root /usr/share/nginx/html/xwzx-news; index index.html; location / { try_files $uri $uri/ /index.html; } location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; } location /api/ { proxy_pass http://127.0.0.1:8000/api/; proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } } NGINXCONFsudosystemctlenablenginxsudonginx-t&&sudosystemctl restart nginxecho""echo"=== 部署完成 ==="echo"后端API: http://localhost:8000"echo"前端访问: http://服务器IP"

九、访问地址汇总

服务地址
后端 APIhttp://localhost:8000
API 文档http://localhost:8000/docs
前端应用http://服务器IP:80

如有问题,请检查日志:

# 后端sudojournalctl-uxwzx-news-backend-n50# Nginxsudotail-20/var/log/nginx/error.log
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/3 2:05:39

React Native样板工程解析:从架构设计到高效开发实践

1. 项目概述&#xff1a;一个为React Native应用开发提速的起点如果你正在或即将踏入React Native跨平台应用开发的世界&#xff0c;面对从零开始搭建项目时繁琐的配置、五花八门的库选择以及如何组织一个清晰、可维护的代码结构&#xff0c;那么一个高质量的“样板工程”&…

作者头像 李华
网站建设 2026/5/3 1:59:40

HPH构造全解析 两大关键看点

HPH身为高压液压系统至关重要的核心执行单元&#xff0c;其内部的具体构造对于整个设备的工作效率以及安全可靠性起着直接决定性的作用。深入理解HPH的构造意义重大&#xff0c;它不仅能够助力工程师在面对设备故障时迅速进行排查&#xff0c;还能够使得操作人员依据其构造特点…

作者头像 李华
网站建设 2026/5/3 1:52:26

为OpenClaw AI助手构建可观测性:基于Prometheus与Grafana的监控实践

1. 项目概述&#xff1a;为你的AI助手装上“仪表盘” 如果你正在使用OpenClaw这个强大的AI助手&#xff0c;那你一定遇到过这样的困惑&#xff1a;刚才那轮对话到底消耗了多少Token&#xff1f;这个月的API成本累计到多少了&#xff1f;我的缓存机制到底有没有在帮我省钱&…

作者头像 李华