阿里云Ubuntu系统使用Nginx搭建静态网页实战

阿里云Ubuntu系统使用Nginx搭建静态网页实战

目录

环境准备与服务器初始化
• 阿里云ECS购买与配置
• Ubuntu系统初始化
• Nginx安装与启动

静态资源部署与配置
• 静态网页文件上传与权限管理
• Nginx虚拟主机配置详解
• Vue项目构建与SPA路由适配

域名解析与SSL证书配置
• 阿里云域名绑定与解析
• Let’s Encrypt免费SSL证书申请
• HTTPS强制跳转与安全加固

性能优化与高级技巧
• Gzip压缩与缓存策略
• CDN加速配置(可选)
• 日志分析与监控

常见问题与解决方案
• 403 Forbidden错误排查
• SSL证书续期自动化
• Vue路由刷新404问题

背景

最近在调试鸿蒙方面的问题,有些线上问题无法复现,需要通过回捞日志分析尝试修复后给到用户继续观察,由于应用没有上架应用市场,所以走的是inhouse方式,但是公司对外只有一个平台发布正式包,内网包外部用户无法使用,看了下发布页面的下载地址是这种格式store://enterprise/manifest?url=https://file.xxxcdn.com/shaxxxxx_manifest.json5,指向一个CDN的json5配置文件,这个文件可以外网访问,只要提供一个简单网页,有个按钮配置href到这个地址就可以。想到正好有一台阿里云的服务器,把静态页面部署上去就可以完成调试包发布的需求了。下面记录下静态页面配置的过程。

第一章 环境准备与服务器初始化

1.1 阿里云ECS购买与配置

步骤说明:

登录阿里云控制台,进入ECS实例购买页面。
选择配置:
• 地域:根据用户群体选择(如华北、华东)
• 镜像:Ubuntu 22.04 LTS(推荐)
• 实例规格:1核2GB(静态网站足够)
• 安全组:开放80(HTTP)、443(HTTPS)、22(SSH)端口

这里用的阿里搞活动的云服务器,并且安装了ubuntu_24_04_x64的镜像:

1.2 Ubuntu系统初始化

初始化完成后登录到服务器系统惊醒初始化配置和安装Nginx。
操作命令:

# 更新系统软件包
sudo apt update && sudo apt upgrade -y
# 安装常用工具
sudo apt install -y curl wget vim git
# 设置时区(选择Asia/Shanghai)
sudo timedatectl set-timezone Asia/Shanghai
1.3 Nginx安装与启动

安装流程:

# 安装Nginx
sudo apt install nginx -y

# 启动服务并设置开机自启
sudo systemctl start nginx
sudo systemctl enable nginx

# 验证状态
systemctl status nginx

执行结果:

第二章 静态资源部署与配置

配置完Nginx接下来就是配置我们的静态页面了。

2.1 静态网页文件上传

这里推荐目录结构如下:

/var/www/
└── my_website/
    ├── index.html
    ├── css/
    ├── js/
    └── images/

权限设置:

# 创建目录并授权
sudo mkdir -p /var/www/my_website
sudo chown -R www-data:www-data /var/www/my_website
sudo chmod -R 755 /var/www/my_website
2.2 Nginx虚拟主机配置

配置文件路径:

sudo vim /etc/nginx/sites-available/my_website.conf

配置模板:

server {
    listen 80;
    server_name your_domain.com;  # 替换为你的域名
    root /var/www/my_website;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;  # 适配Vue路由
    }

    # 禁用隐藏文件访问
    location ~ /.(?!well-known).* {
        deny all;
    }
}

启用配置:

# 创建软链接并测试
sudo ln -s /etc/nginx/sites-available/my_website.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
2.3 Vue项目构建与部署

构建命令:

npm run build  # 生成dist目录

部署注意事项:

dist目录内容上传至服务器
修改Nginx配置中的root路径为/var/www/my_website/dist
解决路由刷新404问题(需配置try_files

SPA路由配置示例:

location / {
    try_files $uri $uri/ /index.html;
}
2.4 Nginx配置文件介绍

上面我们创建了一个my_website.conf 配置文件,然后nginx就可以自动识别到,下面我们看看配置的具体介绍和说明。
下面是一个完整的 my_website.conf 配置示例(支持Vue项目构建的SPA应用):

server {
    listen 80;
    listen [::]:80;
    server_name your_domain.com www.your_domain.com;

    root /var/www/my_website/dist;  # Vue构建产物目录
    index index.html;

    # 静态资源缓存配置
    location ~* .(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
        expires 365d;
        add_header Cache-Control "public, no-transform";
    }

    # SPA路由适配
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 禁止访问隐藏文件
    location ~ /.(?!well-known) {
        deny all;
        access_log off;
        log_not_found off;
    }

    # 错误页面配置
    error_page 404 /404.html;
    location = /404.html {
        internal;
    }

    # 访问日志与错误日志路径
    access_log /var/log/nginx/my_website.access.log;
    error_log /var/log/nginx/my_website.error.log;
}

逐项配置解析

server
• 作用:定义一个虚拟主机,处理特定域名或IP的请求。
• 关键指令:
listen 80; :监听IPv4的80端口(HTTP)。
listen [: :]:80; :监听IPv6的80端口。
server_name your_domain.com www.your_domain.com; :指定该虚拟主机响应的域名(需与阿里云解析的域名一致)。
rootindex
root /var/www/my_website/dist; :定义网站根目录,所有请求将基于此路径解析文件。 示例:访问 your_domain.com/about 时,Nginx会尝试查找 /var/www/my_website/dist/about.html
index index.html; :指定默认入口文件。当访问目录路径时(如 /),自动加载 index.html
静态资源缓存配置

location ~* .(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {
    expires 365d;
    add_header Cache-Control "public, no-transform";
}
• 原理:
  • `location ~*` 使用正则匹配所有静态资源文件(不区分大小写)。
  • `expires 365d` 设置浏览器缓存时间为1年,减少重复请求。
  • `add_header Cache-Control` 补充缓存策略:  
    ◦ `public`: 允许代理服务器缓存资源。  
    ◦ `no-transform`: 禁止代理压缩或修改资源(如某些CDN会优化图片)。

SPA路由适配(Vue/React核心配置)

location / {
    try_files $uri $uri/ /index.html;
}
• 作用:解决单页应用(SPA)路由刷新404问题。  
• 逻辑拆解:  当用户访问 `/about` 时,Nginx按以下顺序尝试查找文件(相当于将所有非静态资源请求转发给入口文件):  
	  1. 检查是否存在 `/var/www/my_website/dist/about`(文件或目录)。  
	  2. 若未找到,则返回 `index.html`,由前端路由接管。  

禁止访问隐藏文件

location ~ /.(?!well-known) {
    deny all;
    access_log off;
    log_not_found off;
}
• 安全防护:  
  • 使用正则 `~ /.(?!well-known)` 匹配所有以 `.` 开头的目录/文件(如 `.git`、`.env`)。  
  • `deny all` 禁止访问,防止敏感信息泄露。  
  • `!well-known` 例外:用于SSL证书验证等场景(如Let's Encrypt的ACME挑战)。

日志配置

access_log /var/log/nginx/my_website.access.log;
error_log /var/log/nginx/my_website.error.log;
• 对运维意义:  
	  • 独立日志文件便于问题排查,避免与其他站点日志混杂。  
	  • 可通过工具(如GoAccess)分析访问日志,统计流量和用户行为。
2.5 Nginx配置核心原理

下面简单介绍下Nginx的配置解析原理。

HTTP请求处理流程

虚拟主机(Virtual Host)
• 概念:一台服务器通过不同域名或端口托管多个网站。
• 匹配优先级:

精确匹配的 server_name(如 your_domain.com
通配符匹配(如 *.your_domain.com
默认主机(listen 端口后未匹配的请求)。

SPA路由适配原理
• 问题背景:Vue/React等框架使用前端路由(HTML5 History模式),直接访问子路由路径时,Nginx因找不到实际文件返回404。
• 解决方案:通过 try_files 回退到 index.html,由JavaScript解析路由。
• 对比Hash模式:若使用Hash路由(如 /#/about),无需Nginx特殊配置,但URL不美观。

可以通过下面步骤操作验证与调试:

配置语法检查

sudo nginx -t  # 输出应为"Syntax OK"

实时监控错误日志

tail -f /var/log/nginx/my_website.error.log

手动触发浏览器缓存清理
• Chrome DevTools: Network面板勾选 Disable cache,强制跳过本地缓存。

下面是Nginx完整配置流程图

通过以上配置和原理说明,我们可以深入理解Nginx如何高效托管静态网站,并灵活应对Vue等现代前端框架的部署需求。

第三章 域名解析与SSL证书配置

3.1 阿里云域名解析

配置完服务后可以配置一个域名,这样便于用户记忆。正好之前持有的域名一直闲置,这里简单配置一下。
操作步骤:

进入阿里云DNS控制台
添加A记录:
• 主机记录:@www
• 记录值:ECS公网IP
等待生效(约10分钟)

3.2 Let’s Encrypt证书申请

http很多浏览器会提示不安全,我们加上ssl配置。这里使用Certbot工具:

# 安装Certbot
sudo apt install certbot python3-certbot-nginx -y

# 申请证书(需域名已解析)
sudo certbot --nginx -d your_domain.com -d www.your_domain.com

自动续期配置:

# 测试续期命令
sudo certbot renew --dry-run

# 添加定时任务(每月续期)
sudo crontab -e
0 3 * * * /usr/bin/certbot renew --quiet
3.3 HTTPS强制跳转配置

Nginx配置片段:

server {
    listen 80;
    server_name your_domain.com;
    return 301 https://$host$request_uri;  # 强制跳转HTTPS
}

server {
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/your_domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your_domain.com/privkey.pem;
    # 其他配置...
}

第四章 性能优化与高级技巧

下面介绍一些性能方面的配置和技巧。

4.1 Gzip压缩与缓存

Nginx优化配置:

gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_min_length 1000;

location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 365d;
    add_header Cache-Control "public";
}
4.2 CDN加速(阿里云DCDN)

如果用户量比较多,可以通过CDN进行加速。
配置流程:

购买CDN流量包
添加加速域名并指向源站IP
修改DNS解析至CNAME地址

4.3 日志分析与监控

日志路径:

/var/log/nginx/access.log  # 访问日志
/var/log/nginx/error.log   # 错误日志

常用命令:

# 实时监控访问情况
tail -f /var/log/nginx/access.log | grep -v "127.0.0.1"

# 统计TOP 10 IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

第五章 常见问题与解决方案

5.1 403 Forbidden错误

排查步骤:

检查目录权限:ls -l /var/www
确认SELinux/AppArmor状态:

sudo aa-status  # Ubuntu默认使用AppArmor

修改Nginx用户权限:

sudo usermod -a -G www-data your_username
5.2 SSL证书续期失败

常见原因:
• 防火墙阻止ACME验证请求
• 域名解析未生效
修复命令:

sudo certbot renew --force-renewal  # 强制重新申请
5.3 Vue路由刷新404

终极解决方案:

确认Nginx配置包含try_files规则
修改Vue Router为history模式:

const router = new VueRouter({
              
  mode: 'history',
  routes: [...]
})

附录

• Nginx官方文档

Certbot使用指南

阿里云服务器最新优惠活动:https://www.dunling.com/aliyun

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容