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

Nginx配置:同一域名下基于子目录的多PHP网站(对应不同PHP-FPM池)

Nginx配置:同一域名下基于子目录的多PHP网站(对应不同PHP-FPM池)

刚好之前折腾过类似的Nginx配置场景,给你整理了一套能完美匹配需求的配置方案,还会拆解每个部分的作用,方便你理解和调整~

完整配置示例

server {
    listen 80;
    server_name my.domain.net;
    charset utf-8;

    # 主站点的根目录(对应域名/路径)
    root /var/www/my.domain.net/public;
    index index.php index.html;

    # 主站点核心规则:静态文件优先,不存在则fallback到index.php
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # 主站点PHP请求转发(指向专属FPM池)
    location ~ ^/index\.php(/|$) {
        fastcgi_pass unix:/run/php/php-fpm-my-site.sock; # 替换为你的主站FPM套接字/端口
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param HTTPS off; # HTTPS环境下改为on
    }

    # Nextcloud子站点专属配置块
    location ^~ /nextcloud/ {
        # 关联Nextcloud的实际文件目录(/nextcloud/请求对应这里的文件)
        alias /var/www/nextcloud/public/;
        index index.php index.html;

        # Nextcloud的静态文件优先规则,不存在则fallback到自身index.php
        try_files $uri $uri/ /nextcloud/index.php$is_args$args;

        # Nextcloud的PHP请求转发(指向它的专属FPM池)
        location ~ ^/nextcloud/index\.php(/|$) {
            fastcgi_pass unix:/run/php/php-fpm-nextcloud.sock; # 替换为你的Nextcloud FPM套接字/端口
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            include fastcgi_params;
            # 因为用了alias,这里必须用$request_filename才能正确指向文件
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param HTTPS off; # HTTPS环境下改为on
            # Nextcloud需要的额外转发参数,根据你的环境调整
            fastcgi_param HTTP_X_FORWARDED_PROTO $scheme;
        }
    }

    # 安全优化:禁止访问隐藏文件(比如.htaccess)
    location ~ /\.ht {
        deny all;
    }
}

关键配置说明

  • 主站点规则:

    • location /里的try_files是核心逻辑:先尝试返回请求的文件(比如/img/logo.png),如果文件不存在,再尝试访问目录,最后都不行就转发到主站的index.php处理,完美匹配你要的fallback需求。
    • PHP转发块用^/index\.php(/|$)精确匹配,避免和子站点的规则冲突,同时正确设置SCRIPT_FILENAME让PHP-FPM能找到对应的脚本文件。
  • Nextcloud子站点规则:

    • 用^~ /nextcloud/提升这个location块的优先级,确保所有/nextcloud/开头的请求都走这个规则,不会被主站点的PHP规则干扰。
    • alias指令是关键:它能把/nextcloud/xxx的请求映射到/var/www/nextcloud/public/xxx的实际文件,比root更适合子目录映射的场景。
    • 内部的PHP转发块同样精确匹配,并且因为用了alias,必须用$request_filename来指定脚本路径,否则会出现文件找不到的错误。

注意事项

  • 替换FPM地址:把配置里的php-fpm-my-site.sock和php-fpm-nextcloud.sock换成你实际的FPM套接字路径,如果是用端口通信的话,改成127.0.0.1:9001这类格式。
  • HTTPS适配:如果你的站点用HTTPS,需要把listen 80;改成listen 443 ssl;,并添加SSL证书相关配置,同时把fastcgi_param HTTPS off;改为on。
  • 权限检查:确保Nginx的运行用户(通常是www-data)拥有两个站点目录的读取权限,同时PHP-FPM的运行用户也有对应的权限,避免出现403或502错误。
  • 配置生效:修改完配置后,执行nginx -t检查语法是否正确,没问题的话执行systemctl reload nginx让配置生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.16 07:19:32