Linux 符号链接未按预期工作

Linux 符号链接未按预期工作

我之前已经多次实现了我的“目标”,但遇到了一个我以前从未遇到过的问题。我在 Ubuntu 12.04 LTS 上用 Nginx 设置了一个 Web 服务器。我按照通常的方式设置了我的系统,并尝试从 sites-available 到 sites-enabled 目录为站点“虚拟主机”创建符号链接。通常,这可以通过从主 nginx 目录(以 root 身份)执行以下命令来实现:

ln -s /etc/nginx/sites-available/site.com /etc/nginx/sites-enabled/site.com

虽然我可以进入启用的目录并查看符号链接是否“有效”,但当我尝试直接在启用站点的目录中编辑文件时,我看到文件为空白并被视为新文件。因此,我的服务器无法按预期工作,页面无法加载。当我简单地将文件硬复制或硬链接到目录中时:

在 /etc/nginx/sites-available/site.com /etc/nginx/sites-enabled/site.com

一切运行正常,没有任何问题。然而,我却被困在同一个文件的两个副本中,并且没有符号链接。

到底发生了什么?

注意:这是我当前 Nginx 目录的结构:

[电子邮件保护]:/etc/nginx# ls -l
共 44
drwxr-xr-x 2 root root 4096 3月 4 17:28 conf.d
-rw-r--r-- 1 root root 964 二月 12 08:41 fastcgi_params
-rw-r--r-- 1 root root 2837 二月 12 08:41 koi-utf
-rw-r--r-- 1 root root 2223 二月 12 08:41 koi-win
-rw-r--r-- 1 root root 3463 二月 12 08:41 mime.types
-rw-r--r-- 1 root root 1022 3月 4 21:15 nginx.conf
-rw-r--r-- 1 root root 596 二月 12 08:41 scgi_params
drwxr-xr-x 2 root root 4096 3月 4 21:15 站点可用
drwxr-xr-x 2 root root 4096 3月 4 21:19 已启用站点
-rw-r--r-- 1 root root 623 二月 12 08:41 uwsgi_params
-rw-r--r-- 1 root root 3610 二月 12 08:41 win-utf

提前感谢您的帮助!

sites-enabled编辑 1:显示文件夹的内容ls -l

[电子邮件保护]:/etc/nginx/sites-enabled# ls -l
共 0
lrwxrwxrwx 1 root root 3 3 月 5 日 10:23 www -> www

最终答案

因此,在 @Insyte 和 @Michael Hampton 的帮助下,我找到了如何偶尔重现我的错误的方法。场景如下:

[电子邮件保护]:/etc/nginx# cd sites-available
[电子邮件保护]:/etc/nginx/sites-available# ls
万维网
[电子邮件保护]:/etc/nginx/sites-available# ln -s www /etc/nginx/sites-enabled/www
[电子邮件保护]:/etc/nginx/sites-available# cd /etc/nginx/sites-enabled
[电子邮件保护]:/etc/nginx/sites-enabled# ls -l
共 0
lrwxrwxrwx 1 root root 3 3 月 5 日 10:48 www -> www

我不知道“为什么”,但事实证明,如果我每次都使用完整的绝对路径,那么这个问题就不存在。

答案1

所以你那里有一个符号链接,它链接回自身。我不明白如何使用你在问题顶部列出的命令来实现这一点,所以我怀疑这个特定的符号链接是以不同的方式创建的。

我可以像这样复制你的场景:

sazerac:~ insyte$ cd testlinks/
sazerac:~/testlinks insyte$ ls
sazerac:~/testlinks insyte$ ln -s www www
sazerac:~/testlinks insyte$ ls -l
total 8
lrwxr-xr-x  1 insyte  staff  3 Mar  5 10:33 www -> www

让我们尝试一个实验。严格按照列出的步骤执行以下命令:

echo "hello insyte" > /etc/nginx/sites-available/insyte
ln -s /etc/nginx/sites-available/insyte /etc/nginx/sites-enabled
ls -l /etc/nginx/sites-enabled|grep insyte
cat /etc/nginx/sites-enabled/insyte

答案2

您不知怎么​​就成功创建了一个链接到自身的符号链接。我甚至不知道您可以这样做,但我确信这不会产生您想要的结果。

要修复此问题,请删除符号链接并正确重新创建它。

rm -f /etc/nginx/sites-enabled/www

或者只需使用该-f选项ln,它可能会为您删除无效的符号链接。

ln -fs /etc/nginx/sites-available/www /etc/nginx/sites-enabled/www

答案3

出于习惯:

  • 我总是使用它ln -sfn来确保所有旧链接都能顺利更新。
  • 我总是使用绝对路径:
ln -sfn /absolute/path/to/original /absolute/path/to/link

這可以幫助我避免許多困難。

相关内容