背景
我一直在使用 Nginx Proxy Manager 这个软件来当我的主NGINX使用,他提供了友好的管理界面和便捷SSL证书管理功能。
作为一个企图将一切容器化的狂热分子,我的NGINX Proxy Manager(后面我简称npm)也是使用容器部署的。某天我尝试进行迁移演练的时候发现我将npm的配置文件使用scp命令迁移到另一台主机之后,npm会报奇怪的错误日志:
Renewal configuration file /etc/letsencrypt/renewal/npm-2.conf is broken. The error was: expected /etc/letsencrypt/live/npm-2/cert.pem to be a symlink
The error was: expected /etc/letsencrypt/live/npm-2/cert.pem to be a symlink
字面意思是,他期待这个文件是符号链接,结果这个文件不是的。
我进入npm的容器shell
[root@docker-MikroTik:/etc/letsencrypt]# ls -l live/npm-2/cert.pem -rw-r--r-- 1 root root 1602 Apr 29 04:37 live/npm-2/cert.pem
好像这个文件还真不是个链接,他现在是个文件,我又去源服务器上面看了一眼:
[root@localhost nginx]# ls -l letsencrypt/live/npm-2/cert.pem lrwxrwxrwx. 1 root root 30 Apr 17 08:02 letsencrypt/live/npm-2/cert.pem -> ../../archive/npm-2/cert1.pem
嗯,源文件没问题,是一个链接,指向一个相对位置。
好嘛,问题找到了!
解决问题
根据网上查的资料
使用scp命令来拷贝文件的话,似乎他会将连接对应的源文件拷贝过去。
如果你是真的想拷贝链接本身的话,你应该使用rsync来拷贝而不是scp命令。
好吧,那我们使用scp来拷贝我们的证书:
rsync -Wav letsencrypt root@192.168.1.1:/data/data/nginx_cloud
然后再来检查下:
[root@docker-MikroTik:/etc/letsencrypt]# ls -l live/npm-2/cert.pem lrwxrwxrwx 1 root root 30 Apr 17 12:02 live/npm-2/cert.pem -> ../../archive/npm-10/cert1.pem
好滴,变成链接了,npm也不报错了!
结论
我们在尝试Linux主机之间拷贝文件的时候,如果使用的是scp命令,他会尝试将你的文件链接对应的文件拷贝过去,而不是拷贝链接本身。
如果你的应用软件对文件做检查,发现文件不对劲的时候,就会报错。
如果你想要拷贝链接本身,则使用rsync工具来替代scp命令!
参考资料:
https://superuser.com/questions/233036/scp-copy-the-symlinks