跳过正文
  1. 系列/
  2. VPS 实战系列/

任务 5:配置 Nginx 与静态网站的前端部署

其雁过无痕
作者
其雁过无痕
目录

折腾服务器,从“在宿主机上乱装一气”到“全面拥抱容器化” 。如何使用 Docker 和 Nginx,将纯前端项目托管到云服务器上,并实现公网访问 。

💡 核心原理解析:为什么我们需要 Nginx?
#

在本地电脑上,我们双击写好的 index.html 就能在浏览器里看到网页。此时浏览器的地址栏是 file:/// 开头的,这只是浏览器在充当本地文件读取器

但如果要把网页放到远端服务器上让全世界访问,别人是无法直接“读取”你服务器硬盘的。这时候就需要引入 Web 服务器(如 Nginx)。

  • Nginx 的角色:它就像一个 24 小时守在网络端口的接待员。
  • 工作机制:当用户的浏览器通过 http:// 访问服务器公网 IP 时,Nginx 会接收请求,去指定的文件夹里找到网页文件,并打包发送给用户的浏览器进行渲染 。

🛠️ Docker 部署实战
#

使用 Docker 部署服务,核心在于编写 docker-compose.yml 配置文件 。这能让我们的宿主机保持极其干净,日后迁移也只需几行命令 。

1. 准备挂载目录
#

首先在服务器上创建一个目录,用于存放网页文件:

mkdir -p ~/nginx-web/html

注意:不要用 mkdir index.html 去创建文件!mkdir 命令永远只会创建文件夹。如果你想要创建一个空的纯文本文件,请使用 touch index.html 或者用 echo 命令重定向写入。

2. 编写 Docker 配置文件
#

~/nginx-web 目录下创建 docker-compose.yml

  • 高延迟 SSH 避坑指南:如果你使用的是海外 VPS,SSH 连接延迟较高,直接用 nano 编辑并粘贴 YAML 代码极易导致缩进错乱。建议使用 SSH 客户端自带的可视化文件管理器双击编辑,或者使用 cat 重定向无损写入:
cat > docker-compose.yml << 'EOF'
services:
  nginx:
    image: nginx:latest
    container_name: nginx-web
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    restart: always
EOF

3. YAML 核心参数秒懂
#

这段简短的代码包含了 Docker 容器化的两大精髓:

  • ports: - "80:80"(端口映射):左边是宿主机对外开放的“大门”,右边是 Nginx 容器内部出厂默认死守的端口。这告诉 Docker 将外部敲击 80 端口的请求,精准送进容器内部的 80 端口。
  • volumes: - ./html:/usr/share/nginx/html(数据卷挂载):把宿主机上的 ./html 真实文件夹,像插 U 盘一样,映射到了 Nginx 容器内部的默认网页读取路径 /usr/share/nginx/html 。这样不仅能让 Nginx 读到我们的代码,还能保证即便容器被删除,网页资产依然安全留在宿主机硬盘上。

4. 启动服务
#

在终端执行以下命令,让它在后台默默运行:

docker compose up -d

最后,打开本地浏览器,输入 http://你的公网IP,就能看到属于你的页面了!


💣 进阶避坑:Bash 终端的历史命令解析错误
#

在用命令行快速生成测试网页时,你可能会写出这样的命令:

echo "<h1>Hello World!</h1>" > html/index.html

如果你的文字里带有感叹号 ! 且使用了双引号 "",Linux 终端会报错 event not found

  • 原因:在 Bash 中,! 代表历史命令扩展。
  • 解法:养成好习惯,使用单引号 '' 包裹纯文本字符串,它会让终端把里面的内容当作纯文本对待,不做任何特殊解析。

相关文章

番外:1G 小内存 VPS 部署 Java JSP 项目实战:Docker 本地构建 + 远程运行完美方案

在拥有了一台属于自己的 VPS(如 1核 1G内存,配置了 2G Swap)后,很多新手在尝试部署 Java 项目时,往往会选择直接在服务器上安装 Maven 或运行 docker build。但现实很残酷:Java 编译极其消耗内存,1G 的内存在构建瞬间就会被挤爆,导致系统卡死或触发 OOM (Out Of Memory) 杀掉进程。

任务 3:熟练使用终端复用工具

核心目标 # 操作:安装并学习使用 tmux。 收获:掌握在服务器上跑长耗时任务的能力。即使本地 SSH 突然断开,任务依然会在后台运行,不会前功尽弃。 核心工具:tmux # tmux (Terminal Multiplexer) 是现代服务端开发的必备工具,解决了远程连接中途掉线导致任务中断的痛点。

任务 2:分配虚拟内存 (Swap)

Linux 服务器运维笔记:分配虚拟内存 (Swap) 避坑与实操 # 0. 背景与目标 # 在小内存(如 1GB RAM)的云服务器上运行 Java、MySQL 或进行前端构建时,物理内存极易耗尽导致进程被系统杀掉(OOM)。Swap(交换空间) 充当了“虚拟内存”的角色,是服务器在高负载下的“救命支撑”。

番外:Dockerfile 常用指令详解

基础环境设置 # FROM:指定基础镜像 功能:这是每个 Dockerfile 的第一条指令(除注释外)。它决定了你的应用运行在什么环境之上。 示例:FROM ubuntu:24.04 (基于 Ubuntu 24.04 系统)或 FROM nginx:alpine (基于轻量级的 Nginx 镜像)。 WORKDIR:设置工作目录 功能:相当于 Linux 里的 cd 命令。后续的 RUN、CMD、COPY 等指令都会在这个目录下执行。如果目录不存在,Docker 会自动帮你创建。 示例:WORKDIR /app (将后续操作的默认路径设为容器内的 /app 目录)。 2. 文件复制 # COPY:复制文件/目录到容器中 功能:将宿主机(你的电脑或服务器)上的文件或目录,原封不动地拷贝到容器的指定路径下。 示例:COPY . /app (将当前宿主机目录下的所有文件,复制到容器的 /app 目录下)。 ADD:高级复制 功能:和 COPY 类似,但带有额外功能。如果复制的是一个本地的 .tar.gz 压缩包,ADD 会自动解压到目标路径;它也支持填入一个网络 URL 来下载文件。(新手推荐优先使用 COPY,语义更清晰)。 3. 执行命令与配置 # RUN:在构建镜像时执行命令 功能:这是构建阶段的主力军。通常用来安装软件包、创建文件夹、配置环境等。注意:每次 RUN 都会生成一个新的镜像层,所以通常会把多条命令用 && 连起来写。 示例:RUN apt-get update && apt-get install -y curl。 ENV:设置环境变量 功能:定义环境变量,后续的 RUN 指令可以使用,并且这些变量也会一直保留到容器运行阶段供你的程序读取。 示例:ENV MYSQL_ROOT_PASSWORD=my-secret-pw 或 ENV PORT=8080。 EXPOSE:声明监听端口 功能:这只是一个声明,告诉使用这个镜像的人,该容器内部的程序会使用哪个端口。它不会自动将端口映射到宿主机,映射依然需要在运行 docker run 时加上 -p 参数或在 docker-compose.yml 中配置。 示例:EXPOSE 80 (声明容器内的 Web 服务使用 80 端口)。 4. 容器启动指令 # CMD:容器启动时的默认命令 功能:指定容器跑起来之后要做的第一件事(例如启动 Nginx、运行 Java 后端应用等)。如果用户在 docker run 时手动指定了其他命令,CMD 的内容会被覆盖。 示例:CMD ["nginx", "-g", "daemon off;"]。 ENTRYPOINT:容器启动的主入口 功能:和 CMD 类似,但它不会被轻易覆盖。通常用于让容器表现得像一个独立的可执行程序。如果同时存在 ENTRYPOINT 和 CMD,CMD 的内容会作为参数传递给 ENTRYPOINT。 综合示例 # 为了方便理解,这里提供一个部署简单前端/静态网页的通用 Dockerfile 模板: