手把手教你在Docker中安装Nginx(图文超详细)

这篇具有很好参考价值的文章主要介绍了手把手教你在Docker中安装Nginx(图文超详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


本文介绍如何在 Windows Docker Desktop 平台安装 Nginx 容器(Linux 平台同样适用),并详细讲解如何配置 Nginx ,实现 HTTP 请求在后端服务器集群间的负载均衡。

Nginx安装

拉取镜像

访问 dockerhub 查找所需的镜像版本:
docker安装nginx,docker,nginx,容器,java,负载均衡,http,网络协议
docker安装nginx,docker,nginx,容器,java,负载均衡,http,网络协议

这里我选择 1.24.0 版,执行如下命令:

docker pull nginx:1.24.0

命令执行结果:
docker安装nginx,docker,nginx,容器,java,负载均衡,http,网络协议

拷贝配置文件

随后,我们第一次运行镜像,用于拷贝配置文件和 html 目录到宿主机。
我解释下将 Docker 容器的目录挂载到宿主机的目的:

  • 数据持久化:默认情况下,当容器被删除时,它内部的所有数据也会丢失。通过将数据目录挂载到宿主机,可以确保重要数据得到持久化保存;随后如果运行相同的镜像,新的容器仍然可以使用保存在宿主机上的数据和配置。
  • 方便数据管理和调试:我选择 Docker 主要是看重它便捷的分布式应用部署能力,可以在开发和调试阶段在本地开发机上部署多个应用。通过卷挂载,我可以直接在宿主机上编辑配置文件,调整应用参数,从而加快开发和调试过程。

第一次运行 nginx 镜像的命令:容器名nginx

docker run -p 80:80 -d --name nginx nginx:1.24.0

拷贝 Nginx 主配置文件/etc/nginx/nginx.conf

# nginx容器名、/etc/nginx/nginx.conf 配置文件容器内的地址
# D:\Programing\Docker\volumns\nginx\conf 宿主机上拷贝的目标地址
docker cp nginx:/etc/nginx/nginx.conf D:\Programing\Docker\volumns\nginx\conf

Nginx 主配置文件包含了影响 Nginx 全局行为的命令,包括事件处理、HTTP 服务器的基本配置(如监听端口、文件路径等)、日志文件位置以及其他重要配置。


拷贝 Nginx 额外配置文件目录:/etc/nginx/conf.d

docker cp nginx:/etc/nginx/conf.d D:\Programing\Docker\volumns\nginx\conf

conf.d目录用于存放 Nginx 的额外配置文件。默认情况下,nginx.conf主配置文件中包含了一个 include 指令,指向此目录下的所有 .conf 文件。


拷贝 html 目录:/usr/share/nginx/html

docker cp nginx:/usr/share/nginx/html D:\Programing\Docker\volumns\nginx

这是 Nginx 的默认文档根目录。当您使用 Nginx 来提供静态网页服务时,放置在此目录下的文件和目录将可以通过 web 访问。(注:可以在配置文件 server 块中,使用 root 指令指定根目录)

正式运行镜像

拷贝文件完成后,删除第一次试运行的 nginx 容器:

docker rm nginx

正式运行 nginx,将宿主机上的配置文件和文档根目录挂载到容器上:

# 多行便于展示()
docker run -p 81:80 \
    --network api-my_net \
    -d --name nginx \
    -v D:\Programing\Docker\volumns\nginx\conf\nginx.conf:/etc/nginx/nginx.conf \
    -v D:\Programing\Docker\volumns\nginx\conf\conf.d:/etc/nginx/conf.d \
    -v D:\Programing\Docker\volumns\nginx\html:nginx:/usr/share/nginx/html \
    nginx:1.24.0

# 可直接复制该行命令运行
docker run -p 81:80 --network my_net -d --name nginx -v D:\Programing\Docker\volumns\nginx\conf\nginx.conf:/etc/nginx/nginx.conf  -v D:\Programing\Docker\volumns\nginx\conf\conf.d:/etc/nginx/conf.d -v D:\Programing\Docker\volumns\nginx\html:/usr/share/nginx/html nginx:1.24.0

参数解释

  • --network:将容器加入到名为 my_net 的网络。注:如果该网络不存在,docker 会报错。若网络不存在,需要执行docker network create my_net创建。
  • -p:端口映射,冒号前为宿主机端口,冒号后为容器内的端口,即宿主机上访问 81 端口的 HTTP 请求会被交给 nginx 容器的 80 端口。
  • -d:后台运行容器;
  • --name:指定容器名称,本例中名称为 nginx。
  • -v:挂载配置文件、html 目录到宿主机;冒号前为宿主机文件路径,冒号后为挂载到容器中的路径。可以看到宿主机被挂载的三个目录/文件是第一次运行时从容器内拷贝出来的,

测试

浏览器访问宿主机映射的 81 端口:

http://localhost:81

页面展示如下,那么恭喜你 Nginx 已经成功安装并运行啦!
docker安装nginx,docker,nginx,容器,java,负载均衡,http,网络协议

Nginx 配置

我安装并部署 Nginx 的目的是为了让请求在多个 API 网关实例间负载均衡,这些 API 网关实例的主要作用是将 HTTP 协议的请求,映射为对某个服务的 RPC 协议调用。
在本节,我将讲解如何配置 Nginx 请求转发给后端服务器集群。

负载均衡配置

首先给出完整的 nginx.conf 主配置文件:


user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

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

    log_format main '[$time_local] request="$request" remoteAddr="$remote_addr" upstreamAddr="$upstream_addr" status=$status bodyBytesSent=$body_bytes_sent userAgent="$http_user_agent" forwardedFor="$http_x_forwarded_for" realIP="$http_x_real_ip" '; 

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;

    # map $source_variable #new_variable, source变量的值将被检查, 从而确定映射的结果
    map $http_x_real_ip $real_ip {
        default $http_x_real_ip;  # 如果 X-Real-IP 存在,则使用其值
        ''      $remote_addr;     # 如果 X-Real-IP 不存在(为空),则使用 $remote_addr
    }

    upstream gateway { # (1)
        server api-gateway-engine-01:7396;
        server api-gateway-engine-02:7396;
    }

    # HTTP服务器
    server {
        # 监听80端口
        listen 80; # (2)

        # 定义使用IP/域名访问
        server_name 127.0.0.1; # (3)

        index index.html;

        # 使用 $real_ip 设置 X-Real-IP,它会根据 map 指令的逻辑来决定值
        proxy_set_header X-Real-IP $real_ip;
        # 添加或更新 X-Forwarded-For 头,将 $proxy_add_x_forwarded_for 保留原有的 X-Forwarded-For 信息,并添加当前客户端的 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

		# 反向代理路径(upstream绑定)
        location /gateway/ {  # (4)
            proxy_pass http://gateway;
        }
    }
}

标记(1)upstream gateway定义了名为 gateway 的上游服务器组。

server api-gateway-engine-01:7396; 以及 server api-gateway-engine-02:7396; 指定了组成 gateway 服务器组的两个后端服务器的主机名(或 IP 地址)和端口号。这意味着通过/gateway路径的请求,Nginx 将会在这两个服务器之间进行负载均衡。

默认所有服务器的权重为 1,我们也可以根据服务器实例的硬件配置进行加权轮询,例如:

    upstream gateway {
        server api-gateway-engine-01:7396 weight=2;
        server api-gateway-engine-02:7396; # 默认 weight=1
    }

最少连接策略

    upstream gateway {
    	least_conn;
        server api-gateway-engine-01:7396;
        server api-gateway-engine-02:7396;
    }

更多的负载均衡策略,参考Nginx 负载均衡。

标记(2):指定 Nginx 的监听端口,80 端口为标准的 HTTP 服务器端口。
标记(3):server_name 指定了 Nginx 服务器块 (server block) 应该处理哪些域名或 IP 地址的请求。本例中使用127.0.0.1,意味着当 Host 头部字段匹配到127.0.0.1时,Nginx 将会使用这个服务器块来处理该请求。
标记(4):在 proxy_pass 指令中引用 gateway 服务器组,指定 uri 以/gateway为前缀的请求应该被转发给该服务器组。


通过查看 Nginx 访问日志,可以看出 4 次 HTTP 请求中,路由给 engine-01 和 engine-02 实例的请求数均为两次,这反映了默认的负载均衡策略为等权重轮询
docker安装nginx,docker,nginx,容器,java,负载均衡,http,网络协议


API网关案例分享

在设计 API 网关时,我将网关 算力节点 划分进多个网关 算力组 ,算力组按找业务部门划分(例如:交易、计费、结算、运营等),每个算力组拥有自己的算力资源。
请求 URI 前缀标识所属的算力组,然后经过 Nginx 路由给该部门的算力节点,由算力节点完成 鉴权、Http 请求参数解析、RPC 泛化调用、调用结果返回 这一整套流程。

举个例子
交易组的编号 123,请求 uri 样式为:/123/purchase/coupon/79347,这个 uri 用于团购券的下单请求。我希望将该请求转发给交易组申请的算力节点上,但是请求的 uri 经过 Nginx 处理后去除前缀部分/123
那么在 Nginx 的配置文件中可以这样做:

    upstream 123 {
        least_conn;
        server 172.19.0.7:7396;
        server 172.19.0.8:7396;
    }

    server {
        listen 80;

        location ~ ^/123/(.*)$ {
            proxy_pass http://123/$1;
        }
    }

在这个配置中,location指令使用正则表达式来匹配请求URI。^/123/(.*)$正则表达式匹配以/123/开头的请求URI,并将匹配的部分之后的URI(由(.*)捕获)传递给 proxy_pass 指令。
这样,当一个请求 URI 为/123/purchase/coupon/79347时,它会被转发到http://123/purchase/coupon/79347123最终会被名称为 123 的 upstream 服务器组中的某一个地址替换,例如替换为http://172.19.0.7:7396/purchase/coupon/79347


在 Nginx 中,~ 符号用于指示接下来的位置匹配将使用正则表达式;$符号在正则表达式中用来表示字符串的结束。所以,~ ^/123/(.*)$表达式的含义为:

  • ^ 表示字符串的开始,确保匹配的URI从头部开始。
  • /123/ 表示确切的字符序列,匹配所有以这个序列开始的 URI。
  • (.*)是一个捕获组,匹配/123/之后的任何字符序列,直到 URI 的结束。在 proxy_pass 中,使用了 $1 访问这个匹配组,即剪切了前缀的 URI。
  • $ 确保匹配到的是整个请求 URI 的结尾,避免部分匹配的情况发生。

下面是 Nginx 和应用服务器的请求日志图,可以看到请求 URI 发生了变化:
Nginx 日志
docker安装nginx,docker,nginx,容器,java,负载均衡,http,网络协议

Spring Boot 后端服务器日志
docker安装nginx,docker,nginx,容器,java,负载均衡,http,网络协议文章来源地址https://www.toymoban.com/news/detail-840557.html

到了这里,关于手把手教你在Docker中安装Nginx(图文超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Docker】手把手教你在windows使用Docker搭建Minio[详细教程]

    【Docker】手把手教你在windows使用Docker搭建Minio[详细教程]

    目录 1什么是Minio 2安装Docker 3Docker搭建Minio 4.创建Minio容器并运行 5.进行访问 6安装可能出现的问题         MinIO是一个基于开源的对象存储服务器,MinIO的设计目标是提供高性能、高可用性和高可靠性的对象存储服务。MinIO可以作为一个独立的对象存储服务,也可以在Kuber

    2024年01月19日
    浏览(11)
  • 【运维】手把手教你在windows使用Docker搭建Minio[详细教程]

    【运维】手把手教你在windows使用Docker搭建Minio[详细教程]

    目录 1什么是Minio 2安装Docker 3Docker搭建Minio 4.创建Minio容器并运行 5.进行访问 6安装可能出现的问题         MinIO是一个基于开源的对象存储服务器,MinIO的设计目标是提供高性能、高可用性和高可靠性的对象存储服务。MinIO可以作为一个独立的对象存储服务,也可以在Kuber

    2024年02月06日
    浏览(14)
  • 【实战】手把手教你在 vscode 中写 markdown

    【实战】手把手教你在 vscode 中写 markdown

    markdown 语法、markdown 插件咱先放放,先说最头疼的,图片问题 相对于 HBuilder 自带 markdown 图片粘贴功能来说,vscode显得不那么友好,若是不装插件粘贴截图就只能手动进行如下操作: 截取图片 将图片存在特定位置 在markdown文件中通过路径引入图片 预览 最终我找到了 Paste I

    2024年02月13日
    浏览(8)
  • 手把手教你在 CentOS 7 下升级 OpenSSL

    手把手教你在 CentOS 7 下升级 OpenSSL

      这篇文章记录着如何在 CentOS 7 上升级 OpenSSL。会逐步介绍所需步骤,包括备份,下载和安装,以及配置等。 OpenSSL 是用于保护数据安全的重要工具。它能提供加密,解密等多项功能。然而,随着技术的发展和新的安全漏洞的出现,使用最新版本的 OpenSSL 成为了重要的需求

    2024年02月16日
    浏览(12)
  • 手把手教你在Windows下搭建Vue开发环境

    手把手教你在Windows下搭建Vue开发环境

    最近有小伙伴不会Vue环境的部署,小孟亲自测试了下,大家有需要的可以按照下面的学习。 如果想看视频的,也可以看视频的教程: https://www.bilibili.com/video/BV1if4y1X7BS/?spm_id_from=333.788.recommend_more_video.-1vd_source=e64f225fc5daf048d2687502cb23bb3b 在Windows下搭建Vue开发环境: 官网https://n

    2024年02月08日
    浏览(13)
  • 9个步骤,手把手教你在Windows上安装Hadoop

    9个步骤,手把手教你在Windows上安装Hadoop

    在Windows上安装Hadoop时经常会出现许多错误,很多用户使用基于Linux的操作系统。本文详细讲述如何在Windows上安装和运行Apache Hadoop,如果遇到了问题,可以参考文章中的步骤进行解决。 微信搜索关注《Java学研大本营》 在 Microsoft Windows 上运行 Apache Hadoop 是比较繁琐的任务,在

    2024年02月08日
    浏览(7)
  • 手把手教你在ARM板上写一个驱动程序!

    手把手教你在ARM板上写一个驱动程序!

    摘要:搞嵌入式有两个方向,一个是嵌入式软件开发(MCU方向),另一个是嵌入式软件开发(Linux方向)。其中MCU方向基本是裸机开发和RTOS开发。而Linux开发方向又分为驱动开发和应用开发。其中应用开发相比于驱动开发来说简单一些,因为搞驱动你要和Linux内核打交道。而我们普

    2024年02月01日
    浏览(12)
  • 新手教程科普,手把手教你在bitget walelt用Uniswap

    新手教程科普,手把手教你在bitget walelt用Uniswap

    Uniswap 是以太坊区块链上领先的去中心化交易所 (DEX),允许用户交换和交易各种加密货币。 Uniswap 于 2018 年 11 月推出,是以太坊最早的 DApp 之一。目前有四个版本;其中V1、V2、V3都有开源代码库。 与 Coinbase 或 Binance 等传统中心化交易所 (CEX) 不同,Uniswap 不受任何单一实体控

    2024年03月20日
    浏览(7)
  • 手把手教你在 Windows 环境中搭建 MQTT 服务器

    手把手教你在 Windows 环境中搭建 MQTT 服务器

    前些天要对接一家硬件商的设备数据,对方使用的 MQTT 协议点对点透传,所以又赶紧搭建 MQTT 服务器,写 .NET 程序接收数据等等,今天分享一下如何搭建 MQTT 服务器。 MQTT(Message Queuing Telemetry Transport)是一种轻量级的、基于发布/订阅模式的通信协议,专门设计用于在低带宽

    2024年02月03日
    浏览(12)
  • 手把手教你在linux中部署hadoop以及hadoop功能介绍

    手把手教你在linux中部署hadoop以及hadoop功能介绍

    我们在学大数据的时候hadoop是躲避不开的地方,所以如何在linux中部署hadoop,下面就是手把手教你如何部署hadoop。你只要复制粘体,然后按enter键就可以了。 准备:   安装Linux版本的服务器。可以参考中前半部分安装服务器的内容即可:VM部署CentOS并且设置网络_ZeroMaster的博客

    2024年02月03日
    浏览(12)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包