Nginx-Apache反向代理配置问题:PHP在8080端口正常但80端口异常
Nginx-Apache反向代理PHP请求失败排查
我的服务器采用Nginx-Apache反向代理架构:
- 8080端口(Apache)可正常处理PHP文件
- 80端口(Nginx反向代理)无法加载PHP文件,配置预期是将PHP请求从Nginx转发至Apache,但未生效
以下是当前的site.conf配置文件:
# for security reasons server { listen 80; listen [::]:80; server_name _; root /var/www/html; index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } # PHP Files Processing location ~ \.php$ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.ht { deny all; } } # f2.findart.pro server { listen 80 ; listen [::]:80 ; return 301 https://$host$request_uri; root /var/www/f2.findart.pro; index index.php index.html index.htm index.nginx-debian.html; server_name f2.findart.pro; location / { try_files $uri $uri/ =404; proxy_pass http://127.0.0.1:8080; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # 130-61-139-145.nip.io - free reserve domain - !!! without CDN !!! server { listen 80 ; listen [::]:80 ; return 301 https://$host$request_uri; root /var/www/html; index index.php index.html index.htm; server_name 130-61-139-145.nip.io; location / { try_files $uri $uri/ =404; proxy_pass http://127.0.0.1:8080; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } listen [::]:443 ssl; # managed by Certbot listen 443 ssl; # managed by Certbot ssl_certificate /etc/letsencrypt/live/130-61-139-145.nip.io/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/130-61-139-145.nip.io/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot location ~ \.php$ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.ht { deny all; } }
问题核心原因
- 默认80端口server块路由逻辑冲突:
location /中的try_files $uri $uri/ =404会优先读取本地文件,当info.php存在于Nginx的root目录时,Nginx会直接返回文件内容,不会转发给Apache解析。 - HTTP转HTTPS配置顺序错误:
f2.findart.pro和130-61-139-145.nip.io的80端口server块中,return 301语句在location配置之前,导致代理规则完全不生效,所有HTTP请求直接跳转至HTTPS。 - HTTPS server块代理逻辑缺失:
130-61-139-145.nip.io的HTTPS块中,location /未配置代理,仅单独配置了.php规则,静态资源请求会优先读取本地文件,且路由逻辑不完整。
修复后的配置
# 安全配置:默认80端口server块 server { listen 80; listen [::]:80; server_name _; root /var/www/html; index index.php index.html index.htm; # 优先将所有请求转发至Apache location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 若Apache返回404,再尝试读取本地文件(可选) proxy_intercept_errors on; error_page 404 = @fallback; } # 本地静态文件降级逻辑(可选) location @fallback { try_files $uri $uri/ =404; } # 强制匹配PHP请求,确保转发至Apache location ~ \.php$ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.ht { deny all; } } # f2.findart.pro:单独处理HTTP转HTTPS server { listen 80; listen [::]:80; server_name f2.findart.pro; return 301 https://$host$request_uri; } # f2.findart.pro:HTTPS代理配置 server { listen [::]:443 ssl; listen 443 ssl; server_name f2.findart.pro; root /var/www/f2.findart.pro; index index.php index.html index.htm index.nginx-debian.html; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ \.php$ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.ht { deny all; } # 补充SSL证书配置(可通过Certbot生成) } # 130-61-139-145.nip.io:单独处理HTTP转HTTPS server { listen 80; listen [::]:80; server_name 130-61-139-145.nip.io; return 301 https://$host$request_uri; } # 130-61-139-145.nip.io:HTTPS代理配置 server { listen [::]:443 ssl; # managed by Certbot listen 443 ssl; # managed by Certbot server_name 130-61-139-145.nip.io; root /var/www/html; index index.php index.html index.htm; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ \.php$ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location ~ /\.ht { deny all; } ssl_certificate /etc/letsencrypt/live/130-61-139-145.nip.io/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/130-61-139-145.nip.io/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot }
修复说明
- 拆分HTTP与HTTPS配置:将HTTP跳转逻辑单独放在独立server块,避免和代理规则冲突,确保跳转和代理都能正常生效。
- 调整路由优先级:让所有请求优先转发至Apache,而非先读取本地文件,确保PHP请求被Apache解析;若需要保留本地静态文件访问,可通过
@fallback实现降级逻辑。 - 统一代理规则:所有需要代理的server块都在
location /中配置完整代理头,同时保留.php的独立匹配(正则匹配优先级更高),确保PHP请求不会被其他规则拦截。
内容的提问来源于stack exchange,提问作者givik
相关产品推荐
相关产品推荐

