(1) 公司为了下降工做效率, 链接mysql必须经过特定的代理才能链接 (2) 产线这个模式能够理解, 可是测试环境你也搞个这个,那我就要哭了 (3) 在公司用wifi能够链接,可是在家没法直接链接mysql,只能经过垃圾的网页版mysql进行数据库操做 (4) 能够经过网页访问docker的权限,并无任何服务器权限
(1) nginx的stream实现tcp流量转发 (2) nginx的http proxy connect实现http tunnel (3) Navicat Premium的http tunnel实现
方案一php
在/etc/nginx/nginx.conf的第一行加上mysql
load_module /usr/lib64/nginx/modules/ngx_stream_module.so;
这里modules的路径能够经过nginx -V
的--modules-path
看到nginx
stream { server { listen 443; proxy_pass stream_backend; } }
一、由于nginx的stream是基于tcp/ip的第4层,因此没有http中header的host参数,也就没有基于server_name的配置
二、服务器主机也只会转发http和https流量到docker,stream在host的nginx没配置转发,因此tcp流量根本过不来c++
方案二git
在/etc/nginx/nginx.conf的第一行加上github
load_module /usr/lib64/nginx/modules/ngx_http_proxy_connect_module.so;
nginx -s reloadsql
> ```nginx: [emerg] dlopen() "/usr/lib64/nginx/modules/ngx_http_proxy_connect_module.so" failed (/usr/lib64/nginx/modules/ngx_http_proxy_connect_module.so: cannot open shared object file: No such file or directory) in /etc/nginx/nginx.conf```
至关于从新编译nginx, 有几个坑, 不过意外发现有个go的开源库,专门编译nginx,恰好我是go开发,go的库nginx-build, 可是下面说的跟这个库不要紧, 只是打个go的广告^_^docker
(1) 选定对应的nginx源码zip,更改nginx的version, nginx -v (2) ./configure的编译参数, 须要提早nginx -V复制以前的启动参数下来 (3) 执行path的时候须要看`https://github.com/chobits/ngx_http_proxy_connect_module`的说明,哪一个版本用哪一个patch
$ git clone https://github.com/chobits/ngx_http_proxy_connect_module.git /root/ngx_http_proxy_connect_module $ wget http://nginx.org/download/nginx-1.12.2.tar.gz $ tar -xzvf nginx-1.12.2.tar.gz $ cd nginx-1.12.2/ $ patch -p1 < /root/ngx_http_proxy_connect_module/patch/proxy_connect.patch $ ./configure --add-module=/root/ngx_http_proxy_connect_module ·后面接上nginx -V里面的configure arguments· $ make && make install $ cp /root/ngx_http_proxy_connect_module
执行过程数据库
$ ./configure --add-dynamic-module=/root/ngx_http_proxy_connect_module --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_auth_request_module --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
出现各类错误,各类google,最终服务器
yum -y install redhat-rpm-config.noarch yum -y install libxslt-devel yum -y install perl-devel perl-ExtUtils-Embed yum -y install gd-devel yum -y install geoip-devel yum -y install gperftools-devel
最后编译只出现warning类的报错才算成功
+ using system PCRE library + using system OpenSSL library + using system zlib library nginx path prefix: "/usr/share/nginx" nginx binary file: "/usr/sbin/nginx" nginx modules path: "/usr/lib64/nginx/modules" nginx configuration prefix: "/etc/nginx" nginx configuration file: "/etc/nginx/nginx.conf" nginx pid file: "/run/nginx.pid" nginx error log file: "/var/log/nginx/error.log" nginx http access log file: "/var/log/nginx/access.log" nginx http client request body temporary files: "/var/lib/nginx/tmp/client_body" nginx http proxy temporary files: "/var/lib/nginx/tmp/proxy" nginx http fastcgi temporary files: "/var/lib/nginx/tmp/fastcgi" nginx http uwsgi temporary files: "/var/lib/nginx/tmp/uwsgi" nginx http scgi temporary files: "/var/lib/nginx/tmp/scgi" ./configure: warning: the "--with-ipv6" option is deprecated
ls /usr/lib64/nginx/modules
就会发现ngx_http_proxy_connect_module.so文件已经生成了, /usr/lib64/nginx/modules是modules路径, nginx -V能够看到--modules-path开始配置nginx
stream { server { listen 443; server_name t1.test.example.com; proxy_connect; proxy_connect_allow 443; proxy_connect_connect_timeout 10s; proxy_connect_read_timeout 10s; proxy_connect_send_timeout 10s; proxy_pass http://$http_host; } }
方案三
(1) 复制Navicat Premium目录下的`/Applications/Navicat Premium.app/Contents/Resources/ntunnel_mysql.php`到docker的nginx的静态文件目录www下, 这样nginx能够访问到 (2) 安装php-fpm, yum install -y php-fpm, 安装完成后运行php-fpm & . (3) 配置nginx
server { listen 80; server_name t1.test.example.com; root /etc/nginx/www; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log; location /ntunnel_mysql.php { fastcgi_pass 127.0.0.1:9000; include fastcgi_params; fastcgi_param SCRIPT_FILENAME /etc/nginx/www/ntunnel_mysql.php; } }
大功告成!!!!