【问题标题】:Nginx TCP stream optimizationNginx TCP 流优化
【发布时间】:2019-06-13 18:35:37
【问题描述】:

我正在使用 Nginx 将我的 PHP Web 服务器与我的 MySQL 服务器连接(通过流模块),因此 Nginx 在 Web 服务器和 MySQL 服务器上运行,并且两者都通过 SSL 上的 TCP 连接。

我注意到从我的应用程序到 MySQL 服务器的初始连接对于每个请求需要 4-6 毫秒,我想知道我是否可以做更多的事情来重用连接或加快速度 - 两台服务器都在同一个本地网络。

这是我的网络服务器上的配置:

stream {                
    upstream mysql {
        server 192.168.10.5:3999;
    }

    server {
        listen 127.0.0.1:998 so_keepalive=30s:10s:6;

        proxy_pass mysql;

        proxy_connect_timeout 1s;

        proxy_ssl  on;
        proxy_ssl_certificate         mysql.client.crt;
        proxy_ssl_certificate_key     mysql.client.key;
        proxy_ssl_protocols           TLSv1.2;
        proxy_ssl_ciphers             'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
        proxy_ssl_trusted_certificate root.crt;
        proxy_ssl_verify              on;
        proxy_ssl_verify_depth        2;
        proxy_ssl_session_reuse       on;
    }
}

这是我的 MySQL 服务器上的配置:

stream {
    upstream mysql_local {
        server 127.0.0.1:3306;
    }

    server {
        listen 3999 ssl so_keepalive=60s:30s:20;

        proxy_pass mysql_local;

        proxy_connect_timeout 1s;

        # SSL configuration - use server certificate & key
        ssl_certificate         mysql.server.crt;
        ssl_certificate_key     mysql.server.key;
        ssl_protocols           TLSv1.2;
        ssl_ciphers             'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
        ssl_prefer_server_ciphers on;
        ssl_client_certificate  root.crt;
        ssl_verify_client       on;
        ssl_session_cache       shared:MYSQL:100m;
        ssl_session_tickets     off;
        ssl_session_timeout     600m;
        ssl_handshake_timeout   5s;
    }
}

我尝试在两端设置 TCP keepalive,但不确定是否需要更多内容或如何检查连接是否被重用。关于这种设置的在线文档很少,尤其是优化它。

我怀疑我可以做更多的事情,因为在应用程序中,我还使用 Nginx 作为 HTTP 代理通过 HTTP+SSL 连接到 Elasticsearch(也在 MySQL 服务器上运行),即使连接时间要短得多它是 HTTP,也使用相同的证书,并且通过 Nginx 作为中间人,但它只需要最大。 1ms 连接。我在那里使用 HTTP keepalive 连接。

【问题讨论】:

  • TCP 连接不会被重用,除非你通过 TCP 使用某些东西,例如 HTTP 1.1。名称错误的“TCP keepalive”功能无法做到这一点。
  • 那么有没有办法在 Nginx 实例之间重用/缓存这些 TCP 连接?这意味着这个功能只是缺失了,并且使得流模块不是很有用,因为每个连接都有连接开销。

标签: performance nginx tcp stream


【解决方案1】:

有人来自 Nginx 确认 TCP 连接池/某种 keepalive 方法目前不受支持,也没有计划在未来。

相反,我在 Nginx 前面添加了ProxySQL,它内置了连接池。它还有其他好处,例如关于哪些查询运行最多、哪些查询耗时最长等的统计信息,因此它实际上是一个非常好的工具,可以找出可以优化应用程序的位置以及哪些查询可能需要额外注意。您甚至可以透明地缓存某些查询,尽管我对此并不感兴趣。但请注意:ProxySQL 的文档有点参差不齐,而且配置系统对我来说似乎更令人困惑而不是有益,但是一旦你设置了它,它就会运行得非常好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-01
    • 2014-01-16
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 2015-01-10
    相关资源
    最近更新 更多