ARTICLE DETAIL

资讯详情

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

阿里云低价服务器选购与部署实战全攻略

阿里云低价服务器选购与部署实战全攻略 这几天在各大平台刷到阿里云服务器的活动价格时确实有点“血压上来了”。1年28元、5年197.6元、10年397.5元……这个价位放在前几年简直不敢想。很多读者和我一样手里还留着前两年高价续费的旧机器对比现在的活动价确实会觉得“旧机器瞬间不香了”。不过价格只是第一步买到手之后怎么把机器用好、怎么配置环境、怎么部署应用才是真正有价值的内容。本文将围绕阿里云低价服务器的选购、初始化配置、开发环境搭建、常用部署示例和避坑经验展开帮你把一台便宜服务器真正用起来。文章适合以下读者刚接触云服务器想用低成本入门 Linux 和后端部署的同学。已经买了阿里云活动机型但不知道从哪开始配置的新手。想把手头老机器迁移到新机器或者希望降低服务器成本的个人开发者。需要在自己的服务器上搭建网站、API 服务、数据库、对象存储配合场景的开发者。读完本文你将掌握阿里云服务器选型思路、系统选择、首次登录与安全配置、JDK/MySQL/Nginx/Maven 等基础环境搭建方法、域名解析与 SSL 证书配置、常见问题排查套路以及长期使用中的成本与安全最佳实践。1. 低价服务器是什么为什么值得关注1.1 先聊聊阿里云服务器的定位阿里云服务器本质上是云上的虚拟机按 CPU、内存、带宽、存储等维度划分实例规格。和自建机房、买物理服务器相比它的优势是开箱即用、弹性扩缩容、按量付费或包年包月适合个人开发者、中小团队和各类业务场景。活动机型通常是阿里云为拉新和推广推出的入门款主要特征是配置偏低以 2核2G、2核4G 为主。带宽有限常见 3M 到 5M。价格力度大仅限新用户或指定活动页购买。续费价格通常比首购价格高这一点需要特别注意。理解这一点很重要低价是“入场券”不是“长期白菜价”。把机器用来学习、搭建个人网站、跑轻量级服务性价比非常高但如果指望它扛住大规模并发或者长期以首购价续费就不太现实。1.2 低价机型适合做什么根据真实使用场景阿里云低价服务器比较适合下面这些用途个人博客、文档站、导航页等轻量 Web 站点。Node.js、Java、Python、Go 等后端服务的开发测试环境。数据库学习、Redis 学习、Docker 实践环境。定时任务、爬虫脚本、消息推送、个人 API 代理等服务。搭建 Git 仓库、内网穿透服务端、远程开发环境。学习 Linux 运维、Nginx 配置、SSL 证书部署等技能。不适合的场景也很明确高并发线上业务、视频转码、大数据计算、AI 模型训练这些任务需要更高配置和专业产品低价入门机并不合适。1.3 购买前需要管理好的预期买便宜机器前先问自己三个问题我的业务对带宽和磁盘 IO 要求高吗我是否需要长期稳定运行还是短期学习测试我是否能接受首购优惠价与续费价之间存在差距把预期管理好之后使用起来就不会有心理落差。低价机器的核心价值是“低成本试错”和“快速上手云上环境”而不是替代生产级高可用架构。2. 阿里云服务器选型与购买实操2.1 轻量应用服务器 vs ECS 云服务器阿里云有两类常见产品容易混淆对比项轻量应用服务器ECS 云服务器定位简单易用适合单机应用功能全面适合复杂架构网络自带固定带宽简单专有网络 VPC更灵活管理控制台集成应用镜像更接近传统云主机管理扩展性有限强可搭配负载均衡、伸缩组价格活动价通常更低规格更多价格范围广如果你只是搭一个博客、学习环境或小型服务轻量应用服务器更省心如果你希望将来扩展成多台机器、使用 VPC 内的复杂网络选择 ECS 会更合适。2.2 地域怎么选地域决定了服务器的物理位置也影响访问延迟。原则如下主要用户在国内选择华北、华东、华南等大区即可。需要备案的网站服务器地域必须在中国内地否则无法正常使用 80/443 端口。如果只是海外业务或个人实验可以选择香港或海外地域但访问速度和稳定性需要实测。个人开发者通常选择与自己较近的国内地域比如北京、上海、杭州、深圳等延迟更低。2.3 系统镜像选择建议购买时可以选择操作系统镜像。常见选项有 Alibaba Cloud Linux、CentOS Stream、Ubuntu、Debian 等。我的建议是新手选 Alibaba Cloud Linux 3 或 Ubuntu 22.04/24.04。Alibaba Cloud Linux 是阿里云官方维护的发行版兼容 CentOS 生态云上支持好。Ubuntu 资料多、社区活跃适合自我学习和排查问题。不建议选择已停止维护的 CentOS 7 作为新项目系统除非业务有特殊兼容性要求。2.4 购买流程与价格提示购买流程一般为进入阿里云官网活动页或产品页。使用阿里云账号登录新用户需要完成实名认证。选择产品类型轻量应用服务器或 ECS、地域、镜像、带宽、购买时长。确认价格后提交订单并支付。关于价格需要注意活动价通常仅限新用户或指定活动不同时期价格不同。标题中的“1年28元、5年197.6元、10年397.5元”是特定活动环境下的价格示例实际以页面显示为准。购买时长越长单年均价越低但一次性投入也越多建议根据真实需求选择。到期后续费价格可能高于首购价购买前应查看续费规则。建议买前先对比不同时长总价再决定是买一年还是多年。3. 首次登录与系统基础配置3.1 获取服务器登录信息购买完成后在阿里云控制台找到“实例列表”可以看到公网 IP、操作系统等信息。首次登录需要重置实例密码或者使用密钥对登录。重置密码步骤在实例列表勾选目标实例。点击“重置实例密码”。设置符合要求的密码重启实例后生效。推荐使用密钥对登录安全性更高。可以在控制台“密钥对”功能中创建或导入公钥然后绑定到实例。3.2 使用终端登录服务器如果你的操作系统是 Windows可以使用系统自带的 PowerShell 或安装 Terminal 工具登录ssh root你的公网IP如果是 macOS 或 Linux直接在终端执行上面的命令即可。首次登录会提示确认主机指纹输入 yes 后继续然后输入密码。使用密钥登录时需要指定私钥文件ssh -i ~/.ssh/my_key.pem root你的公网IP登录成功后会看到类似下面的提示Welcome to Alibaba Cloud Linux [rootiZxxxxx ~]#3.3 更新系统与安装基础工具登录后第一步建议更新软件包索引并升级已有软件。如果系统是 Alibaba Cloud Linux 或 CentOS 系使用 yum或 dnfsudo yum update -y sudo yum install -y vim wget curl git tar如果系统是 Ubuntu 或 Debian使用 aptsudo apt update sudo apt upgrade -y sudo apt install -y vim wget curl git tar更新系统可以同步安全补丁减少已知漏洞风险。3.4 创建普通用户并配置 sudo长期使用 root 登录不是好习惯建议创建一个普通用户并授予 sudo 权限。创建一个名为 dev 的用户adduser dev usermod -aG wheel devUbuntu 系统下将用户加入 sudo 组usermod -aG sudo dev切换到新用户验证权限su - dev sudo whoami如果输出 root说明 sudo 配置生效。3.5 修改 SSH 配置提升安全性编辑 SSH 配置文件sudo vim /etc/ssh/sshd_config建议调整以下配置项PermitRootLogin no PasswordAuthentication yes这里注意如果你的机器只有密码登录关闭 root 登录前务必确保普通用户可以登录否则可能把自己锁在门外。修改后重启 sshd 服务sudo systemctl restart sshd安全提示生产环境建议关闭密码登录仅使用密钥登录。个人学习机可以保留密码登录但应设置高强度密码并定期更换。4. 常用开发环境部署低价服务器最常见的用途就是部署开发环境。下面以一台 2核2G 的 Alibaba Cloud Linux 3 机器为例演示 JDK、MySQL、Nginx、Maven 的安装与配置过程。4.1 安装 JDK推荐安装 OpenJDK 17 或 21。以 yum 安装为例sudo yum install -y java-17-openjdk-devel验证安装java -version javac -version输出类似openjdk version 17.0.12 2024-07-16 LTS OpenJDK Runtime Environment (Red Hat...) OpenJDK 64-Bit Server VM (build 17.0.127, mixed mode, sharing)如果你的项目使用的是 JDK 8可以改成安装 java-1.8.0-openjdk-devel。4.2 安装 MySQL 或 MariaDB低配机器上如果只是学习和测试推荐安装 MariaDB内存占用相对更小。安装 MariaDBsudo yum install -y mariadb-server sudo systemctl start mariadb sudo systemctl enable mariadb初始化数据库安全配置sudo mysql_secure_installation按提示设置 root 密码、移除匿名用户、禁止 root 远程登录视需要选择等。如果需要 MySQL 官方版本可以按阿里云镜像仓库配置方式安装步骤如下下载 MySQL 仓库包。使用 yum 安装 mysql-server。启动并初始化。这里需要注意MySQL 8.0 初始 root 密码通常记录在日志中第一次登录时需要用临时密码。查看方式sudo grep temporary password /var/log/mysqld.log然后使用临时密码登录再修改为新密码。4.3 安装 NginxNginx 常用作 Web 服务器和反向代理安装很简单sudo yum install -y nginx sudo systemctl start nginx sudo systemctl enable nginx启动后浏览器访问http://你的公网IP看到 Nginx 欢迎页即表示安装成功。如果访问不通先检查安全组是否放行了 80 端口具体操作见第 6 章。Nginx 默认站点根目录是/usr/share/nginx/html配置文件在/etc/nginx/nginx.conf子配置目录为/etc/nginx/conf.d/。部署自己的网站时建议在 conf.d 下新建配置文件而不要直接修改主配置。示例配置server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }这个配置将 80 端口请求转发到本机 8080 端口适用于部署 Spring Boot、Node.js 等后端服务。4.4 配置 Maven 阿里云镜像Maven 是 Java 项目常用的构建工具。安装 Maven 后国内开发者建议配置阿里云镜像仓库可以显著提升依赖下载速度。先安装 Mavensudo yum install -y maven查看安装版本mvn -vMaven 的全局配置文件一般在/etc/maven/settings.xml用户级配置在~/.m2/settings.xml。推荐在用户目录下创建配置文件mkdir -p ~/.m2 vim ~/.m2/settings.xml写入以下内容?xml version1.0 encodingUTF-8? settings xmlnshttp://maven.apache.org/SETTINGS/1.2.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd mirrors mirror idaliyunmaven/id namealiyun maven mirror/name urlhttps://maven.aliyun.com/repository/public/url mirrorOfcentral/mirrorOf /mirror /mirrors /settings配置后使用mvn compile或mvn package构建项目时依赖会从阿里云镜像下载速度提升非常明显。4.5 部署一个 Spring Boot 示例应用这一步用一个小型 Spring Boot 项目演示从构建到运行的全过程。假设你在本地或服务器上有一个 Spring Boot 项目项目结构如下myapp ├── pom.xml └── src/main/java/com/example/MyApp.javapom.xml 核心内容parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.3.4/version /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build主类package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; SpringBootApplication RestController public class MyApp { public static void main(String[] args) { SpringApplication.run(MyApp.class, args); } GetMapping(/) public String hello() { return Hello from Aliyun Server!; } }在项目根目录执行打包mvn clean package打包成功后运行java -jar target/myapp-0.0.1-SNAPSHOT.jar服务默认启动在 8080 端口。为了验证在本地或服务器上执行curl http://127.0.0.1:8080/返回Hello from Aliyun Server!即表示 Java 服务部署成功。以后台方式运行服务nohup java -jar target/myapp-0.0.1-SNAPSHOT.jar app.log 21 查看日志tail -f app.log4.6 使用 systemd 管理 Java 服务生产环境推荐使用 systemd 管理服务方便开机自启、崩溃重启和日志查看。创建服务文件sudo vim /etc/systemd/system/myapp.service内容[Unit] DescriptionMy Spring Boot App Afternetwork.target [Service] Userdev WorkingDirectory/home/dev/myapp ExecStart/usr/bin/java -jar /home/dev/myapp/myapp-0.0.1-SNAPSHOT.jar SuccessExitStatus143 Restartalways RestartSec10 [Install] WantedBymulti-user.target重新加载 systemd 配置并启动sudo systemctl daemon-reload sudo systemctl start myapp sudo systemctl enable myapp查看服务状态sudo systemctl status myapp如果代码更新重新打包后重启服务即可。5. 安全组、域名解析与 SSL 配置5.1 安全组放行端口阿里云的安全组相当于云防火墙控制哪些端口对外开放。默认情况下SSH22端口可能已放行但 HTTP80、HTTPS443需要手动配置。操作步骤实例详情页找到“安全组”标签页。点击“管理规则”或“配置规则”。添加入方向规则放行 80、443 端口。示例规则协议端口授权对象说明TCP800.0.0.0/0HTTPTCP4430.0.0.0/0HTTPSTCP22你的本机公网 IPSSH尽量限制来源不建议将数据库端口如 3306直接暴露到公网数据库只在本地访问更安全。5.2 域名解析配置如果你有自己的域名可以在阿里云“域名解析 DNS”控制台添加解析记录。常见记录类型A 记录将域名指向服务器 IPv4 地址。CNAME 记录将域名指向另一个域名。MX 记录邮件服务器相关。示例 A 记录主机记录记录类型记录值A你的公网IPwwwA你的公网IP配置完成后执行ping yourdomain.com如果解析生效会看到返回的服务器 IP。5.3 SSL 证书申请与免费续期现在很多平台对 HTTPS 的支持非常方便。阿里云提供免费的 SSL 证书服务可以按以下步骤操作在阿里云控制台搜索“SSL 证书”。申请免费证书绑定你的域名。按照提示完成域名验证。签发后下载证书文件。部署到 Nginx。以 Nginx 部署为例将证书文件上传到服务器比如/etc/nginx/ssl/然后在 Nginx 配置中添加server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/nginx/ssl/yourdomain.com.pem; ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; location / { proxy_pass http://127.0.0.1:8080; } } server { listen 80; server_name yourdomain.com; return 301 https://$host$request_uri; }重载 Nginxsudo nginx -t sudo systemctl reload nginx关于免费证书续期部分免费证书有效期只有 90 天左右到期前需要重新申请或开启自动续期。建议在控制台开启相关的证书到期提醒避免证书过期导致网站无法访问。如果你的证书是免费的 DV 证书通常不支持通配符域名每个子域名需要单独申请。5.4 配置 Uptime 监控服务器自己挂了你可能不知道最简单的方式是借助第三方监控服务。比如用云监控产品或自己写一个简单的定时任务来检查端口连通性。一个简单的 shell 脚本#!/bin/bash URLhttps://yourdomain.com status$(curl -o /dev/null -s -w %{http_code} $URL) if [ $status ! 200 ]; then echo Site is down! Status: $status # 这里可以接入钉钉、飞书、企业微信等通知 fi配合 crontab 定时执行crontab -e */1 * * * * /home/dev/check_site.sh这样即使人不在电脑前也能及时发现服务异常。6. 对象存储 OSS 与常见搭配6.1 为什么需要 OSS低配服务器的磁盘空间有限不适合存放大量图片、视频、备份文件。阿里云对象存储 OSSObject Storage Service价格低、容量弹性大是服务器存储配套的常用方案。常见使用场景网站静态资源图片、CSS、JS 等。日志备份。数据库备份文件。用户上传文件。6.2 OSS 基本概念OSS 中的几个核心概念Bucket存储空间相当于顶层文件夹。Object对象即文件。Endpoint访问域名不同地域不同。AccessKey访问 API 时使用的密钥。创建 Bucket 时建议地域选择与服务器相同或就近。读写权限按需设置为“私有”或“公共读”。开启服务端加密提高安全性。6.3 使用 ossutil 客户端阿里云提供了命令行工具 ossutil适合在服务器上管理 OSS 文件。安装方式以 Linux 为例curl -L https://gosspublic.alicdn.com/ossutil/ossutil_linux_amd64.zip -o ossutil.zip unzip ossutil.zip sudo mv ossutil /usr/local/bin/ ossutil --version配置 AccessKeyossutil config按提示输入 Endpoint、AccessKey ID、AccessKey Secret。常用命令# 上传文件 ossutil cp localfile.txt oss://bucket-name/ # 下载文件 ossutil cp oss://bucket-name/remotefile.txt ./ # 同步目录 ossutil sync ./localdir oss://bucket-name/remotedir/AccessKey 属于高权限凭证建议使用 RAM 子用户 AccessKey并只授予所需 Bucket 的最小权限。不要把 AccessKey 写在公共代码仓库中。6.4 Java 中使用 OSS SDK后端服务中经常需要对接 OSS。以 Java 为例先在 pom.xml 中添加依赖dependency groupIdcom.aliyun.oss/groupId artifactIdaliyun-sdk-oss/artifactId version3.17.4/version /dependency上传文件示例import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; public class OssUploader { public static void main(String[] args) { String endpoint https://oss-cn-hangzhou.aliyuncs.com; String accessKeyId yourAccessKeyId; String accessKeySecret yourAccessKeySecret; String bucketName your-bucket-name; OSS ossClient new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret); try { ossClient.putObject(bucketName, test.txt, new java.io.File(/path/to/test.txt)); System.out.println(upload success); } finally { ossClient.shutdown(); } } }注意实际项目中 AccessKey 应通过环境变量或配置中心管理不要硬编码在代码里。7. 常见问题与排查思路7.1 常见问题表格问题现象常见原因解决思路无法通过 SSH 连接安全组未放行 22 端口检查安全组规则确认 22 端口放行SSH 连接超时公网 IP 变化、本地网络限制确认实例公网 IP测试本机网络ping 不通服务器ICMP 未放行或以上问题安全组放行 ICMP用 telnet 测试端口网站 80 端口无法访问安全组未放行 80添加入方向规则放行 TCP 80Nginx 启动失败配置文件语法错误、端口被占用先执行 nginx -t再查看错误日志JDK 版本与项目不匹配安装了错误版本使用 update-alternatives 切换版本Maven 下载依赖慢未使用国内镜像配置阿里云 Maven 镜像仓库MySQL 无法登录初始密码或权限问题查看日志获取临时密码重置 root 密码服务重启后不自动运行未配置 systemd编写 systemd unit 文件并设置 enable域名解析不生效DNS 缓存或记录错误使用 dig 命令查询等待 DNS 生效7.2 SSH 登录失败排查按以下顺序排查在控制台确认实例运行状态是“运行中”。确认公网 IP 没有变化换绑弹性 IP 后需使用新 IP。本地执行ssh -v rootIP查看详细日志。检查安全组是否放行了 22 端口。如果使用密码登录确认密码已经重置且实例已重启。如果使用密钥登录确认私钥文件权限为 600。7.3 Nginx 无法启动排查先检查配置是否正确sudo nginx -t如果提示端口被占用查看端口占用进程sudo ss -tlnp | grep :80查看 Nginx 错误日志sudo tail -f /var/log/nginx/error.log7.4 MySQL 远程连接失败默认情况下MySQL 只允许本地访问。如果你的目的是从本机远程连接数据库需要修改用户权限但生产环境非常不建议这么做。正确做法是用 SSH 隧道连接或者使用 DMS 等数据库管理工具通过安全通道连接。个人学习场景下可以通过以下方式临时开启。登录 MySQLsudo mysql -uroot -p修改用户权限示例ALTER USER rootlocalhost IDENTIFIED BY 你的密码; CREATE USER dev% IDENTIFIED BY 你的密码; GRANT ALL PRIVILEGES ON *.* TO dev%; FLUSH PRIVILEGES;同时确保安全组没有把 3306 对公网开放。远程访问数据库最安全的方式是走代理或隧道而不是直接暴露端口。7.5 磁盘空间不足低价服务器默认磁盘容量一般不大40G 或 60G 很常见。磁盘空间不足时可以做以下排查df -h du -sh ~/* sudo journalctl --vacuum-size100M sudo apt clean建议定期清理日志、临时文件和旧内核包。如果是 Docker 环境还需要清理无用镜像docker system prune -a -f8. 最佳实践与降本建议8.1 账号安全最佳实践以下几条建议非常重要无论服务器多便宜安全都不能放松使用 RAM 子账号管理控制台不用主账号 AccessKey。为服务器创建独立用户避免长期使用 root 操作。开启 SSH 密钥登录并考虑关闭密码登录。开启阿里云的多因素认证MFA。定期更新系统补丁。关键数据定期备份到 OSS。8.2 成本控制建议低价服务器虽然便宜但如果使用不当还是会有一些额外费用。比如带宽超出套餐后会产生流量费用。磁盘快照超出免费额度会收费。公网 IP 数量超过免费配额会产生费用。备份和对象存储的存储量、请求次数也涉及费用。建议购买前确认套餐包含的流量额度。在费用中心设置预算预警。清理不再使用的快照、镜像和未关联的弹性 IP。长期不用的实例可以备份数据后释放。8.3 运维可维护性建议低配服务器的核心是稳定和简单。以下做法能提升可维护性统一使用 systemd 管理应用服务不裸跑 nohup。服务日志统一输出到固定目录便于排查。使用 Docker 时固定镜像版本不用 latest 标签。数据库、配置、代码分离不把密钥写在代码里。定期记录变更内容避免“改完忘了改了什么”。8.4 老机器迁移思路如果你手里还有一台旧机器看到新机器便宜想换过去可以按下面的思路迁移在新服务器上搭好同样的环境和应用版本。导出旧机器上的数据库数据导入新机器。同步静态文件和配置。修改域名解析到新 IP。观察一段时间后再释放旧实例。迁移前建议先做完整备份尤其是数据库数据。不要一边迁移一边释放旧机器确认新环境稳定后再回收旧资源。8.5 升级路径规划低价机器不可能永远满足需求。如果后续业务增长可以考虑升级实例配置阿里云支持部分实例规格升级。增加带宽按业务需要提升带宽。使用负载均衡将多台机器组成集群。使用 RDS 数据库把数据库从自建 MySQL 迁到云数据库减少运维成本。使用容器服务将应用容器化便于扩缩容。升级过程中注意评估迁移成本。早期架构设计得简单清晰之后迁移就会轻松很多。9. 总结阿里云低价服务器的价值不只是“便宜”两个字。它让更多个人开发者、学生和小团队能以极低成本接触云上环境跑起自己的网站、API、数据库和自动化任务。这篇文章从选型、购买、首次登录、开发环境搭建到域名解析、SSL 配置、OSS 搭配、常见问题排查再到安全和成本最佳实践覆盖了一台低配服务器从买来到稳定运行的大部分场景。真正重要的是把机器用起来在上面跑一个 Spring Boot 服务、部署一个 Nginx 站点、配好 Maven 镜像、把数据库备份到 OSS。这些动手过程积累下来的经验比单纯追求配置高低更有价值。如果你也入手了低价服务器可以从最简单的目标开始先让一个页面能在公网访问再逐步加入域名、HTTPS、数据库和对象存储。遇到问题就按文章里的排查思路走一遍慢慢就会形成自己的运维节奏。最后整理几条最关键的提醒安全组规则要按需最小开放数据库端口不要对公网暴露。AccessKey 和密码不要写进代码仓库。续费价格可能高于首购价购买前先看清楚规则。便宜机器适合轻量业务不要拿它硬扛高并发生产环境。定期备份数据磁盘快照和 OSS 都是成本很低的安全网。如果本文对你有帮助欢迎收藏备用也欢迎在评论区交流你的使用经验和踩坑经历。
返回列表