docker nginx 代理宿主机服务

docker 的出现解决了我们很多问题,让我们避免陷入各种依赖安装的痛苦中,但是docker本身自己也有一些自己的规则,如果不知道也会让我们走很多弯路。

最近在阿里云服务启动了一个nginx容器,在代理静态文件的时候都是正常访问的,但是在进行反向代理tomcat服务的过程中就一直报错:

[error] 37#37: *5 connect() failed (111: Connection refused) while connecting to upstream, client: 111.199.4.122, server: 8.140.97.8, request: "GET /wuxingtest-1.0-SNAPSHOT HTTP/1.1", upstream: "http://127.0.0.1:8080/wuxingtest-1.0-SNAPSHOT", host: "8.140.97.8" 

大意就是连接失败,而且页面提示的 502 Bad Gateway,本来以为是服务问题,经过本地访问正常,后来以为是权限问题,于是又修改了tomcat目录的权限,但是问题依旧存在。然后尝试了修改nginx配置也无法解决问题。

总之各种方式尝试之后都没有解决问题,最后想会不会是docker的配置跟本机安装的配置方式不一样?因为虽然docker的配置文件可以用宿主机的配置文件,但是解析毕竟是在docker容器中进行的,而docker容器中的localhost跟宿主机的localhost肯定不一样,果然如此!

ip addr show docker0 

就是:172.17.0.1

3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default link/ether 02:42:f1:49:65:45 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:f1ff:fe49:6545/64 scope link valid_lft forever preferred_lft forever 
 upstream music { server 172.17.0.1:8080; } server { listen 80;   server_name xx.xx.xx.xx; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  proxy_pass http://music; } } 
http://xx.xx.xx.xx/pro/ 

mac下的docker有加一层虚拟机,所以无法直接访问,需要使用docker.for.mac.host.internal,也就是说,如果想要通过mac下的docker访问宿主机的ip需要使用docker.for.mac.host.internal,一下就是一个server的配置例子

 upstream rest_8080 { server docker.for.mac.host.internal:8080; } server { listen 80; server_name 123.com; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://rest_8080; } } 

常见的问题 400

本来请求的方法和路径都是正常的,本地直接访问也正常,但是被nginx代理之后就报400,这时候需要检查一下 location的配置,是不是把代理的header信息给丢掉了,还是上面的例子,如果改成下面这种方式就会报400

upstream rest_8080 { server docker.for.mac.host.internal:8080; } server { listen 80; server_name 123.com; location / {  proxy_pass http://rest_8080; } } 

解决办法就是把下面丢掉的三行header补充回来。

 proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

mac下nginx代理本地服务的nginx.conf例子

首先需要修改hosts文件:

sudo vi /etc/hosts 

添加内容如下:

127.0.0.1 123.com 127.0.0.1 abc.com 
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; 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;  keepalive_timeout 65;  upstream rest_8080 { server docker.for.mac.host.internal:8080; } server { listen 80;  server_name 123.com; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://rest_8080; } }  upstream rest_8090 { server docker.for.mac.host.internal:8090; } server { listen 80;  server_name abc.com; location / { proxy_set_header Host $host:$server_port; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://rest_8090; } }  include /etc/nginx/conf.d/*.conf; } 

首先需要明确的是,对于docker nginx来说,它只知道docker容器内的目录,因此如果我们宿主机的文件如果想要被docker容器的nginx代理那么首先需要在创建docker容器的时候把目录映射好,否则docker是不会代理到的。如下创建docker nginx代理容器:($PWD代表当前操作的宿主机目录)

docker run -id --name=c_nginx \ -p 80:80 \ -v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \ -v $PWD/logs:/var/log/nginx \ -v $PWD/html:/usr/share/nginx/html \ nginx 

比如我说我们当前在/opt/data/nginx目录下创建的docker,那么这个目录下要有 conf、logs、html三个子文件夹。这个条命令执行完成之后,docker容器的目录下面的几个目录会跟我们的宿主机的这几个目录相对应起来。
这时候比如说我们想把某一个域名 abc.com代理到 /opt/data/nginx/html/abc 目录下面,那么我们应该进行如下配置:

server { listen 80; server_name abc.com;          root /usr/share/nginx/html/abc; } 

原文链接:https://blog.csdn.net/tengdazhang770960436/article/details/113408092

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享