我有一个在 上运行的服务(docker 注册表)port 5000
,我已经安装了 nginx 将 http 请求从 重定向8080
到5000
。如果我卷曲localhost:5000
它可以工作,但是当我卷曲时localhost:8080
我会得到一个错误的网关错误。
nginx 配置文件:
upstream docker-registry {
server localhost:5000;
}
server {
listen 8080;
server_name registry.mydomain.com;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 0;
chunked_transfer_encoding on;
location / {
proxy_pass http://docker-registry;
}
location /_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
location /v1/_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
}
在/var/log/nginx/error.log
我有:
[crit] 15595#0: *1 connect() to [::1]:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain.com, request: "GET / HTTP/1.1", upstream: "http://[::1]:5000/", host: "localhost:8080"
任何想法?
答案1
我假设它是一个 Linux 机器,所以很可能 SELinux 正在阻止连接,因为没有允许连接的策略。
你应该能够运行
# setsebool -P httpd_can_network_connect true
然后重启nginx。
答案2
根据错误消息,我想知道 localhost:5000 是否被解析为 ipv6 地址,而您可能不希望这样做。您可以尝试将其更改为 127.0.0.1:5000
编辑:在您的 proxy_pass 行中,您可能缺少部分 URL?尝试添加 $request_uri ,这样它可能是:
proxy_pass http://docker-registry/$request_uri;
或者可能:
proxy_pass http://docker-registry$request_uri;
不确定哪一个是最正确的。
另一件需要考虑的事情。您的配置表明:
server_name registry.mydomain.com;
因此,localhost:8080 可能不匹配。为了进行测试,您可以将其更改为:
server_name registry.mydomain.com localhost;
然后 localhost:8080 以及您的域将被匹配。我假设registry.mydomain.com只是一个示例,您可以将真实服务器的FQDN放在那里。