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
相关产品推荐
相关产品推荐

