Nginx代理SQL数据库:无法通过子域名连接SQL服务器问题
嘿,我一眼就看出问题所在了——你用错了Nginx的代理类型!
核心问题
SQL Server 默认靠TCP协议(通常是1433端口)和客户端通信,但你当前的Nginx配置是按HTTP/HTTPS代理写的。这俩协议完全不兼容,自然连不上。
修正方案:用Nginx的Stream模块代理TCP流量
首先得确认你的Nginx编译时包含了stream模块——执行nginx -V,看看输出里有没有--with-stream。如果没有,可能需要重新编译Nginx或者安装带stream模块的包。
1. 添加Stream代理配置(在nginx.conf主配置里)
把这段加在http块的外面:
stream { server { listen 1433 ssl; # 对外提供SSL加密的SQL连接端口 proxy_pass 1.2.3.4:1433; # 指向你的SQL Server地址和默认端口 # 复用你的Let's Encrypt SSL证书 ssl_certificate /etc/letsencrypt/live/domian.com-0001/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domian.com-0001/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } }
2. 修正原有的HTTP/HTTPS站点配置
你原来的配置有语法错误(重复的server_name,HTTP和HTTPS配置混在一起),整理成这样:
# 处理HTTP请求,跳转到HTTPS(可选) server { server_name mydb.domian.com; listen 80; return 301 https://$host$request_uri; } # HTTPS站点(如果不需要HTTP服务,这里可以返回提示) server { server_name mydb.domian.com; listen 443 ssl; ssl_certificate /etc/letsencrypt/live/domian.com-0001/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/domian.com-0001/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # 提示用户这个子域名是用于SQL连接的 location / { return 404 "This subdomain is exclusively for SQL Server TCP connections."; } }
客户端连接要点
- 连接字符串里写:
mydb.domian.com,1433(如果改了对外端口就换成对应的) - 确保SQL Server已经开启了TCP/IP协议(在SQL Server配置管理器的「SQL Server网络配置」里启用)
- 检查防火墙:
- Nginx服务器要对外开放你设置的SQL端口(比如1433)
- SQL Server所在服务器要允许Nginx服务器的IP访问1433端口
可选优化
如果不想用默认的1433端口对外暴露,可以改成其他端口(比如14330),只要在stream块的listen指令里改,客户端连接时对应改端口就行。
内容的提问来源于stack exchange,提问作者Austyns




