【问题标题】:Why am I getting this Nginx error about "No such file or directory"?为什么我会收到有关“没有这样的文件或目录”的 Nginx 错误?
【发布时间】:2016-05-20 15:21:39
【问题描述】:

我正在尝试创建一个本地 pip2pi 存储库,然后通过 Nginx 提供它。我已经成功创建了 repo,并且在我的本地机器上拥有了我想要的所有轮子文件。它们的位置如下:

/home/user/code/misc/pip-packs/simple
  \
    ---index.html   
    --- amqp
    \
      -------- index.html
      -------- amqp-1.4.6-py2-none-any.whl
    --- django
    \
      -------- index.html
      -------- Django-1.9.3-py2.py3-none-any.whl
    ... ETC

现在提供我在 docker 上使用 Nginx 的文件,只需使用官方的 Nginx docker 映像。我像这样运行容器:

docker run --name pypi-nginx -p 80:80 \
-v /home/user/code/misc/pip-packs/simple:/usr/share/nginx/html \
-d nginx

我可以打开 localhost 并在根目录 (/) 中查看 index.html,然后我可以单击一个链接,例如amqp 然后获取 amqp-1.4.6-py2-none-any.whl 文件的链接。当我单击链接时,我希望启动下载。但是我从 Nginx 得到一个 404 页面。

文件肯定在那里,我可以运行:

docker exec -it pypi-nginx /bin/bash

然后 ls 和 /usr/share/nginx/html 目录,查看来自 voulume 的所有文件。

我还可以在本地运行 pip install amqp-1.4.6-py2-none-any.whl,所以我知道这是一个实际的轮子文件。

Nginx官方的日志错误是:

2016/05/20 14:48:01 [error] 7#7: *1 open() "/usr/share/nginx/html/funcsigs/funcsigs-0.4-py2.py3-none-any.whl" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /funcsigs/funcsigs-0.4-py2.py3-none-any.whl HTTP/1.1", host: "localhost", referrer: "http://localhost/funcsigs/"

但它为每个 firectory 中的索引文件提供服务。我使用的 nginx 配置文件是容器中的标准配置文件。如有必要,我可以发布这些。

【问题讨论】:

  • 是否存在潜在的文件权限问题? index.html.whl 文件是否具有相同的所有者和权限?

标签: nginx docker pip


【解决方案1】:

在目录 /home/user/code/misc/pip-packs/ 是 pip2pi 存储它下载的包的地方。所以在 /home/user/code/misc/pip-packs/ 你有

/home/user/code/misc/pip-packs/
\
  --- amqp-1.4.6-py2-none-any.whl
  --- Django-1.9.3-py2.py3-none-any.whl
  --- ETC

然后在上面问题中描述的简单目录中,每个 repo 文件夹应该也有轮文件,但是有一个 404。好吧,我忽略了 dir2pi pip-packs/ 命令,它只创建了符号链接,并没有复制轮文件。因此,当我将卷安装到容器时,所有符号链接指向的实际轮文件从未被复制到容器中。

Django 文件夹(packages/simple/django)的“ls -al”的输出是:

drwxr-xr-x  2 bdew70 bdew70 4096 May 20 11:02 .
drwxr-xr-x 64 bdew70 bdew70 4096 May 20 11:02 ..
lrwxrwxrwx  1 bdew70 bdew70   39 May 20 11:02 Django-1.9.3-py2.py3-none-any.whl -> ../../Django-1.9.3-py2.py3-none-any.whl
-rwxr-xr-x  1 bdew70 bdew70   88 May 20 11:02 index.html

解决方案是制作一个 Dockerfile,然后将 ADD 轮文件放到 /user/share/nginx/ 文件夹以及将 html 文件放到 /usr/share/nginx/html/ 文件夹。 Dockerfile 应该如下所示:

FROM nginx
ADD packages/simple /usr/share/nginx/html/
ADD packages /usr/share/nginx

这个故事的寓意是在调查文件问题时使用“-al”(或为 ls 创建别名)并注意 Docker 容器卷中的符号链接。特别是如果符号链接是相对的并且格式为../../some-file

【讨论】:

  • 所以主要原因是docker卷没有挂载符号链接文件。
  • @warmoverflow 是的,这就是 docker 文件中第二个 ADD 的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2015-11-05
  • 2017-04-05
  • 2019-05-23
  • 2021-10-31
  • 1970-01-01
  • 2023-02-18
相关资源
最近更新 更多