如何在Nginx反向代理+Docker环境下,将Drupal部署到子域名的子目录并正常访问
如何在Nginx反向代理+Docker环境下,将Drupal部署到子域名的子目录并正常访问
嘿,我太懂你现在的处境了——已经把jwilder的Nginx反向代理、子域名根目录的静态页、/pma的phpMyAdmin都跑顺了,结果把Drupal FPM容器部署到website.domain.com/v22、/v23这类子目录时,死活访问不了。别着急,咱们一步步来搞定这个问题:
一、先给Nginx反向代理加自定义站点配置
jwilder的反向代理镜像支持挂载自定义的虚拟主机配置,这是解决子目录转发的核心。你需要给website.domain.com这个子域名单独加一套路径转发规则:
- 首先,确保你的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
- 在宿主机的
./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配置
因为是从其他域名迁移过来的,必须适配新的子目录路径:
- 打开每个站点的
settings.php(比如./html/v23/sites/default/settings.php),设置正确的基础URL:
$base_url = 'https://website.domain.com/v23'; // 对应每个站点的子目录
- 添加信任的主机名,避免Drupal的主机验证报错:
$settings['trusted_host_patterns'] = [ '^website\.domain\.com$', ];
- 确保文件系统路径正确,避免静态文件访问失败:
$settings['file_public_path'] = 'sites/default/files';
- 开启干净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
相关产品推荐
相关产品推荐

