当前位置: 首页 > 知识库问答 >
问题:

404尝试使停靠的nginx服务于卷中装载的静态文件时

昝宜
2023-03-14

我正在努力在docker容器内设置nginx。我基本上有两个容器:

>

  • 一个php: 7-apache容器,用于动态网站,包括其静态内容。

    一个nginx容器,其中装载了一个卷作为/home/www data/static content文件夹(我在docker compose.yml中这样做),以尝试为静态网站提供服务(与apache容器提供的服务无关)。

    我想用域dynamic.localhost来服务我的动态网站,static.localhost服务我的静态网站只由静态文件组成。

    我的nginx容器有以下Dockerfile:

    ########## BASE #########
    
    FROM nginx:stable
    
    ########## CONFIGURATION ##########
    
    ARG DEBIAN_FRONTEND=noninteractive
    
    ENV user www-data
    
    COPY ./nginx.conf /etc/nginx/nginx.conf
    COPY ./site.conf /etc/nginx/conf.d/default.conf
    
    RUN touch /var/run/nginx.pid && \
        chown -R ${user}:${user} /var/run/nginx.pid && \
        chown -R www-data:www-data /var/cache/nginx
    
    RUN chown -R ${user} /home/${user}/ && \
        chgrp -R ${user} /home/${user}/
    
    USER ${user}
    

    如您所见,我正在为nginx使用两个配置文件:nginx。配置和站点。这里是nginx。conf(这并不重要,因为它没有什么特别之处,但如果我做错了什么,请告诉我):

    worker_processes auto;
    error_log /var/log/nginx/error.log debug;
    pid       /var/run/nginx.pid;
    
    events {
        worker_connections 1024;
    }
    
    http {
        include /etc/nginx/mime.types;
        default_type application/octet-stream;
    
        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log /var/log/nginx/access.log main;
        sendfile on;
        keepalive_timeout 65;
        include /etc/nginx/conf.d/*.conf;
    }
    

    这是文件站点。确认我已经在正确书写方面失败了好几天了:

    server {
        listen 8080;
        server_name static.localhost;
        root /home/www-data/static-content;
    
        location / {
            try_files $uri =404;
        }
    }
    
    server {
        listen 8080;
        server_name dynamic.localhost;
    
        location / {
            proxy_pass http://dynamic;
            proxy_redirect off;
            proxy_set_header Host $host:8080;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Port 8080;
            proxy_set_header X-Forwarded-Host $host:8080;
        }
    }
    

    (超文本传输协议://动态将请求传递给我命名为“动态”的apache容器)。

    所以基本上,我一直在为我试图访问的静态内容目录中的任何文件获得404。例如:

    • 静态的。localhost:8080/索引。html应该提供/home/www-data/static-content/index。html,但我得到的是404

    我尝试了各种方法,比如编写try_文件/home/www-data/static-content/$uri,但没有得到任何结果。我阅读了nginx文档的一些部分,并搜索了stackoverflow,但没有找到任何帮助。如果我犯了一个愚蠢的错误,我向你道歉,但我现在唯一关心的是让它发挥作用,并理解我做错了什么。

    谢啦

  • 共有2个答案

    那弘
    2023-03-14

    我也遇到了同样的问题,我必须更改用户组对已装入卷文件的权限。

    在dockerfile上运行useradd-G root, www.-data-u 1000${user}

    并更改了主机文件的权限chmod 775/home/www-data/static-content-R

    乐欣可
    2023-03-14

    我通过简单地不使用静态文件的卷,而是在容器中复制它们来解决问题。我怀疑这是由于docker compose装载卷的方式以及nginx进程以非根用户身份运行的权限问题。这不是一个完美的解决方案,因为我必须放弃使用卷,但它可以。

     类似资料:
    • 我试着设置nginx来服务我的node.js应用程序静态文件。问题是,当我试图得到我的文件时,我的状态是403禁止的。 当我尝试下载一个文件从 /root/appJs/public/css/style.css我写http://sitename.com/css/style.css我retive 403禁忌状态。我已经在一些论坛上寻找解决方案,但没有

    • 问题内容: Docker菜鸟在这里,尝试使用Compose设置一个简单的Django项目。过,我已经在此方面取得了成功,但是这次我正在尝试一种不同的设置,但我不知道为什么它不起作用。 我有以下docker-compose.yml文件: 我的/ Dockerfile是: 我的/ docker / web / Dockerfile是: 我的/docker/web/default.conf文件是: do

    • 问题内容: 我的要求是,我应该通过一个安静的服务将10MB的zip文件发送给客户端。我在论坛中找到了发送对象是更好的方法的代码,但是如何在以下代码中创建对象: 问题答案: 它是下载文件的更好方法和简便方法。 对于您所要求的代码:

    • 我从Apache切换到Nginx,使用apache,皮肤文件夹中的所有静态文件(图像、css、javascript)都直接由Apache提供服务。 示例: 我读了一些关于Nginx和Plone的文档,但我没有看到。下面是Plone.orgconf的例子:https://github.com/plone/plone-org-nginx/blob/master/nginx.conf 所以,我的问题是:

    • 我对docker比较陌生。我想建立一个postgres数据库,但我想知道如果我重新创建容器,如何确保数据不会丢失。 然后我偶然发现了命名卷(不是绑定卷)以及如何使用它们。但是...在Dockerfile中,您不能使用命名卷。例如data:/var/lib等。正如我使用Dockerfile所理解的那样,它总是一个匿名卷。所以每次我重新创建一个容器时,它都会得到自己的新卷。 所以我的问题来了: 首先:

    • 问题内容: 是否有任何更快的基准测试或比较:将nginx放在node前面,让它直接提供静态文件,还是仅使用node并使用它提供静态文件? nginx解决方案对我来说似乎更易于管理,有什么想法吗? 问题答案: 我必须不同意这里的答案。尽管Node可以正常运行,但是如果配置正确,nginx肯定会更快。遵循类似的模式(仅在需要时返回连接),并且占用内存很少,因此可以在C中高效地实现nginx。而且,它支