目录

一 Dockerfile

1 Docker基础概念请看另一篇文章

2 Dockerfile

1 在当前项目的根目录之下创建一个名为Dockerfile文件(没有后缀名)

2 编写Dockerfile内容:

3 借助Dockerfile构建镜像

4 借助镜像去创建并启动容器

二 Nginx

1 目录结构:

2 Nginx命令

3 nginx.conf

1 main全局块

2 events事件块

3 http块

1 server块

2 location块 /

3 location /api/


一 Dockerfile

1 Docker基础概念请看另一篇文章

环境配置到头秃?是时候用 Docker 拯救你的发际线了_docker怎么玩-CSDN博客

常见命令介绍:

  • 启动Docker sudo systemctl start docker
  • 拉取镜像 docker pull <镜像名:标签版本>
  • 查看镜像 docker images
  • 强制删除镜像 docker rmi  -f <镜像id/名称>
  • 启动容器 docker run -d --name <容器名> -p 宿主机端口:容器端口 镜像名
  • 查看所有容器 docker ps -a
  • 删除容器 docker rm <容器id/名称>
  • 查看容器日志 docker logs <容器id/名称>
  • 停止容器 docker stop <容器id/名称>
  • 推送镜像 docker push <镜像名:标签版本>
  • 容器生成镜像 docker commit 参数 docker build 参数
  • 镜像保存tar包 docker save 参数
  • .tar包构建成本地镜像 docker load 参数
  • 开启已经存在的容器 docker start <容器id/名称>

2 Dockerfile

概念:一次编写,到处构建,代替传统的手动打包镜像。

Dockerfile:告诉Docker如何把jar包和运行环境打包成一个镜像。

比如说现在有一个场景:借助Dockerfile以及Docker技术去构建一个SpringBoot的后端服务。

步骤:

1 在当前项目的根目录之下创建一个名为Dockerfile文件(没有后缀名)

2 编写Dockerfile内容:

# 1. 选一个基础环境:我要用Java 17的运行环境(Docker会自动从网上下载这个基础镜像)
FROM openjdk:17-jdk-alpine

# 2. 在容器里创建一个工作目录,所有后续操作都在这里面做
WORKDIR /app

# 3. 把本地target文件夹里的jar包,复制到容器的/app目录下,改名叫app.jar
COPY target/myapp-1.0.0.jar app.jar

# 4. 告诉Docker这个容器会监听8080端口(只是声明,方便别人看)
EXPOSE 8080

# 5. 容器启动时默认执行的命令:就是你平时运行jar包的命令
CMD ["java", "-jar", "app.jar"]

3 借助Dockerfile构建镜像

项目根目录之下借助

docker  build -t myapp:1.0 .

Docker会自动寻找当前目录下名为Dockerfile的文件并执行他(最后的.表示在当前的目录下)

# 构建开发环境镜像
docker build -f Dockerfile.dev -t myapp:dev .

# 构建生产环境镜像
docker build -f Dockerfile.prod -t myapp:1.0.0 .

# 构建测试环境镜像
docker build -f Dockerfile.test -t myapp:test .

也可以指定

docker build -f <Dockerfile路径> -t <镜像名:标签> <构建上下文路径>

docker build 构建镜像的命令
-f ./docker/Dockerfile 指定使用的 Dockerfile 路径(相对于当前目录)
-t myapp:v1.0 给构建出的镜像命名为 myapp,标签为 v1.0
. 构建上下文路径为当前目录(即 /home/user/myapp
cd /home/user/myapp
docker build -f ./docker/Dockerfile -t myapp:v1.0 .

Docker会去自动下载基础的镜像,然后复制jar包,执行指令,最后生成一个名为myapp:v1.0的镜像。

4 借助镜像去创建并启动容器

执行命令:

docker run -p 8080:8080 myapp:1.0

总体概括一下整体的流程:

你在本地写完代码 → 用 Maven 打成 jar 包 → 写个 Dockerfile 告诉 Docker 怎么打包镜像 → 执行docker build生成镜像 → 执行docker run启动容器 → 浏览器访问应用。

二 Nginx

Nginx:一个超高性能的Web后端服务器,并且还具有反向代理,负载均衡的策略。

1 目录结构:

目录 / 文件

作用说明

备注

conf/

存放 Nginx 的配置文件

核心目录,主要修改 nginx.conf

contrib/

辅助工具脚本

一般不用修改

docs/

Nginx 官方帮助文档

查阅使用

html/

存放前端静态网站

Vue 打包后的 dist 文件放这里

logs/

日志目录

存放访问日志、错误日志,启动后自动生成

temp/

临时文件目录

自动读写,无需手动管理

nginx.exe

Nginx 可执行程序

必须在 Nginx 根目录下执行

2 Nginx命令

注意:必须在Nginx的根目录之下去执行。

命令

作用

使用场景

start nginx

启动 Nginx 服务

首次启动

nginx -s quit

缓慢关闭

推荐正常停止

nginx -s stop

强制停止

紧急停止

nginx -s reload

重载配置文件

改完配置后执行,不中断服务

nginx -t

校验配置文件语法

改完配置先执行,检查是否正确 

3 nginx.conf

整体的大致结构:

main(全局块,最外层)
├── events 块(网络连接模型)
└── http 块(Web服务总容器)
    ├── http 全局指令
    ├── upstream 块(负载均衡组)
    └── server 块(虚拟主机,可多个)
        ├── server 全局指令
        └── location 块(路径匹配,可多个)
            └── 嵌套 location(极少用)

1 main全局块

对整个Nginx服务全局生效

配置项 示例值 说明
worker_processes 1 / auto

工作进程数量,主进程负责管理,worker 进程真正处理请求;

生产环境建议设为 CPU 核心数或 auto 自动匹配

error_log logs/error.log warn 全局错误日志路径与级别,也可在 http/server/location 层单独配置
pid logs/nginx.pid 主进程 PID 文件路径
user nginx nginx 运行 Nginx 的用户 / 用户组,Windows 下无效
worker_rlimit_nofile 65535 单个 worker 进程最大文件句柄数,生产调优时使用,默认一般够用

2 events事件块

配置Nginx与客户端的网络连接底层模型。

配置项 示例值 说明
worker_connections 1024 单个 worker 进程最大并发连接数,核心并发参数。
use epoll epoll

指定事件驱动模型,Linux 下默认 epoll 性能最优;

Windows 下不支持 epoll,默认使用 select,写了也不生效

multi_accept on 是否允许 worker 一次性接收多个新连接,默认 off,一般保持默认
accept_mutex off

连接互斥锁;on 时进程轮流接连接,off 时一起抢连接;

高版本 Nginx 默认 off,性能更优

3 http块

所有HTTP服务的全局配置,里面可以嵌套多个server虚拟主机,是配置最复杂的一块。

配置项 示例值 说明
include mime.types - 引入 MIME 类型映射文件,让 Nginx 能识别不同文件类型
default_type application/octet-stream 无法识别文件类型时的默认类型,触发浏览器下载
sendfile on 开启高效文件传输模式,大幅提升静态文件性能,必开
keepalive_timeout 65 长连接超时时间(秒),减少握手开销
access_log logs/access.log main 访问日志路径与格式;可在 server/location 层单独关闭或重定义
tcp_nopush on 配合 sendfile 使用,优化网络包传输,一般默认开启
tcp_nodelay on 关闭 Nagle 算法,降低小报文延迟,高并发场景调优用
client_header_timeout 60s 读取请求头超时,一般保持默认
1 server块

虚拟主机块,位于http内部;每一个server对应着一个虚拟站点。借助listen+server_name区分

配置项 示例值 说明
listen 80 / 443 ssl

监听端口;HTTP 默认 80,HTTPS 需加 ssl 关键字

server_name localhost / shturl. 站点域名 / IP;支持精确匹配、通配符、正则,Nginx 会按优先级匹配
root html 站点静态资源根目录;也可写在 location 层,就近生效
client_max_body_size 20m

客户端请求体最大限制,即上传文件大小上限;

接口上传报错 413 时,优先调大此值

error_page 404 /404.html 自定义错误页,开发中一般由前端处理,后端场景用得少
index index.html index.htm 默认首页文件;通常写在 location / 中更清晰

动静分离:就是以/开头的去找前端的静态页面,以/api/开头的就去寻找对应的后端服务。

对于Vue的项目,Nginx会进行路由,会路由到指定的文件夹当中,但是如果没有找到,就会路由到index.html兜底处理,进入Vue页面组件的渲染操作。

1 location /

2 location /api/

2 location块 /

URL匹配规则:处理前端静态资源。去指定的目录下去寻找和Url对应的文件,找到直接将其返回给浏览器,找不到就fallback到index.html当中,路由交给Vue前端自己处理。

配置项 示例值 说明
root D:/xxx/dist 静态资源根目录,最终文件路径 = root 值 + 请求 URL
index index.html index.htm 默认首页文件,按顺序优先匹配
try_files $uri $uri/ /index.html 按顺序尝试:匹配文件 → 匹配目录首页 → 最终回退到 index.html;单页应用必配
        # 配置静态资源路径,指向Vue项目构建后的dist目录
        location / {
            root   D:/shixun/javaee/xiangmu/xsglq/dist;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }
3 location /api/

反向代理后端接口,匹配所有以/api/开头的请求,把这类请求转发给后端的Java服务。

价值点:浏览器访问的是 Nginx 的同域名同端口,所有 /api/xxx 接口都由 Nginx 代为转发,天然解决了跨域问题。

配置项 示例值 说明
proxy_pass http://127.0.0.1:8081 后端服务目标地址;末尾斜杠影响路径拼接:带/则剔除/api/前缀转发,不带则完整拼接
proxy_set_header Host $host 透传原始请求域名
proxy_set_header X-Real-IP $remote_addr 透传客户端真实 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for 全链路 IP 追溯
proxy_set_header X-Forwarded-Proto $scheme 透传原始请求协议(http/https)
proxy_connect_timeout 30s Nginx 与后端建立连接的超时时间
proxy_read_timeout 30s Nginx 等待后端响应的超时时间,慢接口场景需调大

示例代码:

worker_processes  auto;
error_log  logs/error.log warn;
pid        logs/nginx.pid;
worker_rlimit_nofile 65535;

events {
    worker_connections  1024;
    use epoll;
    accept_mutex off;
    multi_accept off;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;
    keepalive_timeout  65;
    access_log  logs/access.log combined;

    server {
        listen       80;
        server_name  localhost;
        client_max_body_size 20m;

        location / {
            root   D:/shixun/javaee/xiangmu/xsglq/dist;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
        }

        location /api/ {
            proxy_pass http://127.0.0.1:8081/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_connect_timeout 30s;
            proxy_read_timeout 30s;
        }
    }
}

示例代码2

# ====================== main 全局块 ======================
# 对整个Nginx服务全局生效,控制核心运行参数

# 工作进程数量:auto 自动匹配CPU核心数,生产环境推荐
# 主进程仅负责管理,worker 进程真正处理用户请求
worker_processes  auto;

# 全局错误日志:路径 + 日志级别(warn/error/info/debug)
# 也可在 http/server/location 层单独配置,就近生效
error_log  logs/error.log warn;

# 主进程 PID 文件路径,用于进程启停管理
pid        logs/nginx.pid;

# 单个 worker 进程最大文件句柄数,生产环境调优参数
# 提升并发下的文件打开能力,默认值一般够用
worker_rlimit_nofile 65535;


# ====================== events 事件块 ======================
# 配置Nginx与客户端的网络连接底层模型,直接影响并发性能

events {
    # 单个 worker 进程最大并发连接数,核心并发参数
    worker_connections  1024;

    # 事件驱动模型:Linux 下 epoll 性能最优
    # Windows 不支持 epoll,自动使用 select,写了也不生效
    use epoll;

    # 连接互斥锁:off 时多个 worker 同时争抢连接
    # 高版本 Nginx 默认关闭,性能更优
    accept_mutex off;

    # 是否允许 worker 一次性接收多个新连接
    # 默认关闭,一般保持默认即可
    multi_accept off;
}


# ====================== http 服务块 ======================
# 所有HTTP服务的总容器,可嵌套多个 server 虚拟主机

http {
    # 引入 MIME 类型映射文件,让Nginx识别不同后缀的文件类型
    include       mime.types;

    # 无法识别文件类型时的默认类型,会触发浏览器下载行为
    default_type  application/octet-stream;

    # 开启高效文件传输模式,大幅提升静态资源响应性能,静态站点必开
    sendfile        on;

    # 配合 sendfile 使用,优化网络包传输,减少网络IO次数
    tcp_nopush      on;

    # 关闭 Nagle 算法,降低小报文传输延迟,高并发低延迟场景推荐开启
    tcp_nodelay     on;

    # 长连接超时时间(秒),复用TCP连接减少握手开销,超时后自动断开
    keepalive_timeout  65;

    # 访问日志:路径 + 日志格式
    # 可在 server/location 层单独关闭或重定义
    access_log  logs/access.log combined;


    # ====================== server 虚拟主机块 ======================
    # 一个 server 对应一个虚拟站点,通过 监听端口 + 域名 区分
    server {
        # 监听端口,HTTP 默认 80;HTTPS 需改为 443 并添加 ssl 关键字
        listen       80;

        # 站点域名/IP,支持精确匹配、通配符、正则,Nginx 按优先级匹配
        server_name  localhost;

        # 客户端请求体最大限制,即上传文件大小上限
        # 文件上传报错 413 时,优先调大此值
        client_max_body_size 20m;


        # ====================== location / 静态资源块 ======================
        # 匹配根路径所有请求,处理 Vue/React 单页应用静态资源
        location / {
            # 静态资源根目录,最终文件路径 = root 值 + 请求 URL
            root   D:/shixun/javaee/xiangmu/xsglq/dist;

            # 默认首页文件,按顺序查找,找到第一个即返回
            index  index.html index.htm;

            # 按顺序尝试匹配资源:文件 → 目录首页 → 最终回退到 index.html
            # 单页应用必配,解决前端路由页面刷新 404 问题
            try_files $uri $uri/ /index.html;
        }


        # ====================== location /api/ 反向代理块 ======================
        # 匹配所有以 /api/ 开头的请求,转发至后端 Java 服务
        location /api/ {
            # 反向代理目标地址;末尾带 / 会剔除 /api/ 前缀再转发
            # 若不带 /,则会将 /api/ 完整拼接到目标地址后,是开发高频踩坑点
            proxy_pass http://127.0.0.1:8081/;

            # 透传原始请求域名,避免后端获取不到正确的站点域名
            proxy_set_header Host $host;

            # 透传客户端真实 IP,后端可通过此头获取用户真实地址
            proxy_set_header X-Real-IP $remote_addr;

            # 全链路 IP 追溯,记录请求经过的所有代理节点 IP
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            # 透传原始请求协议(http/https),后端可识别用户访问协议
            proxy_set_header X-Forwarded-Proto $scheme;

            # Nginx 与后端建立连接的超时时间
            proxy_connect_timeout 30s;

            # Nginx 等待后端响应的超时时间,慢接口场景需适当调大
            proxy_read_timeout 30s;
        }
    }
}

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐