场景:

网络隔离,访问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

useradd -g ngin 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