nginx反向代理mysql的配置如下:
upstream mysql_server {
server 172.18.3.243:3306;
#check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 3305;
server_name localhost;
access_log logs/access.log;
proxy_pass mysql_server;
so_keepalive on;
tcp_nodelay on;
}
配置完成nginx 發現代理mysql後,發現連接連接mysql經常報錯,Host XXX is blocked because of many connection errors, unblock with ‘mysqladmin flush-hosts。
剛開始以爲是代碼出現問題導致的,後來發現是nginx的後端健康監測導致。
MySQL服務器已經從某個host接收了大量中途終止的連接,於是決定終止繼續接收來自該host的連接,允許最大的連接錯誤數爲max_connect_errors,通過show variables命令可以查詢,一般爲10。
解決方法:在另外一處地方執行mysqladmin flush-host或者登錄進mysql執行flush hosts(本機host已經不允許登錄!)。
但是flush hosts 只是治標不治本,暫時解決了問題,一會就又會出現。
真正的原因是nginx配置裏我註釋掉的那一行健康監測, 這會出現一個問題,就是tcp連接會掉線。原因在於當服務端關閉連接的時候,客戶端不可能立刻發覺連接已經被關閉,需要等到當Nginx在執行check規則時認爲服務端鏈接關閉,此時nginx會關閉與客戶端的連接。
所以註釋掉健康監測問題就解決了。