Nginx+Apache2架构admin.site.ru返回502 Bad Gateway故障排查
故障场景说明
现有两个站点site.ru与admin.site.ru部署在同一IP地址下:site.ru基于Yii2框架开发,admin.site.ru基于Laravel框架开发,整体采用Nginx + Apache2组合架构配置。
现有配置
Apache2配置
site.ru对应虚拟主机配置(监听8081端口)
<IfModule mod_ssl.c> <VirtualHost *:8081> ServerAdmin webmaster@localhost DocumentRoot /var/www/site.ru ServerName site.ru ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/letsencrypt/live/site.ru/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/site.ru/privkey.pem SSLCACertificateFile /etc/letsencrypt/live/site.ru/chain.pem <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> <Directory /var/www/site.ru> AllowOverride All </Directory> </VirtualHost>
admin.site.ru对应虚拟主机配置(监听8083端口)
<IfModule mod_ssl.c> <VirtualHost *:8083> ServerAdmin webmaster@localhost DocumentRoot /var/www/admin.site.ru/public ServerName admin.site.ru ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/letsencrypt/live/admin.site.ru/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/admin.site.ru/privkey.pem SSLCACertificateFile /etc/letsencrypt/live/admin.site.ru/chain.pem <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> <Directory /var/www/admin.site.ru> AllowOverride All </Directory> </VirtualHost>
Nginx配置
server { listen 80 default_server; listen [::]:80 default_server; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; ssl on; ssl_certificate /etc/letsencrypt/live/admin.site.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/admin.site.ru/privkey.pem; root /var/www/admin.site.ru/public; index index.php index.html index.htm index.nginx-debian.html; server_name admin.site.ru; location / { proxy_pass https://{IP_SERVER}:8083; proxy_buffering off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Accel-Internal /nginx_static_files; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /nginx_static_files/ { alias /var/www/admin.site.ru/; internal; } location ~ /(\.ht|\.user\.ini) { deny all; } } server { listen 443 ssl http2; listen [::]:443 ssl http2; ssl on; # ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem; # ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key; ssl_certificate /etc/letsencrypt/live/site.ru/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/site.ru/privkey.pem; root /var/www/site.ru; index index.php index.html index.htm index.nginx-debian.html; server_name site.ru; location / { proxy_pass https://{IP_SERVER}:8081; proxy_buffering off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Accel-Internal /nginx_static_files; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location /nginx_static_files/ { alias /var/www/site.ru/; internal; } location ~ /(\.ht|\.user\.ini) { deny all; } }
故障现象
当前site.ru访问运行正常,但admin.site.ru访问时返回502 Bad Gateway错误。
故障排查方向及根因
502错误本质是Nginx作为反向代理,无法正常从后端Apache服务获取响应,结合两个站点同架构、只有admin站点异常的特征,按以下优先级排查:
- 确认Apache 8083端口监听状态
执行命令ss -tulpn | grep 8083检查端口是否被Apache正常监听。site.ru对应的8081端口正常、8083无监听的话,说明admin站点的Apache虚拟主机配置未生效,常见原因是配置语法错误、配置文件未被Apache加载(比如Debian/Ubuntu系统下未执行a2ensite命令启用该虚拟主机配置,或配置文件后缀不符合Apache加载规则)。
验证方式:执行apache2ctl configtest检查配置语法,确认无报错后重启Apache服务,再确认端口监听状态。 - 检查Apache 8083端口的SSL握手兼容性
架构中Nginx到Apache走HTTPS协议回源,site.ru正常说明Nginx的SSL代理回源逻辑本身没问题,需要确认admin站点在Apache侧的证书路径是否正确、证书文件权限是否允许Apache进程读取。如果证书路径配置错误、文件权限不足,Apache启动8083端口的SSL服务时会直接失败,导致端口无响应。
验证方式:在服务器本地执行curl -vk https://127.0.0.1:8083,如果直接返回连接拒绝/SSL握手错误,就对应上面的端口监听/证书配置问题;如果能正常返回页面内容,说明Apache侧配置正常,问题出在Nginx回源逻辑。 - 排查Nginx回源参数问题
当前Nginx配置中回源地址写的是https://{IP_SERVER}:8083,如果{IP_SERVER}是公网IP,需要确认服务器本地访问自身公网IP的8083端口是否被防火墙、安全组规则拦截;另外如果Nginx回源时没有配置关闭后端SSL证书校验,当Apache侧证书和回源IP不匹配时,也会触发SSL校验失败导致502。
修复方式:回源地址直接写https://127.0.0.1:8083走本地回环,同时在admin站点的Nginx代理配置中添加proxy_ssl_verify off;参数,跳过回源时的SSL证书校验,配置重载后即可恢复。 - 检查站点目录权限
确认/var/www/admin.site.ru目录及下属文件的属主、权限符合Apache运行用户的读取要求,Laravel框架的storage、bootstrap/cache目录需要写入权限,权限配置错误会导致Apache处理请求时抛出异常,但这类问题一般不会直接触发502,通常返回500错误,优先级低于前面三项。
内容的提问来源于stack exchange,提问作者Roman Adigezalov
相关产品推荐
相关产品推荐

