當 Nginx 代理配置出現 403 Forbidden 錯誤時,通常是由于權限或配置問題導致。以下是常見原因和解決方案:
常見原因及解決方法
1. 后端服務器拒絕訪問
- 原因:后端 HTTPS 服務配置了 IP 白名單或訪問控制
- 解決:
- 檢查后端服務器(如 Apache/Nginx)的訪問限制規則
- 將 Nginx 代理服務器的 IP 加入白名單
- 在后端服務中關閉臨時訪問控制(測試用)
2. Nginx 權限問題
# 在 server 塊開頭添加
user www-data; # 確保與系統用戶一致
- 檢查:
ps aux | grep nginx # 查看運行用戶 ls -ld /var/lib/nginx/ # 查看緩存目錄權限
- 修復:
chown -R www-data:www-data /var/lib/nginx/ chmod -R 755 /var/cache/nginx
3. 缺少索引文件(目錄訪問)
- 現象:訪問
/
時出現 403 - 解決:
location / {# 添加默認索引index index.html index.htm;# 或顯式禁止目錄列表autoindex off; }
4. SELinux 限制(CentOS/RHEL)
# 臨時關閉(測試用)
setenforce 0# 永久解決
semanage permissive -a httpd_t
- 或添加策略:
setsebool -P httpd_can_network_connect 1
5. 代理頭信息缺失
location / {proxy_pass https://backend;# 必須添加以下頭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;
}
完整調試配置
server {listen 80;server_name proxy.example.com;# 權限設置user www-data;access_log /var/log/nginx/proxy_access.log;error_log /var/log/nginx/proxy_error.log debug; # 開啟調試日志location / {proxy_pass https://backend.example.com;# 關鍵頭信息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;# HTTPS 設置proxy_ssl_server_name on;proxy_ssl_protocols TLSv1.2 TLSv1.3;# 臨時關閉證書驗證(測試)proxy_ssl_verify off;# 超時設置proxy_connect_timeout 60s;proxy_read_timeout 180s;}
}
診斷步驟
-
檢查 Nginx 錯誤日志
tail -f /var/log/nginx/proxy_error.log
查找
permission denied
或access forbidden
相關條目 -
測試直接訪問后端
curl -vk https://backend.example.com -H "Host: proxy.example.com"
確認后端服務是否可用
-
檢查文件權限
namei -l /var/lib/nginx/proxy/*
-
臨時簡化配置
移除所有非必需配置,僅保留proxy_pass
和proxy_set_header
測試 -
測試代理連通性
# 在 Nginx 服務器上執行 curl -x http://localhost:80 https://google.com
常見錯誤日志分析
*13 directory index of "/var/www/html/" is forbidden
? 添加index index.html;
或關閉autoindex
*102 connect() to [backend] failed (13: Permission denied)
? SELinux 問題或防火墻阻擋upstream prematurely closed connection while reading response
? 增加proxy_read_timeout
值
提示:生產環境調試后,記得恢復證書驗證:
proxy_ssl_verify on; proxy_ssl_trusted_certificate /etc/ssl/certs/ca-bundle.crt;