
拿到一台新的云主机,头一件事是确认自己能连得进去,第二件事是让别人不那么容易连进去。网站能不能打开,反而排在后面。这篇教程按这个顺序往下走:从购买前的准备,到登录、安全初始化、安装环境、绑定域名和HTTPS,再到验收和备份。
先说明几件事。控制台的操作界面各家不同,而且会改版,文中不写具体按钮,只讲每一步要做什么。命令以Ubuntu或Debian系的Linux为例,用其他发行版的话,包管理命令要自行替换。域名、IP、密码等位置用示例占位,请替换成自己的。
决定于应用的运行环境、你习惯的管理方式,以及软件的兼容性。WordPress、Node.js、Python、Java这类网站和服务,在Linux上部署最常见,资源占用也相对小,教程和社区资料更多。如果程序依赖ASP.NET、MSSQL等Windows技术栈,或者团队更习惯图形界面,则选Windows。拿不准的新手,建议选Linux。
域名要已经注册好,并且你能登录域名所在的DNS管理后台,后面要添加解析记录。网站程序也提前准备好:静态网站的文件,或者WordPress的安装包,或者自己业务程序的代码。
一个访问量不大的静态站或博客,低配置就能起步。WordPress加上几个插件,内存不要太小,数据库和PHP都要占用。自有业务程序,按预估的并发量和数据库负载来选。起步配置不用一步到位,云主机后续大多可以升级。
Linux建议用SSH密钥登录,比密码更安全。在自己电脑上先生成一对密钥:
ssh-keygen -t ed25519 -C "your_email@example.com"
生成后,公钥(.pub文件)在购买时上传到控制台,私钥只留在自己电脑上,不要发给任何人。Windows主机则需要准备好远程桌面使用的账号和一个足够强的密码。
在服务商的控制台里创建实例,需要依次确认下面几项,每家的界面不同,但项目大同小异:
地域:选择“中国香港”。
实例规格:根据前面的评估选择CPU和内存。
操作系统镜像:选一个你熟悉的系统镜像,新手可以选Ubuntu的长期支持版本。
磁盘:系统盘容量留有余量,数据较多的话考虑单独的数据盘。
网络与公网IP:确认带宽类型和计费方式,是固定带宽还是按流量,避免之后账单超预期。
付费模式:包年包月和按量付费的区别,新手可以先用按月测试,稳定后再转长周期。
创建完成后,在控制台记下实例的公网IP,下面的步骤都要用到。
新开的云主机直接暴露在公网上,登录成功之后,应该马上做一轮安全初始化,而不是先装网站。
Linux:通过SSH登录。在自己的电脑上执行:
ssh -i ~/.ssh/id_ed25519 root@公网IP
第一次连接会提示确认服务器指纹,输入yes即可。如果服务商给的是初始密码,登录后先修改它。
先更新系统补丁:
apt update && apt upgrade -y
创建一个日常使用的普通用户,不要一直用root:
adduser deploy
usermod -aG sudo deploy
把你的公钥放到这个用户的~/.ssh/authorized_keys里,然后在另一个终端窗口测试能否以deploy用户通过密钥登录。确认可用之后,再收紧SSH配置,编辑/etc/ssh/sshd_config:
PermitRootLogin no
PasswordAuthentication no
保存后重启SSH服务(Ubuntu上服务名是ssh,部分发行版是sshd):
sudo systemctl restart ssh
修改SSH配置时,请务必保留一个已登录的窗口,并在新窗口里验证能登录之后再关闭旧窗口,否则配置写错会把自己锁在服务器外面。
Windows:通过RDP登录。使用系统自带的远程桌面连接,输入公网IP和账号。登录之后,修改默认凭证,安装系统更新,并在安全组中把远程桌面端口(默认3389)的来源限制在自己的IP,不要对全部公网开放。
配置安全组和防火墙,只开放业务需要的端口。网站通常只需要80和443,SSH的22端口,建议限制为自己的固定IP来访问。先在控制台的安全组里设置,再在系统里加一层防火墙:
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
一定要先放行SSH再启用防火墙。数据库的3306端口、远程管理端口,不要无条件开放给所有公网地址,数据库只需要本机访问的话,就不需要对外开放。
静态网站只需要一个Web服务。安装Nginx,并准备站点目录和默认页面:
sudo apt install nginx -y
sudo mkdir -p /var/www/example.com
echo "<h1>hello</h1>" | sudo tee /var/www/example.com/index.html
新建一个站点配置文件,比如/etc/nginx/conf.d/example.com.conf:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
}
检查配置无误后重新加载:
sudo nginx -t && sudo systemctl reload nginx
WordPress需要Web服务、PHP运行环境和数据库,常见的组合是Nginx、PHP-FPM和MariaDB:
sudo apt install nginx mariadb-server php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip -y
接着创建数据库和专用的数据库用户,权限只给到这一个库。进入数据库命令行(sudo mysql)后执行:
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY '换成一个强密码';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
下载WordPress,放到站点目录,并设置文件属主:
cd /tmp && curl -O https://wordpress.org/latest.tar.gz
tar xzf latest.tar.gz
sudo mkdir -p /var/www/example.com
sudo cp -a wordpress/. /var/www/example.com/
sudo chown -R www-data:www-data /var/www/example.com
Nginx的站点配置里需要加上PHP的处理规则。其中php-fpm的socket路径带版本号,以实际安装的版本为准,可以用ls /run/php/查看:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
}
然后把wp-config-sample.php复制为wp-config.php,填入刚才创建的数据库名、用户名和密码,数据库地址填localhost。之后在浏览器里访问域名,按页面提示完成WordPress的安装。
按程序使用的技术栈安装对应的运行环境,比如Node.js、Python或Java。这里要分清开发依赖和生产环境依赖:生产服务器只安装运行所需的依赖,比如Node项目使用npm ci --omit=dev,Python项目放在虚拟环境里安装requirements.txt,不要把开发和测试用的工具一并装上。
程序不要用root用户运行,也不要直接对公网暴露应用的端口。比较稳妥的做法是用systemd托管程序,再由Nginx反向代理。一个最简单的服务文件示例(/etc/systemd/system/app.service):
[Unit]
Description=my app
After=network.target
[Service]
User=deploy
WorkingDirectory=/srv/app
ExecStart=/usr/bin/node server.js
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload && sudo systemctl enable --now app
到域名的DNS管理后台,添加一条A记录,主机记录填@,记录值填云主机的公网IP;需要www访问的话,再加一条www的记录,指向同一个IP,或者用CNAME指向主域名。解析生效需要一段时间,可以用下面的命令检查:
dig +short example.com
返回的结果是你的公网IP,就说明解析已经生效。关于备案,服务器位于香港通常不涉及工信部的ICP备案,但相关要求以服务商说明和主管部门的规定为准。
解析生效后,申请证书。Let’s Encrypt的免费证书配合certbot,是最常见的做法:
sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d example.com -d www.example.com
按提示操作,certbot会自动修改Nginx配置、安装证书,并可以选择把HTTP自动跳转到HTTPS。证书的有效期较短,需要定期续期,certbot一般会创建自动续期的任务,安装之后用下面的命令确认续期流程是通的:
sudo certbot renew --dry-run
逐项检查,不要看到页面能打开就算完成:
服务器公网连接:从自己电脑能否ping通或者连接到公网IP。
域名解析:用dig或者nslookup确认域名指向了正确的IP。
页面加载:用浏览器或者curl -I https://example.com访问,状态码正常。
HTTPS:浏览器里没有证书警告,HTTP能跳转到HTTPS。
日志:查看Nginx和应用的日志,比如tail -n 50 /var/log/nginx/error.log,确认没有明显的报错。
资源:用df -h看磁盘,用free -h看内存,确认空间和内存都有余量。
先说监控。日常可以用top或htop看进程的资源占用,用df -h关注磁盘空间,同时打开服务商控制台里的监控和告警,CPU、内存、磁盘、带宽出现异常时第一时间收到通知。Nginx的日志默认由logrotate轮转,如果自己写了日志,也要配置轮转,免得日志把磁盘撑满。
再说备份。对网站来说,要备份的是站点文件和数据库。用cron做一个每日备份的例子,先执行crontab -e,加入:
0 3 * * * tar czf /backup/site-$(date +\%F).tar.gz /var/www/example.com
10 3 * * * mysqldump --single-transaction wordpress | gzip > /backup/db-$(date +\%F).sql.gz
30 3 * * * find /backup -type f -mtime +14 -delete
备份文件不要只放在同一台服务器上,同时利用服务商的快照功能,并把重要的备份保存到另一处。
最后也是最容易被忽略的一点:备份创建成功,不等于数据一定能恢复。要定期做一次恢复演练,比如在一台测试用的实例上,把备份还原出来,确认网站可以正常运行。没有恢复过的备份,只能算“有备份文件”。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。