You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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

火山引擎 最新活动