求助: docker nginx 转发 同一台机器上 部署的 go 服务。

2020-04-26 09:50:06 +08:00
 ackmanfork

新买入一个阿里云服务器,以及一个域名 已经做了域名解析。 二级域名准备了两个 a.xx.com b.xx.com

用 docker 搞了一个 nginx 运行在本地 80 端口 容器内也为 80 端口 其中 a.xx.com 直接指向静态资源,可以访问。 b.xx.com 反向代理到 本地已经运行的 9090 端口 但是一直报 404 使用 b.xx.com 不能访问 报 404 但是使用 b.xx.com:9090 却可以访问。 端口 9090 也已经在阿里云做了 安全组, 本地也打开了防火墙

查看 err.log 报以下错误 *2 connect() failed (111: Connection refused) while connecting to upstream,

百度 google 换了各种关键字 查找了一个星期 网上各种相关的问答基本试过了一遍 但是还是未能解决这个问题

小弟愚钝,初学 ocker 以及 go 服务 望大手帮忙看下问题出在哪里

感谢 下面是 conf.d 配置

server { listen 80;
#listen [::]:80; server_name b.xx.com

#charset koi8-r;  

#location /(css|js|fonts|img)/ {
#    root /usr/web/Html;
#	try_files $uri @backend;
#}

location / {  
try_files @uri  @backend;
}  
location @backend{
proxy_redirect off;
#proxy_pass http://backendserver;
proxy_pass http://127.0.0.1:9090;
proxy_set_header    Host    $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
}
#error_page  404              /404.html;  

# redirect server error pages to the static page /50x.html  
#  
error_page   500 502 503 504  /50x.html;  
location = /50x.html {  
    root   /usr/share/nginx/html;  
}  

# proxy the PHP scripts to Apache listening on 127.0.0.1:80  
#  
#location ~ \.php$ {  
#    proxy_pass   http://127.0.0.1;  
#}  

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000  
#  
#location ~ \.php$ {  
#    root           html;  
#    fastcgi_pass   127.0.0.1:9000;  
#    fastcgi_index  index.php;  
#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  
#    include        fastcgi_params;  
#}  

# deny access to .htaccess files, if Apache's document root  
# concurs with nginx's one  
#  
#location ~ /\.ht {  
#    deny  all;  
#}  

}

2114 次点击
所在节点    问与答
12 条回复
ackmanfork
2020-04-26 09:53:40 +08:00
上周被这个问题搞的掉了 一斤头发 。 跪求 V 站 大佬。
kebyn
2020-04-26 10:02:40 +08:00
@ackmanfork
proxy_pass http://127.0.0.1:9090; -> proxy_pass http://b.xx.com:9090;
docker 内的 127.0.0.1:9090 应该没有这个服务
ackmanfork
2020-04-26 10:07:48 +08:00
@kebyn 意思是 nginx 访问 127.0.0.1 是访问到 docker 容器内了吗? 刚才试了下 报了另一个错
host not found in upstream "bb.xx.com" in /etc/nginx/conf.d/mo.conf:22
ackmanfork
2020-04-26 10:24:29 +08:00
大佬们,指点下吧。 (╯﹏╰)
MisakaTang
2020-04-26 10:29:06 +08:00
试一下配置二级域名的反向代理?
zdt3476
2020-04-26 10:32:03 +08:00
```
upstream bb.xx.com {
server 127.0.0.1:9090;
}

server {
...
proxy_pass http://bb.xx.com;
...
}
```
这样呢?
stille
2020-04-26 10:32:56 +08:00
如果反代强制 https 话用这个试试,自己改下域名和 ssl 路径

upstream dockername {
server 172.17.0.1:9090; # 端口改为 docker 容器提供的端口
}

server {
listen 80;
server_name www.yourdomain.com;
return 301 https://www.yourdomain.com$request_uri;
}

server {
listen 443 ssl;
server_name www.yourdomain.com;
gzip on;

ssl_certificate /usr/local/nginx/conf/ssl/www.yourdomain.com.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/www.yourdomain.com.key;

# access_log /var/log/nginx/dockername_access.log combined;
# error_log /var/log/nginx/dockername_error.log;

location / {
proxy_redirect off;
proxy_pass http://dockername;

proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;

client_max_body_size 100m;
client_body_buffer_size 128k;

proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
}


如果不用 https,用这个.

server
{
listen 80;
#listen [::]:80;
server_name www.yourdomain.com ;
index index.html index.htm index.php default.html default.htm default.php;
#root /home/wwwroot/www.yourdomain.com;

return 301 https://www.yourdomain.com$request_uri;

include enable-php-pathinfo.conf;

location / {
proxy_redirect off;
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_pass http://172.17.0.1:9090;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

#location ~ .*\.(js|css)?$
#{
# expires 12h;
#}

location ~ /.well-known {
allow all;
}

location ~ /\.
{
deny all;
}

access_log off;
}
stille
2020-04-26 10:34:48 +08:00
反代 IP 127.0.0.1 是 nginx 所在的主机,也就是容器内的本地 IP,你应该用宿主机的内网 IP
ackmanfork
2020-04-26 11:08:48 +08:00
@kebyn
@MisakaTang
@zdt3476
@stille

谢谢回复, 找到问题。就是很基础的 docker 部署的 nginx, 配置的 127.0.0.1 就是 nginx 所在容器内环境

我换成 本地内 网 ip 可以, 瞬间豁然开朗。可是之前改过一次外网的 ip 没有成功是为什么呢
容器内环境解析不到外网 ip ?
还是得看先看点基础书啊。
再次感谢。
@stille

拜谢。
xiri
2020-04-26 11:12:38 +08:00
你都用 docker 了为什么不干脆把 go 服务也做成 docker 运行,然后 docker 容器之间用网络桥接
你的 nginx 在 docker 里面的话访问到的 127.0.0.1 是 docker 里面的,然而你的 docker 里面并没有这个服务
ackmanfork
2020-04-26 11:18:20 +08:00
@xiri 嗯嗯, 因为 就是新手学 docker 练手的。正好前不久看到 git 有个 go 服务,我就拿来做网站用了 。没有规划那么多
谢谢老哥建议。 接下来 试下你说的网络桥接方式。
whileFalse
2020-04-26 12:20:36 +08:00
运行 nginx 的时候,docker run 加上 --network=host 这个参数就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666159

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX