Nginx 在华为云 Flexus 上部署静态网站到 HTTPS 的完整实践
写在前面
很多个人项目、产品官网、文档站的第一步都是“把静态页面放到网上,再加上 HTTPS”。本文以一台华为云 Flexus 云服务器为例,完整走完从空服务器到全站 HTTPS 的链路:安装 Nginx、部署静态网站、申请免费证书、配置强制跳转与安全头,并给出可直接复用的配置与排障清单。全文所有命令均在 Ubuntu 22.04 上验证思路,关键路径用占位符标注,替换成自己的域名和目录即可落地。
目标与架构
目标:访问自定义域名时全程 HTTPS,HTTP 自动跳转;静态资源响应快、缓存合理;证书到期前自动续期。
架构很简单:用户浏览器经 HTTPS 访问 Flexus 公网地址,Nginx 在 443 端口终止 TLS,返回磁盘上的静态文件;80 端口只做一件事——301 跳转到 HTTPS。证书用免费的域名验证证书,私钥只留在服务器上,不进代码仓库。
准备工作
- 一台已开通的 Flexus 实例,系统选 Ubuntu 22.04,确认能用 SSH 登录。
- 一个已完成备案解析的域名,例如把主域名的 A 记录指向服务器公网 IP。
- 安全组放行 22、80、443 端口;22 端口建议只允许自己的出口 IP。
- 服务器上准备一个非 root 运维账号,日常操作用它登录,必要时再提权。
第一步:安装 Nginx
登录服务器后先更新软件源并安装 Nginx:
sudo apt update
sudo apt install -y nginx
sudo systemctl enable nginx
sudo systemctl start nginx
nginx -v
sudo systemctl status nginx --no-pager
看到 active (running) 即表示安装成功。此时用服务器公网 IP 访问 80 端口,应能看到 Nginx 默认欢迎页;如果看不到,先检查安全组是否放行 80 端口,再查看防火墙规则。
第二步:准备静态网站目录与页面
按域名建独立目录是好习惯,多站点互不干扰。下文用“你的域名”作占位写法,实操时替换成自己的真实域名和目录:
sudo mkdir -p /var/www/你的域名/html
sudo chown -R $USER:$USER /var/www/你的域名/html
sudo chmod -R 755 /var/www/你的域名
写一个最小首页验证链路:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>我的静态网站</title>
</head>
<body>
<h1>你好,HTTPS 世界</h1>
<p>如果看到这一页,说明 Nginx 已正确返回本站的静态文件。</p>
</body>
</html>
文件保存为 /var/www/你的域名/html/index.html。后续真实站点只需把构建产物同步到这个目录即可。
第三步:先配 HTTP,验证站点本身没问题
不要一上来就叠加证书问题。先写一个纯 HTTP 的 Nginx 站点配置(占位符写法,实操时替换成真实域名):
server {
listen 80;
server_name 你的域名 www.你的域名;
root /var/www/你的域名/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
启用并校验:
sudo ln -s /etc/nginx/sites-available/你的域名 /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
curl -I 你的域名
返回 200 且能看到首页,说明站点、目录权限、域名解析三者都通了。再往下做 HTTPS,否则排障会同时面对两个变量。
第四步:申请免费证书
证书申请前,确认域名已解析到本机且 80 端口可从公网访问。通用做法是用自动化工具完成域名验证并签发,以 certbot 为例:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d 你的域名 -d www.你的域名
按提示输入联系邮箱并同意服务条款后,工具会完成域名验证、签发证书,并自动改写 Nginx 配置。如果偏好手动控制,也可以只申请证书文件,再按下一节手动写配置。无论哪种方式,证书文件与私钥都应只保留在服务器上,禁止提交到代码仓库,也不要发到群聊或贴到文章里。
第五步:写出可直接复用的 HTTPS 配置
这是全文的核心。80 端口只做永久跳转,443 端口承载业务(占位符写法,实操时替换成真实域名和证书路径):
server {
listen 80;
server_name 你的域名 www.你的域名;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name 你的域名 www.你的域名;
root /var/www/你的域名/html;
index index.html;
ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
gzip on;
gzip_types text/css application/javascript image/svg+xml;
gzip_min_length 1024;
location / {
try_files $uri $uri/ =404;
}
location ~* \.(css|js|png|jpg|jpeg|svg|ico|woff2)$ {
expires 7d;
add_header Cache-Control "public, max-age=604800";
try_files $uri =404;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
}
几个关键点值得单独说明:第一,跳转用 301 而不是 302,避免搜索引擎把 HTTP 版本当成正式地址;第二,HSTS 头只在一切正常后再逐步加长有效期,刚上线先用较短时间观察,避免配错后浏览器长时间拒绝 HTTP;第三,静态资源按类型缓存 7 天,HTML 不做长期缓存,改版后用户刷新即可看到新内容;第四,证书路径按实际签发工具的输出为准,不要凭记忆写。
改完后照例校验并重载,再用浏览器打开你的域名确认:
sudo nginx -t
sudo systemctl reload nginx
在浏览器里访问域名,地址栏应显示锁形标志,点开可查看证书的签发机构与有效期;同时用开发者工具检查响应头里是否包含 strict-transport-security,即表示 HTTPS 已生效。
第六步:证书自动续期
免费证书有效期通常是 90 天,靠人工续期一定会忘。设一条定时任务,每天检查一次、快到期自动续期并重载 Nginx:
sudo crontab -e
0 3 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload nginx"
初次上线建议手动跑一次续期演练确认无报错,同时把“证书到期前 15 天检查一次”写进自己的运维清单。续期失败最常见的原因是 80 端口被别的进程占用或域名解析被改动,演练时就能发现。
第七步:常见问题排障清单
- 访问返回 403:多半是目录或文件权限问题,确认 Nginx 运行用户对 /var/www/你的域名/html 有读权限,并检查 root 路径是否写错。
- 浏览器提示证书不受信任:检查 Nginx 是否返回了完整证书链,确认 ssl_certificate 指向的是 fullchain 文件而不是只有叶子证书。
- 页面样式丢失、图片裂开:查看浏览器控制台,常见原因是页面里混入了以 http 开头的资源地址,全部改为相对路径或 https 地址即可。
- 跳转死循环:检查 443 配置里没有多余的跳转规则,确认云服务商侧没有重复的强制 HTTPS 策略与其冲突。
- 修改配置后无效:先跑 nginx -t,再 reload;直接 restart 虽然也行,但会短暂中断连接,reload 是更稳妥的选择。
- IPv6 用户无法访问:若域名同时解析了 IPv6 地址,站点配置里也要监听相应地址,或先把解析调整为仅 IPv4 验证。
安全与成本收尾
静态站本身的攻击面不大,但仍建议做到三点:SSH 只允许密钥登录并关闭密码登录;不需要的管理端口不要放行;定期更新系统补丁并清理不再用的站点配置。成本方面,Flexus 按实例规格计费,Nginx 静态站对 CPU 和内存消耗都很低,选最小够用的规格即可;不再用时及时释放实例,不留闲置资源。
结语
从安装 Nginx 到全站 HTTPS,真正需要做对的只有四件事:域名解析正确、安全组放行、HTTP 链路先跑通、证书路径与续期不出错。把这四件事按本文顺序各验证一次,一个稳定、安全、可维护的静态网站就立起来了。后续不论把站点换成博客、文档站还是产品官网,这套结构都可以直接复用,只需替换根目录内容和域名即可。
- 点赞
- 收藏
- 关注作者
评论(0)