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

当NGINX无法访问应用程序文件时配置NGINX,以及php-fpm和docker

锺英卫
2023-03-14

所以我的docker设置如下:我有一个接受HTTP请求的Nginx容器,我有另一个容器(我的自定义容器),其中有php-fpm和我的应用程序代码。应用程序代码不在主机上,只在Web容器中。

我想将Nginx配置为一个代理,以获取请求并将它们路由到phpfpm。

我的nginx确认如下(我删除了一些不重要的部分):

upstream phpserver {
    server web:9000;
}

server {
    listen 443 ssl http2;
    server_name app;
    root /app/web;

    ssl_certificate       /ssl.crt;
    ssl_certificate_key  /ssl.key;

    location ~ ^/index\.php(/|$) {
        fastcgi_pass phpserver;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_read_timeout 160;

        internal;
        http2_push_preload on;
    }
}

我的docker配置(同样,我删除了一些不重要的部分)

nginx:
  ports:
  - 443:443/tcp
  - 80:80/tcp
  image: nginx
  links:
  - web:web

web:
  image: custom_image
  container_name: web

通过这种配置,我得到了以下Nginx错误:“open()”/app/web“failed(2:没有这样的文件或目录)”,因为Nginx没有访问该文件夹的权限(该文件夹位于php fpm所在的web容器中)。

有没有办法配置Nginx来路由HTTP请求,即使它没有访问应用程序代码的权限?

我知道解决这个问题的方法之一是将应用程序代码装载到Nginx容器中,但如果可能的话,我希望避免这样做。原因是,在swarm模式下,如果两个容器不共享一个主机,那么这将不起作用。

共有1个答案

沃宇
2023-03-14

我设法解决了这个问题,所以我为有类似问题的人发布了我自己的解决方案。

解决方案是在nginx配置中使用“alias”指令,而不是使用“root”指令(我删除了一些不重要的部分):

upstream phpserver {
  server web:9000;
}

server {
    listen 443 http2;
    ssl on;
    server_name app;

    ssl_certificate       /ssl.crt;
    ssl_certificate_key  /ssl.key;

    location ~ ^/index\.php(/|$) {
        alias /app/web;

        fastcgi_pass phpserver;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_index index.php;
        include fastcgi_params;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;

        internal;
        http2_push_preload on;
    }
}

现在,请求被正确地路由到端口9000上的phpserver,并在那里由php fpm处理。Php fpm通过查看“alias”指令知道要执行哪个脚本。

现在的问题是如何提供静态文件。一个解决方案是通过PHP fpm为他们服务,但是从我在网上读到的来看,不建议这样做,因为开销会更大。所以我的解决方案是与nginx docker容器共享所有静态文件,这样ngnix就可以访问它们并直接为它们提供服务。如果有人有关于如何在这种情况下服务静态文件的更好的解决方案,请告诉我。

# Cache Control for Static Files
location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
    #access_log        on;
    #log_not_found     off;
    expires           360d;
}
 类似资料:
  • 我正在努力理解我的错误在哪里。我看了各种答案并尝试了补救措施,结果发现他们的解决方案并没有纠正我的问题。我已经将所有内容剥离到最基本的部分,看看是否可以得到一个基本的PHP索引。php来展示自己。 以下是我试图在核心实现的目标: 我有docker compose站在1个网络上,2个服务连接到网络上。一个服务是PHP-FPM,另一个是为PHP-FPM服务的nginx。每次我站起来,不管我如何配置它,

  • 我花了几个小时在这个问题上,尽管相关帖子很多,但我无法解决它。我有一个Fedora 20盒与Nginx PHP-FPM,直到今天工作得很好(在我重新加载php-fpm.service我猜)。Nginx提供的静态文件没有问题,但是任何PHP文件都会触发错误403。 权限正常,nginx和php fpm在用户“nginx”下运行: 服务的文件也被设置为nginx用户,我甚至结束了chmoding 77

  • 我有一个nginx和php fpm配置,但当我从浏览器访问它时,只有索引。php正在执行,但我无法调用其余文件。 nginx配置 在/etc/nginx/conf.d中进行配置/ 这是几行错误代码。日志和访问。日志 2015/11/06 12:40:53[错误]19346#0:*1 FastCGI在stderr中发送:“无法打开主脚本:/var/www/Cachet/public/dashboar

  • 当我尝试访问我发现一个

  • 运行Nginx 1.17的Digital Ocean Ubuntu18.04 VPS。10 PHP-FPM7.3。我不知道如何正确运行PHP文件(其他一切都正常运行)php文件生成Nginx的404未找到页面。Nginx错误日志仅显示“信号处理已启动”每次更改后,我都会重新启动nginx fpm。我已经研究了几乎所有与此相关的StackOverflow问题,并尝试了各种不同的配置。如果您能提供任何

  • 我将docker compose与以下: nginx conf是: 它工作得很好,如果我创建。但是,如果我想访问,我有一个403错误,并在docker-comple中使用以下日志: 我试过其他Q中的建议