今天碰到一個 docker 私有倉庫的一個坑,本來私有倉庫的搭建沒有使用 https,然后需要在使用的 docker 的 daemon.json 配置文件的 insecure-registries 配置中添加地址,但似乎這個配置只是一個白名單,是在聲明可以從這個地址獲取倉庫,但並不是優先會從這個地址獲取,仍然會優先讀取 https 地址的內容,如果 https 有響應內容,無論正確與否,都會優先使用 https 地址。
但在 nginx 配置中,如果沒有配置任何一個 443 的 https 服務的話,默認服務器是不響應 443 接口的,但是如果一旦配置了一個 443 服務,那么所有的 443 接口都會默認使用這個配置(源於 nginx 的服務搜索策略),所以一旦在私有倉庫的 nginx 上配置了其它 443 服務,就需要屏蔽一下倉庫域名下 443 接口返回的內容。
解決方案:配置 nginx 的 default_server,默認不進行返回,另外注意默認的 443 雖然不需要返回內容,但仍然需要配置 ssl 證書,否則 nginx 會報錯,證書隨意。通過 return 444 來中止響應。
server { listen 443 default_server; server_name _ ; ssl on; ssl_certificate 隨便設置一個ssl證書; ssl_certificate_key 隨便設置一個ssl證書的key; return 444; }
轉自:https://blog.51cto.com/kusorz/2136247
其它參考:
nginx 的 default_server 定義及匹配規則:https://segmentfault.com/a/1190000015681272
慎用 Nginx 的 default_server:https://www.sunzhongwei.com/about-nginx-default-server
關於Nginx的server_name:https://blog.51cto.com/onlyzq/535279
Nginx 的 default_server 指令:https://www.oschina.net/question/12_3565