nginx 的 docker 部署及反向代理配置

文章目录

  • 1. docker 部署 nginx
      • nginx 四层负载均衡配置
  • 2. nginx 反向代理配置

1. docker 部署 nginx

  1. 从 Docker Hub 搜索 nginx 的镜像文件,使用如下命令拉取镜像

    // 拉取 1.21.0 版本
    docker pull nginx:1.21.0
    // 默认拉取 latest 最新版本
    docker pull nginx
    
  2. 本机创建文件夹,用于映射取代容器目录或文件,读者自行创建即可。因为容器实际是个精简的 Linux 系统,内部可能什么工具都没有安装,进入容器内部修改配置文件很不方便

    1. 笔者使用命令 sudo mkdir -p /Users/nathan/tool/docker_nginx/conf /Users/nathan/tool/docker_nginx/logs 创建两个本地文件夹
      1. 创建一个日志文件夹 /Users/nathan/tool/docker_nginx/logs 用于保存 nginx 运行日志,不然只能进入容器查看
      2. 创建一个配置文件夹 /Users/nathan/tool/docker_nginx/conf 用于保存 nginx 配置文件
    2. 使用命令 sudo vim /Users/nathan/tool/docker_nginx/conf/nginx.conf 创建 nginx.conf 配置文件取代容器内 nginx 文件,该文件内容如下。注意,配置文件修改后需要重启容器才能生效
    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  '$remote_addr - $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';
    
     access_log  /var/log/nginx/access.log  main;
    
     sendfile        on;
     #tcp_nopush     on;
    
     keepalive_timeout  65;
    
     #gzip  on;
    
     #读取指定文件夹下所有配置文件
     include /etc/nginx/conf.d/*.conf;
     
     #定义 dev 集群
     upstream dev {
         # 指定集群各个服务器节点 IP 端口及权重
         server 172.10.217.29:20561 weight = 100;
         server 172.10.217.29:20561 weight = 100;
     }
     server {
        # 指定监听 80 端口
        listen 80;
        charset utf-8;
        # 对外域名,可配置多个,空格隔开,也可使用通配符
        server_name nathan.com;
    
        location / {
            # 实际映射的后端服务器
           proxy_pass http://dev;
           proxy_redirect default;
        }
     }
    
    }
    
    
  3. 使用 docker run 命令创建一个 nginx 容器并启动,该命令的重点如下

    -d 设置容器后台运行
    -p 本机:容器端口映射, 将本地的80端口映射到容器内部的80端口,并显式指定传输协议
    --name 容器命名,需保持唯一
    -v 本机:容器映射目录,此处使用步骤2 创建的文件目录,/etc/nginx/nginx.conf 为容器内部 nginx 默认配置文件
    命令最后一个nginx:1.21.0是使用的镜像的名称

    docker run -d -p 80:80/tcp --name nginx-web -v /Users/nathan/tool/docker_nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /Users/nathan/tool/docker_nginx/logs:/var/log/nginx nginx:1.21.0
    
  4. 容器启动后,可通过 docker ps 命令查看已经启动的容器列表

    CONTAINER ID   IMAGE          COMMAND                  CREATED       STATUS       PORTS                               NAMES
    eb6194c61657   nginx:1.21.0   "/docker-entrypoint.…"   3 hours ago   Up 2 hours   0.0.0.0:80->80/tcp, :::80->80/tcp   nginx-web
    
  5. 通过 docker exec 命令可进入容器内,也就是进入这个只运行了 nginx 的 Linux 系统内部, nginx 安装目录为 /etc/nginx

    // 通过容器名称开启一个交互模式的终端
    docker exec -it nginx-web /bin/sh
    // 通过容器id开启一个交互模式的终端
    docker exec -it eb6194c61657 /bin/sh
    

nginx 四层负载均衡配置

Nginx 1.9 版本增加了Stream 模块,支持四层负载均衡,一个示例的四层负载均衡 nginx.conf 配置文件如下所示

events {
 worker_connections  1024;
}

stream {
    upstream mserver {
        server 10.129.39.88:7090;
        server 10.129.39.88:7091;
    }
 
    log_format  proxy '$remote_addr $remote_port - [$time_local] $status $protocol '
                  '"$upstream_addr" "$upstream_bytes_sent" "$upstream_connect_time"';
    access_log /var/log/nginx/proxy.log proxy;

    server {
        listen 80;
        proxy_pass mserver;
        proxy_connect_timeout 1s;
        proxy_timeout 3s;
    }
}

2. nginx 反向代理配置

例如在浏览器上访问 http://nathan.com/hello,没有带上端口号,其实相当于访问 http://nathan.com:80/hello,此时要将请求转发到 nginx,再由 nginx 转发给实际处理的机器需要经历下图过程,配置步骤如下
nginx 的 docker 部署及反向代理配置_第1张图片

  1. HTTP 请求发出,首先要做的就是解析域名 nathan.com 获得对应的 IP。因为想将请求打进 nginx,故需配置本地 host 文件,将域名 nathan.com 指向 nginx 所在的服务器。如果通过 docker 将 nginx 部署在本地,Mac/Linux 系统下可打开终端使用命令 sudo vim /etc/hosts 添加以下内容

    // 需注意 DNS 会有缓存,修改 Host 后可能会几分钟之后才能生效
    127.0.0.1 nathan.com
    
  2. 经过域名解析,HTTP 请求发到本机 80 端口。nginx 容器启动时绑定了宿主机 80 端口,则请求进入 nginx 反向代理

  3. nginx 转发的规则都写在 nginx 的配置文件中,处理 http://nathan.com 请求时会查找 server_name 能够匹配 nathan.comserver 节点,接着根据proxy_pass将请求转发到对应的 HTTP 路径。proxy_pass 可指定单个 URL,也可以引用 upstream 定义的集群,将请求按照负载均衡策略转发到对应节点。相关配置可参考上一节步骤2 nginx.conf 文件

你可能感兴趣的:(工具配置,docker,nginx)