【发布时间】: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