我正在使用nginx
docker
容器(https://github.com/jwilder/nginx-proxy)将请求代理到apache
在其他 docker 容器中运行的实例。每个子域都有自己的 apache docker 容器。这些子域之一 ( sub1 ) 需要一些特殊规则:
如果 URL 以“foo”开头,那么我希望 nginx 检查文件是否存在。如果文件存在,那么它应该将 URL 重写为访问控制脚本 (imageControl.php),并将其传递给通常的 apache 容器。如果该文件不存在,那么我希望将请求代理到远程服务器。
我以为我设置正确,但由于某种原因,nginx 总是将请求发送到远程服务器 - 即使文件存在于本地。
以下是 docker 容器中 nginx 配置文件的相关部分:
default.conf(包含在 nginx.conf 中):
upstream sub1.mydomain.com {
## Can be connect with "dockerized_default" network
# dockerized_sub1
server 172.18.0.2:80;
}
server {
server_name sub1.mydomain.com;
listen 80 ;
access_log /var/log/nginx/access.log vhost;
include /etc/nginx/vhost.d/sub1.mydomain.com;
location / {
proxy_pass http://sub1.mydomain.com;
}
}
/etc/nginx/vhost.d/sub1.mydomain.com :
location ^~ /foo/ {
root /path/to/dockerized/webroot;
try_files $uri @rewrite @remoteproxy;
}
location @remoteproxy {
include vhost.d/remoteproxy.inc;
proxy_pass http://remote.ip.address.here;
}
location @rewrite {
rewrite ^/(.*)$ /imageControl.php?file=$1 break;
}
请注意,我不希望 nginx 尝试运行 imageControl.php(我没有使用php-fpm
) - 我希望 nginx 将其传递给上游 apache 容器。
期望的行为示例:
(这部分有效)
- 请求是http://sub1.mydomain.com/foo/bar.png
- /path/to/dockerized/webroot/foo/bar.png 不存在,所以请求被代理到远程ip。
(这部分不起作用)
- 请求是http://sub1.mydomain.com/foo/baz.png
- /path/to/dockerized/webroot/foo/baz.png 存在,所以请求被重写为http://sub1.mydomain.com/imageControl.php?file=foo/baz.png
- 请求被发送到上游 apache 容器
我会很感激一些帮助。