实测一下代码放在/etc/nginx/nginx.conf最后面,在yunip编译版本的nginx上可以成功连接到mysql (在apt安装的nginx版本不行,nginx version: nginx/1.4.6 (Ubuntu)):
stream {
server {
listen 23306;
proxy_pass winip:3307;
# 也支持socket
# proxy_pass unix:/var/lib/mysql/mysql.socket;
}
nginx 详细信息:
2032 $ nginx -V
nginx version: nginx/1.12.1
built with OpenSSL 1.0.1f 6 Jan 2014
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -fPIC -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -fPIC' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-mail=dynamic --with-mail_ssl_module --add-dynamic-module=/build/nginx-0QJgRe/nginx-1.12.1/debian/modules/nginx-auth-pam --add-dynamic-module=/build/nginx-0QJgRe/nginx-1.12.1/debian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-0QJgRe/nginx-1.12.1/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-0QJgRe/nginx-1.12.1/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-0QJgRe/nginx-1.12.1/debian/modules/ngx_http_substitutions_filter_module
补充内容:
编译安装Nginx
从1.9.0开始,nginx就支持对TCP的转发,而到了1.9.13时,UDP转发也支持了。提供此功能的模块为ngx_stream_core。不过Nginx默认没有开启此模块,所以需要手动安装。
cd /usr/local/src
wget http://nginx.org/download/nginx-1.12.1.tar.gz
tar zxf nginx-1.12.1.tar.gz
cd nginx-1.12.1
./configure --prefix=/usr/local/nginx --with-stream --without-http
make && make install
参考:
http://www.jianshu.com/p/244386221cc5
补充tcp转发:
背景:如果nginx代理这个80到swoole(用swoole做webserver,其实就是做个转发和html解析。),这个代理是个什么概念,那这个socket的fd是不是就没法长连接了呢??被反向80端口代理的swoole还能长连接?用:nginx_tcp_proxy_module才行 ,否则肯定不行啊,即使http的keep-alive,https://github.com/yaoweibin/nginx_tcp_proxy_module 也就是说nginx的http代理长连接不行,得走tcp这一层才行,用haproxy。
nginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司的的负载均衡都是nginx所以决定研究一下nginx的这个功能实现,下面简单介绍一下实现方法:
1.下载module模块
下载地址 : https://nodeload.github.com/yaoweibin/nginx_tcp_proxy_module/zipball/master
$ wget 'http://nginx.org/download/nginx-1.2.1.tar.gz'
$ tar -xzvf nginx-1.2.1.tar.gz
$ cd nginx-1.2.1/
$ patch -p1 < /path/to/nginx_tcp_proxy_module/tcp.patch /path是指nginx_tcp_proxy_module路径
$ ./configure --add-module=/usr/local/ngx_cache_purge-1.4 --prefix=/usr/local/nginx --with-http_stub_status_module --add-module=/path/to/nginx_tcp_proxy_module //编译
$ make
$ make install
2、修改nginx配置文件:
http {
server {
listen 80;
location /status {
check_status;
}
}
}
tcp {
upstream mysql{
server 10.10.10.17:3306 weight=1;
server 10.10.10.18:3306 weight=1;
#check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 3306;
proxy_pass mysql;
}
}
参考: http://ju.outofmemory.cn/entry/124180
对比:
tcp {
upstream mysql {
server 172.17.0.3:3306 weight=1;
#check interval=3000 rise=2 fall=5 timeout=1000;
}
server {
listen 23306;
proxy_pass mysql;
}
}
stream {
server {
listen 23306;
proxy_pass 60.205.189.32:3307;
# 也支持socket
# proxy_pass unix:/var/lib/mysql/mysql.socket;
}
}
网友评论