簡體   English   中英

Nginx TCP流優化

[英]Nginx TCP stream optimization

我正在使用Nginx將我的PHP Web服務器與我的MySQL服務器連接(通過流模塊),因此Nginx在Web服務器和MySQL服務器上運行,並且都通過SSL通過TCP連接。

我注意到從我的應用程序到MySQL服務器的初始連接對於每個請求需要4-6ms,我想知道我是否可以做更多的事情來重用連接或加速一般 - 兩個服務器都在本地的同一網絡中。

這是我的Web服務器上的配置:

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連接。

來自Nginx的人確認目前不支持TCP連接池/某種keepalive方法,並且未來也未計划。

相反,我在Nginx前面添加了ProxySQL ,它內置了連接池。 它還有其他好處,例如查詢運行最多的統計信息,花費最長時間等等,因此它實際上是一個非常好的工具,可以找出可以優化應用程序的位置以及哪些查詢可能需要額外的維護。 您甚至可以透明地緩存某些查詢,盡管我對此並不感興趣。 請注意:ProxySQL的文檔有點不穩定,配置系統似乎比我更有困惑,但是一旦你設置它,它運行得非常好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM