如何配置Nginx实现无端口URI重定向并解决SSL握手错误
问题
在Ubuntu 22.04 LTS服务器部署WebApp并配置Nginx后,sites-available下的配置如下:
server { listen 80; server_name example www.example.de; } server { listen 443 ssl; root /var/www/example.de/html; index index.html index.htm index.nginx-debian.html; server_name example.de www.example.de; ssl_certificate /etc/nginx/ssl/_ssl_certificate.cer; ssl_certificate_key /etc/nginx/ssl/_private_key.key; location / { 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; proxy_pass http://127.0.0.1:4567; } location /auth/google/ { 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; proxy_pass https://127.0.0.1:4567/auth/google/; proxy_ssl_server_name on; } }
Nginx错误日志出现以下错误:
[error] 5875#5875: *3 SSL_do_handshake() failed (SSL: error:0A00010B:SSL routines::wrong version number) while SSL handshaking to upstream, client: 12.123.12.0, server: example.de, request: "GET /auth/google/ HTTP/1.1", upstream: "https://127.0.0.1:4567/auth/google/", host: "example.de"
尝试多种proxy_pass、rewrite及重定向规则均未解决,求处理方案。
解决方法
- 问题根源:后端WebApp在4567端口运行的是HTTP服务,而非HTTPS服务。你配置的
proxy_pass https://127.0.0.1:4567/auth/google/会让Nginx尝试和后端建立SSL连接,但后端不支持SSL协议,导致握手失败,出现版本号错误。 - 修正核心配置:将
/auth/google/location块里的proxy_pass改为HTTP协议,和根路径的配置保持一致,同时移除不必要的SSL相关配置:
location /auth/google/ { 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; proxy_pass http://127.0.0.1:4567/auth/google/; }
- 额外优化建议:
- 80端口的server块添加HTTP到HTTPS的重定向,避免空配置:
server { listen 80; server_name example.de www.example.de; return 301 https://$server_name$request_uri; }
- 验证后端服务协议:在服务器本地执行
curl http://127.0.0.1:4567/auth/google/,如果能正常返回内容,说明后端确实是HTTP服务;若执行curl https://127.0.0.1:4567/auth/google/报错,则进一步确认后端未启用SSL。
- 生效配置:修改完成后,执行
nginx -t检查配置语法是否正确,无错误后执行systemctl reload nginx重启Nginx使配置生效。
内容的提问来源于stack exchange,提问作者Mergim
相关产品推荐
相关产品推荐

