Ubuntu 22.04下Nginx单域名无法解析PHP问题求助
问题排查与修复方案
你的Nginx配置存在几个关键问题,直接导致PHP无法正常解析:
1. FastCGI套接字路径错误
第一个server块中fastcgi_pass的路径缺失根目录符号/:
# 错误写法 fastcgi_pass unix:var/run/php/php8.1-fpm.sock; # 正确写法 fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
路径错误会让Nginx找不到PHP-FPM的套接字文件,无法转发PHP请求。
2. 正则匹配顺序冲突
第一个server块中的location ~ /是宽泛的正则匹配,会优先拦截所有请求(包括.php文件),导致后续的PHP解析规则完全失效。需改为非正则的location /,Nginx匹配优先级为:精确匹配 > 正则匹配 > 普通前缀匹配,这样不会抢占PHP规则的匹配权。
3. 重复Server块导致配置混乱
你有两个监听80端口且server_name完全相同的server块,这会让Nginx无法确定使用哪套规则处理请求。Certbot生成的HTTP转HTTPS规则应单独作为精简server块,无需重复配置root、日志等内容。
4. PHP匹配规则不严谨
第二个server块中的location ~ \.php未加$结尾,会匹配test.php.txt这类非PHP文件,存在安全风险且可能引发解析异常,应改为location ~ \.php$。
修正后的完整配置
# HTTP 转 HTTPS 跳转(仅保留核心规则) server { listen 80; listen [::]:80; server_name mydomain.com www.mydomain.com; return 301 https://$host$request_uri; } # HTTPS 主站点配置 server { listen [::]:443 ssl ipv6only=on; listen 443 ssl; server_name mydomain.com www.mydomain.com; root /var/www/mydomain; index index.php index.html index.htm index.nginx-debian.html; access_log /var/log/nginx/mydomain_access.log; error_log /var/log/nginx/mydomain_error.log; client_max_body_size 100M; # 处理静态文件和WordPress路由 location / { try_files $uri $uri/ /index.php?$args; } # PHP 解析规则 location ~ \.php$ { include snippets/fastcgi-php.conf; include fastcgi_params; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 注:snippets/fastcgi-php.conf已包含SCRIPT_FILENAME配置,无需重复编写 } # Certbot 自动生成的SSL配置 ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; add_header Strict-Transport-Security "max-age=31536000" always; ssl_trusted_certificate /etc/letsencrypt/live/mydomain.com/chain.pem; ssl_stapling on; ssl_stapling_verify on; }
验证与重启步骤
- 检查Nginx配置语法:
sudo nginx -t
- 重载Nginx配置:
sudo systemctl reload nginx
- 确认PHP-FPM服务状态:
sudo systemctl status php8.1-fpm
内容的提问来源于stack exchange,提问作者Ramon Linssen
相关产品推荐
相关产品推荐

