当前位置:   article > 正文

Docker配置nginx,及各种代理配置_nginx代理docker

nginx代理docker

Docker配置nginx,及各种代理配置

1.安装

  • 命令
docker search nginx
docker pull nginx
  • 1
  • 2
  • 查看镜像
docker images
  • 1

在这里插入图片描述

  • 运行测试
docker run --name nginx-test -p 9091:80 -d nginx

# --name  #给你启动的容器起个名字,以后可以使用这个名字启动或者停止容器
# -p #映射端口,将docker宿主机的9091端口和容器的80端口进行绑定
# -v #挂载文件用的
# -d #后台运行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述
在这里插入图片描述

2.Nginx服务的配置和部署

  • 为什么需要做文件的映射

我们在使用容器的过程中,有时候需要对容器中的文件进行修改,如果不做文件映射的话,需要进入容器内部(命令:docker exec -it 容器ID/容器名 /bin/bash) 才能修改。
如果把关键文件映射到宿主机上,那么就可以在主机中进行修改而不必进入容器内部修改了,也能避免容器重启或销毁重构导致文件丢失

在这里插入图片描述

  • 在宿主机上建立目录
mkdir -p /home/nginx/html /home/nginx/logs /home/nginx/conf /home/nginx/conf.d
或
mkdir -p /home/nginx/{html,logs,conf,conf.d}
  • 1
  • 2
  • 3
  • 从容器中拷贝配置文件至宿主机
docker cp 容器Id:/etc/nginx/conf.d/default.conf /home/nginx/conf.d/default.conf

docker cp 容器Id:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf

docker cp 容器Id:/usr/share/nginx/html /home/nginx/html

docker cp 容器Id:/usr/share/nginx/logs /home/nginx/logs
# Nginx的配置文件通常位于/etc/nginx/nginx.conf或/etc/nginx/conf.d/default.conf
# 注意此时的容器必须是运行的状态
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 关闭之前运行的容器
docker stop 容器id
docker rm 容器id
  • 1
  • 2
  • 重新运行nginx,同时进行文件挂载
docker run --name nginx-test -v /home/nginx/html:/usr/share/nginx/html -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf  -v /home/nginx/logs:/var/log/nginx -p 9091:80 -d nginx
  • 1

3.配置域名访问

在Nginx中配置域名访问主要涉及到http块中的server指令。server指令用于定义一个虚拟服务器,每个虚拟服务器都可以配置不同的域名和请求处理方式

http {
    server {
        listen 80;
        server_name example.com www.example.com;
        root /var/www/example.com;
        index index.html index.htm;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在上面的示例中,server指令定义了一个虚拟服务器,监听端口为80,服务名为example.com和www.example.com,根目录为/var/www/example.com,
索引文件为index.html和index.htm。当用户通过域名example.com或www.example.com访问该服务器时,Nginx会根据root指令指定的路径返回相应的网页内容。

4.配置反向代理

有时候,我们需要将一些特定的请求转发到其他服务器上处理,比如将HTTPS请求转发到后端服务器处理。这时我们可以使用Nginx的反向代理功能来实现。在配置文件中添加以下内容即可

http {
    server {
        listen 80;
        server_name example.com www.example.com;
        root /var/www/example.com;
        index index.html index.htm;
        location / {
            proxy_pass http://backend_server;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在上面的示例中,location指令用于匹配特定的请求路径,proxy_pass指令用于将匹配到的请求转发到后端服务器http://backend_server上处理。proxy_set_header指令用于设置一些请求头信息,以便后端服务器正确处理请求

5.配置负载均衡

负载均衡有多种实现方式:轮询,ip hash、随机等等算法,现在常用的是轮询式。
我们先将上边配置好的nginx机器克隆三台。,其中一台为主机器,负责负载其他三台机器。
下面是nginx.conf文件,修改server中的一些属性即可。

    # ①loadB 可随意配置,不重复即可
	upstream loadB {
		server 192.168.174.202:80;
		server 192.168.174.203:80;
		server 192.168.174.204:80;
  	}
  	server {
        listen       80;
        server_name  localhost;

        location / {
            proxy_pass http://loadB; # 与①保持一致
            #     root   html;
            #    index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

我们还可以通过设置权重(weight)的方式来控制每台机器的负载量,如果一台机器的带宽很大,可以将其权重设高一点。

	server 192.168.174.202:80 weight=7;
	server 192.168.174.203:80 weight=2;
	server 192.168.174.204:80 weight=1;
  • 1
  • 2
  • 3

还可以通过hash来实现负载均衡,除了ip hash还有cookie hash和request_uri(用户请求资源地址) hash来实现负载均衡,cookie和request_uri与ip地址一样,
都具有唯一性:在pc端,不同用户访问浏览器cookie不同;在一些没有cookie的网站,或者不支持cookie(比如app端),在请求资源地址时,通过在资源路径后边加上json来保持会话,使用不同uri访问服务器,hash后的结果也不一样。

6.其他各种代理配置

以下展示不同情况下的配置:location路径、root路径、alias路径、proxy_pass代理路径。通过这几个配置路径地址对比,建议location后面都带上斜杠。

# 进程数量
worker_processes 1;

events {
# 最大连接数量
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

# 演示如何强制http跳转https
server {
listen 80;
server_name test.com;

    # http强制跳转到https
    rewrite ^(.*)$ https://$server_name$1 permanent;
}

# 演示如何配置微信支付的校验文件
server {
listen 80;
server_name localhost;

    # 默认根路径
    location / {
      root index.html;
    }
    # 微信支付校验文件,可以直接配置访问名称
    location ^~/MP_verify_2g3uEjrB5B2LIbNl.txt {
      alias /home/MP_verify_2g3uEjrB5B2LIbNl.txt;
    }
    # 微信支付校验文件,也可以通过正则配置
    location ~^/MP_verify_[a-zA-Z0-9]*\.(txt)$ {
      root /home/;
      rewrite ^/home/(.txt)$ /home/$1 last;
    }
}

# 演示root和alias两种配置静态资源的区别
server {
listen 80;
server_name localhost;

    # 用root方式,location中的路径会拼加到root的地址后面
    # 请求路径为:http://localhost:8080/files/index.jpg    实际访问为:/home/files/index.jpg
    location ~^/files/ {
      root /home/;
      index index.html index.htm;
    }
    # 用alias方式,location中的路径不会拼加到alias的地址后面
    # 这请求路径为:http://localhost:8080/files/index.jpg    实际访问为:/home/index.jpg
    location ~^/files/ {
      alias /home/;
      index index.html index.htm;
    }
}

# 演示请求后台接口代理配置
server {
listen 8080;
server_name localhost;

    #################### 第一种场景(代理地址不加斜杠) ####################
    # 当在proxy_pass指令中的url最后不加斜杠(/)则只将匹配到的URL路径部分传递给代理服务器
    # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/api/getUser
    location ^~/api/ {
      proxy_pass http://127.0.0.1:8000;
      proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
      proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
    }
    # 请求路径为:http://127.0.0.1:8080/api/getUser   实际指向为:http://127.0.0.1:8000/api/getUser
    location ^~/api {
      proxy_pass http://127.0.0.1:8000;
      proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
      proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
    }

    #################### 第二种场景(代理地址+斜杠) ####################
    # 当在proxy_pass指令中的url最后加斜杠(/)时,表示将完整的请求路径(包括匹配到的URL路径)传递给代理服务器
    # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/getUser
    location ^~/api/ {
      proxy_pass http://127.0.0.1:8000/;
      proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
      proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
    }
    # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000//getUser
    location ^~/api {
      proxy_pass http://127.0.0.1:8000/;
      proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
      proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
    }

    #################### 第三种场景(代理地址+后缀) ####################
    # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/user/getUser
    location ^~/api {
      proxy_pass http://127.0.0.1:8000/user;
      proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
      proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
    }
    # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/usergetUser
    location ^~/api/ {
      proxy_pass http://127.0.0.1:8000/user;
      proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
      proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
    }

    #################### 第四种场景(代理地址+后缀+斜杠) ####################
    # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/user/getUser
    location ^~/api/ {
      proxy_pass http://127.0.0.1:8000/user/;
      proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
      proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
    }
    # 请求路径为:http://127.0.0.1:8080/api/getUser   实际代理为:http://127.0.0.1:8000/user//getUser
    location ^~/api {
      proxy_pass http://127.0.0.1:8000/user/;
      proxy_set_header Host $http_host; #后台可以获取到完整的ip+端口号
      proxy_set_header X-Real-IP $remote_addr; #后台可以获取到用户访问的真实ip地址
    }
}

# 演示前端项目如何部署nginx
server {
listen 8090;
server_name localhost;

	# 默认访问
    # 部署路径:/home/web/my_demo
    # 访问路径为:http://localhost:8090/
    location / {
      try_files $uri $uri/ /index.html;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $http_host;
      root /home/web/my_demo/;
      index index.html index.htm;
    }

	# 带前缀的访问
    # 部署路径:/home/web/my_demo
    # 访问路径为:http://localhost:8090/my_demo/
    # 如果location路径最后没有配置斜杠,则浏览器输入访问地址后,路径最后会自动拼一个斜杠
    location ^~/my_demo/ {
      try_files $uri $uri/ /my_demo/index.html;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Host $http_host;
      root /home/web/;
      index index.html index.htm;
    }
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号