docker + nginx、http转https、https转http,nginx代理tcp端口(redis)(http、ws)

您所在的位置:网站首页 nginx协议转换 docker + nginx、http转https、https转http,nginx代理tcp端口(redis)(http、ws)

docker + nginx、http转https、https转http,nginx代理tcp端口(redis)(http、ws)

2024-03-25 07:49| 来源: 网络整理| 查看: 265

目录 一、基础环境准备1、安装docker2、下载nginx镜像 二、http转https、https转http的应用1、nginx反向代理单个web项目①准备配置文件②创建容器 2、nginx安装ssl证书(外部https转内部http,http重定向到https)①准备配置文件②创建容器 3、一个nginx代理多个web项目①准备配置文件②创建容器 三、使用nginx代理tcp端口(以redis为例)1、安装redis2、修改nginx.conf 配置文件3、启动nginx补充1:nginx同时代理http、websocket补充2:nginx打印日志

注:本次运行环境,考虑到docker可移植性比较强,所以本次环境全部以docker为基础做的,如果你的nginx直接装在主机中,路径与容器内部是不同的,仅可参考配置文件内容

测试环境: 操作系统:centos 7.9(GUI 桌面版本、最小化安装均可) docker版本:19.03.5 nginx:1.21.3以下为nginx简介,后边步骤中,将根据需要使用以下内容,注意以下的目录可以根据自己喜好修改名称及位置,但是要确保和配置文件以及容器挂载的路径相匹配 -p 表示映射端口(冒号左侧为主机端口) -v 表示挂载目录(冒号左侧为主机目录) -d 表示后台运行 docker run --name nginx -p 16379:6379 -p 443:443 -p 80:80 \ -v /data/nginx/data:/usr/share/nginx/html \ -v /data/nginx/config/nginx.conf:/etc/nginx/nginx.conf\ -v /data/nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf \ -v /data/nginx/logs:/var/log/nginx \ -v /data/nginx/ssl:/ssl \ -d nginx:1.21.3 一、基础环境准备 1、安装docker 查看内核版本,需要高于3.10,并且系统是64位 [root@k8s-master ~]# uname -r 直接使用yum install docker 默认拉取最早版本的docker,我个人在使用中出现了问题,也没做过多的资料查找,选择安装19版本的如果之前安装过老版本docker,需要先进行卸载 [root@k8s-master ~]# yum remove docker* 2、下载nginx镜像 拉取nginx镜像 [root@localhost ~]# docker pull nginx 查看镜像版本 [root@localhost ~]# docker image inspect nginx:latest | grep -i version 可更换镜像标签,保存镜像,方便后期使用 [root@localhost ~]# docker tag nginx:latest nginx:1.21.3 [root@localhost ~]# docker save -o nginx.tar nginx:1.21.3 二、http转https、https转http的应用 1、nginx反向代理单个web项目 ①准备配置文件 创建文件default.conf,写入以下内容: server { listen 80; #表示监听nginx容器得80端口 server_name localhost; #填写主机名或域名 location / { proxy_pass http://192.168.1.1:8080; #需要代理的内网主机IP以及8080端口号 } } ②创建容器 将default.conf 放入主机存储的目录,主机目录:/data/nginx/config/conf.d/与之对应的容器目录:/etc/nginx/conf.d/必须先准备好文件,再去创建容器 [root@localhost ~]# docker run --name nginx -p 80:80 \ -v /data/nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf \ -d nginx:1.21.3 容器启动完成后,在浏览器中输入装有nginx的主机IP地址,即可跳转到所代理的web项目 2、nginx安装ssl证书(外部https转内部http,http重定向到https) ①准备配置文件 首先在阿里云或其它地方申请好证书,这里不做赘述了创建文件default.conf,写入以下内容: server { # listen 80; #此处仅演示了证书功能,未引入80端口 listen 443 ssl; server_name localhost; #这里也可以用你的域名 # rewrite ^(.*)$ https://$host$1; #如果需要把http重定向到https,尝试以下方法 # return 301 https://$host$request_uri; #如果需要把http重定向到https,尝试以下方法 ssl_certificate /ssl/xxx.com.pem; # xxx.com.pem 这名称根据实际做修改 ssl_certificate_key /ssl/xxx.com.key; # xxx.com.key 这名称根据实际做修改 ssl_session_timeout 5m; # 指定密码为openssl支持的格式 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码 location / { proxy_pass http://192.168.1.1:8080; #需要代理的内网主机IP以及8080端口号,根据实际需要做调整 } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } ②创建容器 将default.conf 放入主机存储的目录,主机目录:/data/nginx/config/conf.d/将证书放入主机存储的目录,主机目录:/data/nginx/ssl/ docker run --name nginx -p 443:443 -p 80:80 \ -v /data/nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf \ -v /data/nginx/ssl:/ssl \ -d nginx:1.21.3

容器启动完成后,在浏览器中输入“https://域名",即可跳转到所代理的web项目

3、一个nginx代理多个web项目 ①准备配置文件 首先在阿里云或其它地方申请好证书,这里不做赘述了创建文件default.conf,写入以下内容: server { # listen 80; #此处仅演示了证书功能,未引入80端口 listen 443 ssl; server_name 1.xxx.com; #这里用你的第1个域名 # rewrite ^(.*)$ https://$host$1; #如果需要把http重定向到https,尝试以下方法 # return 301 https://$host$request_uri; #如果需要把http重定向到https,尝试以下方法 ssl_certificate /ssl/xxx.com.pem; # xxx.com.pem 这名称根据实际做修改 ssl_certificate_key /ssl/xxx.com.key; # xxx.com.key 这名称根据实际做修改 ssl_session_timeout 5m; # 指定密码为openssl支持的格式 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码 location / { proxy_pass http://192.168.1.1:8080; #需要代理的内网主机IP以及8080端口号,根据实际需要做调整 } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } # 以下就是复制上边的内容,然后把域名和需要代理的内网主机做修改就可以了 server { listen 443 ssl; server_name 2.xxx.com; #这里用你的第2个域名 ssl_certificate /ssl/xxx.com.pem; ssl_certificate_key /ssl/xxx.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_prefer_server_ciphers on; location / { proxy_pass http://192.168.1.2:8080; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } ②创建容器 将default.conf 放入主机存储的目录,主机目录:/data/nginx/config/conf.d/将证书放入主机存储的目录,主机目录:/data/nginx/ssl/ docker run --name nginx -p 443:443 -p 80:80 \ -v /data/nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf \ -v /data/nginx/ssl:/ssl \ -d nginx:1.21.3

容器启动完成后,在浏览器中输入“https://域名",即可跳转到所代理的web项目

三、使用nginx代理tcp端口(以redis为例) 1、安装redis 拉取nginx镜像 [root@localhost ~]# docker pull redis 启动 redis(此处仅做测试,不做过多操作,生产环境中,建议把数据库和配置文件挂载出来的) [root@localhost ~]# docker run -p 6379:6379 -d redis 2、修改nginx.conf 配置文件 修改 nginx.conf,将以下一行代码注释掉(次处仅演示对tcp端口的转发功能,所以舍弃了 default.conf 这个配置文件中的内容,如果你有 http 转发的需求,就根据实际情况做调整) [root@localhost ~]# vi /data/nginx/config/nginx.conf # include /etc/nginx/conf.d/*.conf; 在nginx.conf末尾处增加代码段 stream { upstream redis { server *主机IP地址或容器地址*:6379; # server *主机IP地址或容器地址*:6379;再加一个是轮询,同主机同服务的不同端口也可 } server { listen 6379; proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass redis; # ssl_certificate /ssl/server.crt; # ssl_certificate_key /ssl/server.key; # ssl_session_timeout 45s;#没有数据传输时,45s踢掉这个会话 # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # ssl_prefer_server_ciphers on; } }

或通过以下格式增加

stream { server { listen 6379; # 如果需要加证书,就在这个部分添加就可以了,参考上边ssl证书部分的内容添加即可 proxy_connect_timeout 1s; proxy_timeout 3s; proxy_pass *主机IP地址或容器地址*:6379; # server *主机IP地址或容器地址*:6379;再加一个是轮询,同主机同服务的不同端口也可 } } 3、启动nginx 将nginx的6379端口映射到主机的16379端口,后期可通过次端口方位redis [root@localhost ~]# docker run --name nginx -p 16379:6379 \ -v /data/nginx/config/nginx.conf:/etc/nginx/nginx.conf \ -d nginx:1.21.3

现在就可以通过 redis 的工具软件进行连接尝试了

补充1:nginx同时代理http、websocket

配置文件,再default.conf统计目录下创建proxy.conf

map $http_upgrade $connection_upgrade { default upgrade; #'' close; } server { # 多个域名,多个服务,可以多写几个server keepalive_requests 150; listen 80; server_name test.test.com; #监听地址 client_max_body_size 1000M; location / { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_pass http://192.168.1.100:8080; } location /ws { # /ws,后边是否带“/”有本质上的区别,带“/”表示引用ws下一级路径 #proxy_next_upstream error timeout invalid_header http_500 http_503 http_404; proxy_pass http://192.168.1.100:61624; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } } 补充2:nginx打印日志

【这里代理mqtt的8883端口】

user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 10240; } stream { log_format proxy '$remote_addr [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time "$upstream_addr" ' '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"'; upstream rabbitmq8883 { # server 192.168.0.137:1883; server 192.168.0.137:8884; server 192.168.0.137:8885; server 192.168.0.137:8886; server 192.168.0.137:8887; server 192.168.0.137:8888; server 192.168.0.137:8889; server 192.168.0.137:8890; server 192.168.0.137:8891; server 192.168.0.137:8892; server 192.168.0.137:8893; } server { error_log /var/log/nginx/rabbitmq8883__error.log;#这里是容器内路径,根据自己持久化路径找对应主机路径 access_log /var/log/nginx/rabbitmq8883__access.log proxy;#这里是容器内路径,根据自己持久化路径找对应主机路径 listen 8883; # listen 8883 ssl; proxy_connect_timeout 45s; proxy_timeout 45s; proxy_pass rabbitmq8883; # ssl_certificate /ssl/server.crt; # ssl_certificate_key /ssl/server.key; # #ssl_session_timeout 45s; # ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; # ssl_prefer_server_ciphers on; }

以下日志截图内容是对应配置文件内容: 因为使用的nginx代理,所以以下截图的远端地址是容器网关地址

log_format proxy '$remote_addr [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time "$upstream_addr" ' '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3