You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nginx反向代理+Docker环境下,将Drupal部署到子域名的子目录并正常访问

如何在Nginx反向代理+Docker环境下,将Drupal部署到子域名的子目录并正常访问

嘿,我太懂你现在的处境了——已经把jwilder的Nginx反向代理、子域名根目录的静态页、/pma的phpMyAdmin都跑顺了,结果把Drupal FPM容器部署到website.domain.com/v22、/v23这类子目录时,死活访问不了。别着急,咱们一步步来搞定这个问题:

一、先给Nginx反向代理加自定义站点配置

jwilder的反向代理镜像支持挂载自定义的虚拟主机配置,这是解决子目录转发的核心。你需要给website.domain.com这个子域名单独加一套路径转发规则:

  1. 首先,确保你的jwilder/nginx-proxy容器的docker-compose配置里,挂载了vhost.d目录,这样才能放自定义配置:
nginx-proxy:
  image: jwilder/nginx-proxy
  container_name: nginx-proxy
  restart: unless-stopped
  ports:
    - "80:80"
    - "443:443"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - ./vhost.d:/etc/nginx/vhost.d  # 就是这个挂载项,必须加上
    - ./html:/usr/share/nginx/html
  networks:
    - proxy-tier
  1. 在宿主机的./vhost.d目录下,创建一个名为website.domain.com_location的文件(注意这个文件名格式,jwilder会自动识别为该域名的location规则),把每个Drupal站点的转发规则写进去。

二、编写Nginx的子目录转发规则

这个配置是关键,要处理静态文件、PHP请求转发,还有Drupal的干净URL规则。以v23和v22为例:

# 处理v23站点的所有请求
location /v23 {
    # 直接映射宿主机挂载的静态文件,比走FPM更快
    alias /var/www/html/v23;
    # 先找静态文件,找不到就走重写规则
    try_files $uri $uri/ @v23;

    # 专门处理PHP文件,转发到v23的FPM容器
    location ~ ^/v23/.+\.php$ {
        alias /var/www/html/v23;
        # 用容器名就能访问,因为在同一个proxy-tier网络里
        fastcgi_pass v23:9000;
        # 拆分PHP路径,适配子目录结构
        fastcgi_split_path_info ^/v23(.+\.php)(/.+)$;
        # 必须正确设置这几个参数,否则FPM找不到文件
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param SCRIPT_NAME /v23$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
    }
}

# Drupal的干净URL重写规则
location @v23 {
    rewrite ^/v23/(.*)$ /v23/index.php?q=$1 last;
}

# 同理复制v22的规则,把所有v23替换成v22,fastcgi_pass指向v22容器
location /v22 {
    alias /var/www/html/v22;
    try_files $uri $uri/ @v22;

    location ~ ^/v22/.+\.php$ {
        alias /var/www/html/v22;
        fastcgi_pass v22:9000;
        fastcgi_split_path_info ^/v22(.+\.php)(/.+)$;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_param SCRIPT_NAME /v22$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
    }
}

location @v22 {
    rewrite ^/v22/(.*)$ /v22/index.php?q=$1 last;
}

三、调整Drupal的settings.php配置

因为是从其他域名迁移过来的,必须适配新的子目录路径:

  1. 打开每个站点的settings.php(比如./html/v23/sites/default/settings.php),设置正确的基础URL:
$base_url = 'https://website.domain.com/v23'; // 对应每个站点的子目录
  1. 添加信任的主机名,避免Drupal的主机验证报错:
$settings['trusted_host_patterns'] = [
  '^website\.domain\.com$',
];
  1. 确保文件系统路径正确,避免静态文件访问失败:
$settings['file_public_path'] = 'sites/default/files';
  1. 开启干净URL支持(如果之前的站点是开启的):
$settings['clean_url'] = TRUE;

四、最后检查容器和权限细节

  • 确认所有Drupal容器和Nginx反向代理都在proxy-tier网络里,这样Nginx才能通过容器名(比如v23)找到对应的FPM服务
  • 检查宿主机挂载目录的权限:执行chown -R 82:82 ./html/v23(因为alpine镜像里www-data的UID是82,宿主机可能不同,用这个UID能匹配容器内的权限),或者用chmod -R 755 ./html/v23临时测试

配置完这些后,重启Nginx反向代理容器(docker restart nginx-proxy)和Drupal容器,再访问website.domain.com/v23应该就能正常打开了。如果还是有问题,可以先访问website.domain.com/v23/index.php,如果能打开说明FPM转发正常,只是干净URL的规则需要调整;如果是502错误,检查容器网络是否连通;403错误就是权限的问题啦。

备注:内容来源于stack exchange,提问作者farbenrausch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:04:30