ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

阿里云服务器部署指南

阿里云服务器部署指南 阿里云服务器部署指南本文档详细记录 EvanSite 项目从服务器购买到项目上线的完整流程。项目技术栈.NET 10 Web API React ArcoDesign PostgreSQL Nginx系统部署架构下图展示了 EvanSite 的整体部署架构客户端通过 Nginx 访问前端静态资源Nginx 将 API 请求反向代理到后端服务后端再连接 PostgreSQL 数据库。阿里云 ECS 服务器客户端PostgreSQL 16后端服务EvanSite.Api (Systemd)Nginx 反向代理反向代理ADO.NET/Npgsql读写数据HTTP/HTTPS 请求静态文件(HTML/CSS/JS/图片)/api/ 请求浏览器静态资源/var/www/evansite/wwwroot/api/ 反向代理ASP.NET Core Web API监听 127.0.0.1:5000evansite 数据库127.0.0.1:5432目录一、阿里云 ECS 创建二、服务器环境配置三、安装 .NET 10 Runtime四、安装 PostgreSQL 16五、安装 Nginx六、本地构建项目七、上传与部署八、配置 Systemd 服务九、配置 Nginx 反向代理十、域名与 HTTPS 配置十一、一键部署脚本使用十二、日常运维常见问题排查一、阿里云 ECS 创建1.1 购买实例配置项推荐值操作系统Alibaba Cloud Linux 3基于 RHEL 8规格2vCPU 4GB 及以上存储系统盘 40GB ESSD公网 IP必须勾选1.2 安全组配置在ECS 控制台 → 安全组中添加以下入方向规则协议端口来源说明TCP800.0.0.0/0HTTP 访问TCP4430.0.0.0/0HTTPS 访问TCP22你的IP/32SSH 登录⚠️ PostgreSQL 5432 端口不要对公网开放仅需本地访问。1.3 登录服务器sshroot你的服务器公网IP# 例如: ssh root47.116.26.64二、服务器环境配置2.1 系统更新sudoyum update-y2.2 安装常用工具sudoyuminstall-ywgetcurlvimtarunzip三、安装 .NET 10 Runtime3.1 下载安装脚本cd/tmpwgethttps://dot.net/v1/dotnet-install.shchmodx dotnet-install.sh3.2 安装 Runtime# 安装 .NET 10 ASP.NET Core Runtime./dotnet-install.sh--channel10.0--runtimeaspnetcore3.3 配置环境变量# 创建 dotnet 公共目录sudocp-r/root/.dotnet /usr/local/share/dotnetsudochmod-R755/usr/local/share/dotnet# 配置 PATHechoexport PATH$PATH:/usr/local/share/dotnet~/.bashrcechoexport DOTNET_ROOT/usr/local/share/dotnet~/.bashrcsource~/.bashrc3.4 验证安装dotnet--info输出应包含.NET runtimes installed: Microsoft.AspNetCore.App 10.0.xx [...] Microsoft.NETCore.App 10.0.xx [...]四、安装 PostgreSQL 164.1 安装 PostgreSQL# 安装 PostgreSQL 官方仓库sudoyuminstall-yhttps://download.postgresql.org/pub/repos/yum/reporpms/EL-8-16-3.29-4.0.noarch.rpm# 安装sudoyuminstall-ypostgresql16-server postgresql16-contrib4.2 初始化数据库# 数据目录通常已存在检查一下ls/var/lib/pgsql/16/data/# 如果目录为空手动初始化sudo/usr/pgsql-16/bin/initdb-D/var/lib/pgsql/16/data4.3 启动 PostgreSQLsudosystemctlenablepostgresql-16sudosystemctl start postgresql-16sudosystemctl status postgresql-164.4 创建用户和数据库sudo-upostgres /usr/pgsql-16/bin/psql在 psql 中执行CREATEUSERevansite_userWITHPASSWORD你的强密码;CREATEDATABASEevansite OWNER evansite_user;GRANTALLPRIVILEGESONDATABASEevansiteTOevansite_user;\q4.5 配置密码认证sudovi/var/lib/pgsql/16/data/pg_hba.conf在文件中找到local all all peer行在其下方添加host evansite evansite_user 127.0.0.1/32 md5保存退出:wq重启sudosystemctl restart postgresql-164.6 测试连接/usr/pgsql-16/bin/psql-Uevansite_user-devansite-h127.0.0.1-p5432# 输入密码能进入就成功\q 退出五、安装 Nginx5.1 安装并启动sudoyuminstall-ynginxsudosystemctlenablenginxsudosystemctl start nginx# 验证curlhttp://127.0.0.1# 应返回 Nginx 欢迎页面5.2 确认 nginx 用户idnginx# 应显示 nginx 用户信息六、本地构建项目6.1 环境要求工具版本要求.NET SDK10.0Node.js186.2 安装 .NET 10 SDKWindows访问 https://dotnet.microsoft.com/download/dotnet/10.0下载SDK的 Windows x64 版本双击安装一路默认重新打开终端验证dotnet --version6.3 安装 Node.jsWindows访问 https://nodejs.org/下载 LTS 版本双击安装一路默认验证node --version npm --version6.4 构建项目在 CMD 中执行:: 1. 构建后端 cd /d d:\Work_Project\Site\EvanSite\backend\EvanSite.Api dotnet restore dotnet publish -c Release -o ../../deploy/output/backend :: 2. 构建前端 cd /d d:\Work_Project\Site\EvanSite\frontend\evansite-web npm install npm run build :: 3. 合并产物 cd /d d:\Work_Project\Site\EvanSite\deploy\output if exist backend\wwwroot rmdir /s /q backend\wwwroot xcopy /e /i /y ..\..\frontend\evansite-web\dist backend\wwwroot mkdir backend\wwwroot\uploads\icons 2nul :: 4. 打包 cd backend tar -czf ..\evansite-deploy.tar.gz . cd .. :: 5. 查看产物 dir *.tar.gz七、上传与部署7.1 上传发布包scp d:\Work_Project\Site\EvanSite\deploy\output\evansite-deploy.tar.gz root你的服务器IP:/tmp/7.2 服务器上部署# 停止旧服务sudosystemctl stop evansite# 创建目录sudomkdir-p/var/www/evansite/wwwroot/uploads/icons# 解压部署包cd/tmpsudotar-xzfevansite-deploy.tar.gz# 复制文件sudocp-rbackend/* /var/www/evansite/# 设置权限sudochown-Rnginx:nginx /var/www/evansitesudochmod-R755/var/www/evansitesudochmod-R775/var/www/evansite/wwwroot/uploads# 验证关键文件ls/var/www/evansite/EvanSite.Api.dllls/var/www/evansite/appsettings.jsonls/var/www/evansite/wwwroot/index.html7.3 配置 appsettings.jsonsudovi/var/www/evansite/appsettings.json确保以下配置正确{ConnectionStrings:{DefaultConnection:Host127.0.0.1;Port5432;Databaseevansite;Usernameevansite_user;Password你的数据库密码;},Jwt:{Secret:请替换为至少32字符的随机密钥,Issuer:EvanSite,Audience:EvanSite,ExpireMinutes:10080},Cors:{AllowedOrigins:[http://你的服务器IP,https://你的域名]}} 生成 JWT 密钥openssl rand -base64 647.4 测试后端运行cd/var/www/evansite /usr/local/share/dotnet/dotnet EvanSite.Api.dll看到以下输出说明成功Now listening on: http://127.0.0.1:5000 Application started. Press CtrlC to shut down.按CtrlC停止。7.5 测试 APIcurlhttp://127.0.0.1:5000/api/portal/icons返回 JSON 数据说明后端正常。八、配置 Systemd 服务8.1 创建服务文件sudotee/etc/systemd/system/evansite.service/dev/nullEOF [Unit] DescriptionEvanSite Web API Afternetwork.target postgresql-16.service Wantspostgresql-16.service [Service] WorkingDirectory/var/www/evansite ExecStart/usr/local/share/dotnet/dotnet /var/www/evansite/EvanSite.Api.dll Restartalways RestartSec10 KillSignalSIGINT Usernginx Groupnginx EnvironmentASPNETCORE_ENVIRONMENTProduction EnvironmentASPNETCORE_URLShttp://127.0.0.1:5000 [Install] WantedBymulti-user.target EOF8.2 启动服务sudosystemctl daemon-reloadsudosystemctlenableevansitesudosystemctl start evansitesudosystemctl status evansite看到active (running)说明成功。8.3 查看实时日志sudojournalctl-uevansite-f8.4 常用服务命令sudosystemctl start evansite# 启动sudosystemctl stop evansite# 停止sudosystemctl restart evansite# 重启sudosystemctl status evansite# 查看状态sudojournalctl-uevansite-n50# 查看最近50行日志九、配置 Nginx 反向代理9.1 创建站点配置sudotee/etc/nginx/conf.d/evansite.conf/dev/nullEOF server { listen 80; server_name _; # Gzip 压缩 gzip on; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xmlrss text/javascript image/svgxml; gzip_min_length 1000; gzip_comp_level 6; # 前端静态文件 root /var/www/evansite/wwwroot; index index.html; # SPA 路由支持 location / { try_files $uri $uri/ /index.html; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|webp)$ { expires 30d; add_header Cache-Control public, immutable; } # 后端 API 反向代理 location /api/ { proxy_pass http://127.0.0.1:5000; 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; client_max_body_size 10m; proxy_read_timeout 120s; } # 上传文件访问 location /uploads/ { alias /var/www/evansite/wwwroot/uploads/; expires 7d; } # 健康检查 location /health { access_log off; return 200 OK; } } EOF9.2 移除默认配置sudorm-f/etc/nginx/conf.d/default.confsudorm-f/etc/nginx/sites-enabled/default9.3 测试并重载sudonginx-t# 输出: syntax is ok, test is successfulsudosystemctl reload nginx9.4 验证部署# 测试首页curlhttp://127.0.0.1# 应返回 HTML 内容# 测试 API通过 Nginx 代理curlhttp://127.0.0.1/api/portal/icons# 应返回 JSON 数据# 测试健康检查curlhttp://127.0.0.1/health# 应返回 OK9.5 公网访问在本地电脑浏览器打开http://你的服务器IP应看到 EvanSite 门户首页。十、域名与 HTTPS 配置10.1 域名解析在阿里云域名控制台添加A 记录记录类型主机记录记录值A你的服务器IPAwww你的服务器IP等待 DNS 生效后验证# 在本地电脑执行ping你的域名10.2 申请 HTTPS 证书# 安装 Certbotsudoyuminstall-ycertbot python3-certbot-nginx# 申请证书替换为你的域名sudocertbot--nginx-d你的域名-dwww.你的域名# 按提示操作# 1. 输入邮箱# 2. 同意服务条款# 3. 选择是否强制 HTTPS推荐RedirectCertbot 会自动配置 Nginx添加 SSL 监听和 HTTP→HTTPS 重定向。10.3 测试自动续期sudocertbot renew --dry-run十一、一键部署脚本使用11.1 构建脚本Windowscd d:\Work_Project\Site\EvanSite\deploy\scripts build.bat11.2 部署脚本Windowscd d:\Work_Project\Site\EvanSite\deploy\scripts # 使用默认服务器 deploy.bat # 或指定其他服务器 deploy.bat 192.168.1.10011.3 构建部署Linux/Maccddeploy/scripts# 构建bashbuild.sh# 部署bashdeploy.sh11.4 手动部署流程如果脚本不可用手动执行# 1. 本地打包cd/d d:\Work_Project\Site\EvanSite\deploy\outputtar-czfevansite-deploy.tar.gz-Cbackend.# 2. 上传scpevansite-deploy.tar.gz root你的服务器IP:/tmp/# 3. 服务器部署sshroot你的服务器IPsudosystemctl stop evansitecd/tmpsudotar-xzfevansite-deploy.tar.gzsudocp-rbackend/* /var/www/evansite/sudochown-Rnginx:nginx /var/www/evansitesudochmod-R755/var/www/evansitesudochmod-R775/var/www/evansite/wwwroot/uploads/iconssudosystemctl start evansitesudosystemctl reload nginx十二、日常运维12.1 查看服务状态# 后端服务sudosystemctl status evansite# Nginxsudosystemctl status nginx# PostgreSQLsudosystemctl status postgresql-1612.2 查看日志# 后端日志sudojournalctl-uevansite-f# Nginx 访问日志sudotail-f/var/log/nginx/access.log# Nginx 错误日志sudotail-f/var/log/nginx/error.log# PostgreSQL 日志sudotail-f/var/lib/pgsql/16/data/log/postgresql-*.log12.3 数据库备份# 备份数据库/usr/pgsql-16/bin/pg_dump-Uevansite_user-devansite-h127.0.0.1/tmp/evansite_backup_$(date%Y%m%d).sql# 恢复数据库/usr/pgsql-16/bin/psql-Uevansite_user-devansite-h127.0.0.1/tmp/evansite_backup_20260825.sql12.4 上传文件备份# 备份上传的图标tar-czfevansite_uploads_backup_$(date%Y%m%d).tar.gz /var/www/evansite/wwwroot/uploads/12.5 更新版本# 1. 本地构建新版本build.bat# 2. 上传并部署deploy.bat# 3. 或者手动# scp 上传包# ssh 执行部署命令12.6 重启所有服务sudosystemctl restart postgresql-16sudosystemctl restart evansitesudosystemctl reload nginx常见问题排查Q1: 后端服务启动失败203/EXEC 错误原因dotnet 在/root目录下nginx 用户无法访问。解决# 复制 dotnet 到公共目录sudocp-r/root/.dotnet /usr/local/share/dotnetsudochmod-R755/usr/local/share/dotnet# 修改 systemd 服务文件sudovi/etc/systemd/system/evansite.service# 将 ExecStart 改为:# ExecStart/usr/local/share/dotnet/dotnet /var/www/evansite/EvanSite.Api.dll# 重启服务sudosystemctl daemon-reloadsudosystemctl restart evansiteQ2: 403 Forbidden 错误原因Nginx 无法访问文件目录。解决# 检查权限ls-la/var/www/evansite/wwwroot/index.htmlsudo-unginxcat/var/www/evansite/wwwroot/index.html# 修复权限sudochown-Rnginx:nginx /var/www/evansitesudochmod-R755/var/www/evansitesudochmod-R775/var/www/evansite/wwwroot/uploadsQ3: 数据库连接失败解决# 检查 PostgreSQL 状态sudosystemctl status postgresql-16# 测试连接/usr/pgsql-16/bin/psql-Uevansite_user-devansite-h127.0.0.1-p5432# 检查 pg_hba.conf 配置cat/var/lib/pgsql/16/data/pg_hba.conf|grepevansite# 重启 PostgreSQLsudosystemctl restart postgresql-16Q4: 前端刷新 404原因SPA 路由未正确配置。解决确认 Nginx 配置包含location / { try_files $uri $uri/ /index.html; }Q5: 上传文件失败解决# 检查上传目录权限ls-la/var/www/evansite/wwwroot/uploads/sudochmod775/var/www/evansite/wwwroot/uploads/iconsQ6: 端口被占用# 检查端口占用sudonetstat-tlnp|grep5000sudonetstat-tlnp|grep80# 杀掉占用进程sudofuser-k5000/tcpsudofuser-k80/tcp服务器信息记录项目值服务器 IP你的服务器IP操作系统Alibaba Cloud Linux 3SSH 端口22HTTP 端口80HTTPS 端口443数据库PostgreSQL 16数据库名evansite数据库用户evansite_user后端端口5000内部项目路径/var/www/evansite运行用户nginx
返回列表