所以我的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模式下,如果两个容器不共享一个主机,那么这将不起作用。
我设法解决了这个问题,所以我为有类似问题的人发布了我自己的解决方案。
解决方案是在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
当我尝试访问我发现一个
我将docker compose与以下: nginx conf是: 它工作得很好,如果我创建。但是,如果我想访问,我有一个403错误,并在docker-comple中使用以下日志: 我试过其他Q中的建议
运行Nginx 1.17的Digital Ocean Ubuntu18.04 VPS。10 PHP-FPM7.3。我不知道如何正确运行PHP文件(其他一切都正常运行)php文件生成Nginx的404未找到页面。Nginx错误日志仅显示“信号处理已启动”每次更改后,我都会重新启动nginx fpm。我已经研究了几乎所有与此相关的StackOverflow问题,并尝试了各种不同的配置。如果您能提供任何