通过docker-compose编排的容器总是有一些奇怪的问题

问题核心就是go-server和nginx所属不同的容器, 需要外界能访问到go的服务就需要进行转发了

如果是在同一个容器中只需要:

 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
server {
    listen       80;
    server_name  .a.com;

    charset utf-8;
    access_log  /home/a.com.access.log;

    location /(css|js|fonts|img)/ {
        access_log off;
        expires 1d;

        root "/path/to/app_a/static";
        try_files $uri @backend;
    }

    location / {
        try_files /_not_exists_ @backend;
    }

    location @backend {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host            $http_host;

        proxy_pass http://127.0.0.1:8080;
    }
}

beego-nginx部署

那么如果是两个容器当中呢? 基于上面的例子, 我们需要用到upstream,

 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

upstream go_server_proxy {
    # 这里的server 需要用到 容器名:端口 的形式
    server go_server:9090;
}

server {
    listen       80;
    server_name  localhost;
    root /var/www;
    index index.html;

    charset utf-8;
    access_log  /var/log/nginx/def.access.log;

    location /(css|js|fonts|img)/ {
        access_log off;
        expires 1d;

        root "/var/www/static";
        try_files $uri @backend;
    }

    location / {
        try_files /_not_exists_ @backend;
    }

    location @backend {
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host            $http_host;
        proxy_pass  http://go_server_proxy;
    }
}

这样做的原因是容器之间的ip并不固定, 使用容器名做host地址是更简单的选择