场景:
网络隔离,访问UAT环境,只能使用客户的电脑访问, 当需要在自己电脑上跑代码,通过客户电脑中转访问uat环境的数据库。
选用nginx进行转发。配置如下:
stream {
upstream cloudsocket {
hash $remote_addr consistent;
server 192.168.182.155:3306 weight=5 max_fails=3 fail_timeout=30s;
}
server {
listen 3306;#数据库服务器监听端口
proxy_connect_timeout 10s;
proxy_timeout 300s;#设置客户端和代理服务之间的超时时间,如果5分钟内没操作将自动断开。
proxy_pass cloudsocket;
}
}
重启。
访问nginx所在机器的ip和配置的3306端口,输入账号密码,就可以转发mysql连接了。
注意 stream和http是同级别的,不要放入http里面。
只有一点点:
nginx从1.9.0开始,新增加了一个stream模块,用来实现四层协议的转发、代理或者负载均衡等。比如在内网有一个mysql服务,想暴露到公网上去使用,就可以通过nginx代理的方式通过nginx来进行内网mysql的访问。
————————————————
Nginx版本:1.9.x(持tcp的负载均衡,nginx_tcp_proxy_module
Nginx官方模块:ngx_stream_core_module –with-stream_ssl_module(ssl协议支持,比如MySQL ssl)
官网:http://nginx.org/en/docs/stream/ngx_stream_core_module.html
1、查看现有编译
–user=nginx –group=nginx –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module –with-http_realip_module –with-http_flv_module –with-http_mp4_module –with-http_gzip_static_module
1.
2、重新编译:
http://nginx.org/download/
–user=nginx –group=nginx –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module –with-http_realip_module –with-http_flv_module –with-http_mp4_module –with-http_gzip_static_module –with-stream –with-stream_ssl_module
1.
注意:–with-stream –with-stream_ssl_module
3、配置、检测、重启nginx:
配置:
stream {
upstream mysql {
zone myapp1 64k;
server localhost:3306 weight=1 max_fails=3 fail_timeout=30s;
#server 192.168.1.221:3306 weight=1 max_fails=2 fail_timeout=30s;
}
server {
listen 2188;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass mysql;
}
}
检测:
[root@autoCentos67X64 conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@autoCentos67X64 conf]#
1.
2.
3.
4.
启动:
[root@autoCentos67X64 conf]# netstat -atupn|grep nginx
tcp 0 0 0.0.0.0:2188 0.0.0.0:* LISTEN 2359/nginx
[root@autoCentos67X64 conf]#
1.
2.
3.
4、验证:
[root@log~]# mysql -uroot -prenzhiyuan -h 192.168.1.11 -P2188
注意:2188可是Nginx的端口,代理(负载)后端的MySQL。其它玩法大家可自己研究。
为什么以前nginx不能映射mysql、oracle等数据库端口以供访问,是因为数据库连接访问都是通过tcp协议传输,在nginx1.9.0版本以前不支持tcp协议,因此无法转发tcp协议请求。
nginx从1.9.0版本开始,新增了ngx_stream_core_module模块,使nginx支持四层负载均衡。但是默认编译的时候该模块并未编译进去,需要编译的时候添加–with-stream,使其支持stream代理。
nginx编译添加stream模块
1.查看原nginx编译参数
[root@VM-0-9-centos nginx-1.18.0]# nginx -V | |
nginx version: nginx/1.18.0 | |
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) | |
built with OpenSSL 1.0.2k-fips 26 Jan 2017 | |
TLS SNI support enabled | |
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/usr/local/nginx/tmp/client/ --http-proxy-temp-path=/usr/local/nginx/tmp/proxy/ --http-fastcgi-temp-path=/usr/local/nginx/tmp/fcgi/ --with-poll_module --with-file-aio --with-http_realip_module --with-http_addition_module --with-http_addition_module --with-http_random_index_module --with-http_stub_status_module --http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp --http-scgi-temp-path=/usr/local/nginx/scgi_temp --with-pcre=/home/dyq/tool/pcre-8.40 --with-http_v2_module |
2.添加stream模块进行重新编译
此处nginx源码目录为:/home/dyq/tool/nginx-1.18.0,即为编译命令执行目录。 | |
编译命令如下: | |
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/usr/local/nginx/tmp/client/ --http-proxy-temp-path=/usr/local/nginx/tmp/proxy/ --http-fastcgi-temp-path=/usr/local/nginx/tmp/fcgi/ --with-poll_module --with-file-aio --with-http_realip_module --with-http_addition_module --with-http_addition_module --with-http_random_index_module --with-http_stub_status_module --http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp --http-scgi-temp-path=/usr/local/nginx/scgi_temp --with-pcre=/home/dyq/tool/pcre-8.40 --with-stream --with-http_v2_module |
此处需注意,可能缺失pcre-8.40相关模块,需要下载,并解压到对应目录,–with-pcre=/home/dyq/tool/pcre-8.40
3.进行make操作
此处nginx源码目录为:/home/dyq/tool/nginx-1.18.0,即为编译命令执行目录。 | |
make | |
**此处一定不能使用make install命令,执行该命令会将原有nginx目录进行覆盖。** |
4.关停nginx同时复制新的nginx启动文件
关闭nginx服务 | |
systemctl stop nginx | |
备份原有nginx二进制文件。 | |
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-no-strem | |
复制新编译好的nginx二进制文件。从此处nginx源码目录为:/home/dyq/tool/nginx-1.18.0。即为编译命令执行目录。 | |
cp ./objs/nginx /usr/local/nginx/sbin/nginx |
5.启动测试
启动nginx。 | |
systemctl start nginx | |
查看nginx模块信息。 | |
[root@VM-0-9-centos tool]# nginx -V | |
nginx version: nginx/1.18.0 | |
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) | |
built with OpenSSL 1.0.2k-fips 26 Jan 2017 | |
TLS SNI support enabled | |
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_gzip_static_module --http-client-body-temp-path=/usr/local/nginx/tmp/client/ --http-proxy-temp-path=/usr/local/nginx/tmp/proxy/ --http-fastcgi-temp-path=/usr/local/nginx/tmp/fcgi/ --with-poll_module --with-file-aio --with-http_realip_module --with-http_addition_module --with-http_addition_module --with-http_random_index_module --with-http_stub_status_module --http-uwsgi-temp-path=/usr/local/nginx/uwsgi_temp --http-scgi-temp-path=/usr/local/nginx/scgi_temp --with-pcre=/home/dyq/tool/pcre-8.40 --with-stream --with-http_v2_module | |
可以看到stream模块已经编译到nginx内了。 |
nginx stream模块配置简析
stream段的配置要与http段在同级目录。此处引用的为官方nginx说明配置。stream { | |
upstream backend { | |
hash $remote_addr consistent; | |
server backend1.example.com:12345 weight=5; | |
server 127.0.0.1:12345 max_fails=3 fail_timeout=30s; | |
server unix:/tmp/backend3; | |
} | |
upstream dns { | |
server 192.168.0.1:53535; | |
server dns.example.com:53; | |
} | |
server { | |
listen 12345; | |
proxy_connect_timeout 1s; | |
proxy_timeout 3s; | |
proxy_pass backend; | |
} | |
server { | |
listen 127.0.0.1:53 udp reuseport; | |
proxy_timeout 20s; | |
proxy_pass dns; | |
} | |
server { | |
listen [::1]:12345; | |
proxy_pass unix:/tmp/stream.socket; | |
} | |
} |
举一个栗子,利用stream模块代理mysql服务的3306端口
stream { | |
error_log /etc/nginx/error.log warn; | |
upstream mysql { | |
server 10.183.199.90:3390; | |
} | |
server { | |
listen 3306; | |
proxy_pass mysql; | |
proxy_timeout 600s; | |
proxy_connect_timeout 30s; | |
} | |
} |
可能遇到的问题
[nginx] [emerg] the ‘http2‘ parameter requires ngx_http_v2_module
编译时,指明需要http2模块 | |
./configure --prefix=… --with-http_v2_module |
解决安装nginx的nginx: [emerg] mkdir() “/var/temp/nginx/client” failed (2: No such file or directory)问题
创建不存在的目录 | |
mkdir -p /usr/local/tmp/nginx/client |
nginx: [emerg] getpwnam(“www”) failed 错误处理方法
解决方案一
在nginx.conf中 把user nobody的注释去掉既可解决方案二
原因是没有创建nginx这个用户,应该在服务器系统中添加nginx用户组和用户nginx,如下命令: | |
groupadd -f nginx | |
|
/usr/local/nginx/sbin/nginx -V
在nginx中增加配置 nginx.conf
stream { upstream cloudsocket { hash $remote_addr consistent; server 172.20.0.105:3306 weight=5 max_fails=3 fail_timeout=30s; } server { listen 8806;#数据库服务器监听端口 proxy_connect_timeout 10s; proxy_timeout 300s;#设置客户端和代理服务之间的超时时间,如果5分钟内没操作将自动断开。 proxy_pass cloudsocket; }}
stream {
upstream mysql {
server 101.43.234.153:3306; #3306为mysql的端口
}
server {
listen 1300;#1300为对外访问的端口
proxy_connect_timeout 10s;
proxy_timeout 30s;
proxy_pass mysql;
}
}
stream {
server {
listen 8888;
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass localhost:3306;
}
}
nginx 代理oracle
1、文件下载
nginx版本至少1.9的版本,版本太低没有stream这个功能,pcre-3.8.5
(检查是否安装 pcre 依赖: pcre -config- -version)
nginx http://nginx.org/download/nginx-1.10.3.tar.gz
pcre https://ftp.pcre.org/pub/pcre/pcre2-10.36.zip
安装依赖:openssl、gcc、g++、pcre等
2 编译
pcre安装 ./configure –prefix=/usr/local/pcre2-10.36
nginx安装 ./configure –prefix=/usr/local/nginx –with-stream –with-pcre=/usr/local/pcre2-10.36
make && make instal
3 配置文件 nginx/nginx.conf
软件基本信息
nginx版本:1.17.4
nginx所在服务器ip:192.168.21.100
oracleA信息:oracle11g,ip:192.168.21.213:1521
oracleB信息:oracle11g,ip:192.168.21.214:1521
nginx/sbin/nginx -s reload#重新加载配置文件
nginx/sbin/nginx -s stop#停止Nginx
nginx/sbin/nginx -s reopen#重新启动Nginx
反向代理oracle
nginx/nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream oracle {
server 192.168.21.213:1521 weight=1 max_fails=2 fail_timeout=30s; #原oracle地址
}
server {
listen 3335;# 反向代理后监听的端口,nginx启动后访问192.168.21.100:3335就可以访问到oracleA
proxy_connect_timeout 1s;
proxy_timeout 3s;
proxy_pass oracle;
}
}
oracle负载均衡
主要用于查询的时候进行负载均衡,oracleA和oracleB两个库内容相关。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream oracle {
server 192.168.21.213:1521 weight=1 max_fails=2 fail_timeout=30s; #原oracle地址
server 192.168.21.214:1521 weight=2 max_fails=2 fail_timeout=30s;
}
server {
listen 3335 so_keepalive=on; #so_keepalive,会话保持,防止查询飘走
proxy_pass oracle;
}
}
————————————————
nginx反向代理oracle+负载均衡配置
参考:https://blog.csdn.net/jijiuqiu6646/article/details/78675891
参考 https://www.cnblogs.com/ihappycat/p/11830560.html