用Docker搭建一个支持https的nginx代理服务

说明:本文所提的服务只是作者平常测试使用,可能含有未知bug或不成熟的解决方案,仅供参考,请不要用于正式环境,当然,使用过程中有任何问题欢迎提给我,我可以不断改进

GitHub地址: https://github.com/wll-zhou/nginx_proxy_docker

nginx不仅仅是一个高性能的web服务器软件,还可以用来做正向代理和反向代理,但是nginx不支持https的正向代理,作者搜索已有的解决方案,并把最终服务集成到Docker,后续直接通过docker run就能使用了

首先说下nginx实现https正向代理,这个用的是别人开发好的ngx_http_proxy_connect_module模块,详细资料可以参考这篇文章,本文的重点是记录怎么集成到Docker里面

首先准备好工作目录

mkdir -p nginx/workdir && cd nginx/workdir

下载指定的nginx版本,对应的ngx_http_proxy_connect_module模块

wget http://nginx.org/download/nginx-1.17.4.tar.gz
git clone https://github.com/chobits/ngx_http_proxy_connect_module.git nginx_proxy

返回上一层nginx目录,开始编写Dockerfile

# 基础镜像,这个用的centos7比较大,一般使用alpine
FROM centos:7
# 安装基础依赖工具
RUN yum install -y patch gcc glibc-devel make openssl-devel pcre-devel zlib-devel gd-devel geoip-devel perl-devel
#添加nginx用户组和用户,用来启动nginx的用户,看自己情况,也有用www启动的
RUN groupadd -g 101 nginx \
          && adduser  -u 101 -d /var/cache/nginx -s /sbin/nologin  -g nginx nginx 
#拷贝当前workdir目录到镜像中的/workdir
COPY ./workdir /workdir
#切换当前目录为/workdir
WORKDIR /workdir
#安装nginx服务(把对应的ngx_http_proxy_connect_module加入)
#安装完了之后把对应目录软件包删掉
RUN tar -zxvf nginx-1.17.4.tar.gz && cd nginx-1.17.4 \
       && patch -p1 < /workdir/nginx_proxy/patch/proxy_connect_rewrite_101504.patch \
      && ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-g -O2 -fdebug-prefix-map=/data/builder/debuild/nginx-1.17.1/debian/debuild-base/nginx-1.17.1=. -fstack-protector-strong -Wformat -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -Wl,--as-needed -pie' --add-module=/workdir/nginx_proxy \
     && make && make install \
     && cd /workdir && rm -rf /workdir/*
#启动nginx服务,注意要加后面的-g daemon off,表示关闭守护进程模式
CMD ["nginx", "-g", "daemon off;"]

以上就是Dockerfile的全部内容,当前工作目录结构

.

├── Dockerfile

└── workdir

├── nginx-1.17.4.tar.gz

└── nginx_proxy

下面开始build镜像,-t表示取的镜像名字,后面那个.不能漏了,表示当前目录,整个过程需要一定时间,视机器的网络情况

docker build -t nginx:proxy_1.17.4 .

build成功标识:

Successfully built 5e54788aa240

Successfully tagged nginx:proxy_1.17.4

如果失败的话会有对应提示,按照提示解决即可。

现在image生成了,docker image ls看看是不是已经有nginx:proxy_1.17.4了

接下来可以运行了,当然要准备好对应nginx配置文见,把代理的配置加上

    server {
        listen                         8888;
        access_log /var/log/nginx/proxy.log; 
        # dns resolver used by forward proxying
        resolver                       8.8.8.8;
        # forward proxy for CONNECT request
        proxy_connect;
        proxy_connect_allow            443 563;
        proxy_connect_connect_timeout  10s;
        proxy_connect_read_timeout     10s;
        proxy_connect_send_timeout     10s;
        # forward proxy for non-CONNECT request
        location / { 
            proxy_pass http://$host;
            proxy_set_header Host $host;
        }   
    }

运行镜像(对应路径和端口可以自己设定)

docker run -d -p 8888:8888 -v /home/www/image/nginx/nginx.conf:/etc/nginx/nginx.conf nginx:proxy_1.17.4

启动之后测试下代理是否可用

curl https://www.geek-share.com -v -x 127.0.0.1:8888

至此,集成到docker完毕,后续换一个机器,直接把镜像拷贝一下,然后docker run就可以了,方便很多

以上服务已经发布到GitHub,clone下来后可以直接运行,当然,自己的机器要已经安装docker

https://github.com/wll-zhou/nginx_proxy_docker

欢迎指正问题!

文章同步发布: https://www.geek-share.com/detail/2780659901.html

用Docker搭建一个支持https的nginx代理服务的更多相关文章

  1. 5分钟使用docker搭建一个WordPress

    环境为已安装Docker Destop的Windows系统. 过程 使用Docker拉去官方WordPress镜像再进行简单配置是可行的, 但是这里我们使用docker-compose,它会自动根据你 ...

  2. 如何通过Docker搭建一个swoft开发环境

    本篇文章给大家分享的内容是关于如何通过Docker搭建一个swoft开发环境 ,内容很详细,有需要的朋友可以参考一下,希望可以帮助到你们. Swoft首个基于 Swoole 原生协程的新时代 PHP ...

  3. 部署支持 https 的 Nginx 服务

    通过 Certbot 为 nginx 开启https支持. 环境 CentOS 7.1 python2.x(这玩意系统里本来就有) 安装Nginx sudo yum install nginx -y ...

  4. 最简单的dockerfile使用教程 - 创建一个支持SSL的Nginx镜像

    什么是dockerfile?简单的说就是一个文本格式的脚本文件,其内包含了一条条的指令(Instruction),每一条指令负责描述镜像的当前层(Layer)如何构建. 下面通过一个具体的例子来学习d ...

  5. 让你的网站免费支持 HTTPS 及 Nginx 平滑升级

    为什么要使用 HTTPS ? 首先来说一下 HTTP 与 HTTPS 协议的区别吧,他们的根本区别就是 HTTPS 在 HTTP 协议的基础上加入了 SSL 层,在传输层对网络连接进行加密.简单点说在 ...

  6. 用letsencrypt搭建免费的https网站--nginx篇

    环境:阿里云服务器centos7.3,nignx,letsencrypt做免费的https证书 Let’s Encrypt官网:https://letsencrypt.org/ 1.服务器开放端口:4 ...

  7. 【Linux】【自学笔记】docker搭建一个spring-boot程序

    写在开始    最近捣腾Linux,安装虚拟机VMware并安装了CentOS 7系统,开始研究Linux,但是无从下手,就结合工作中用到的东西一步一步研究,事实并不是那么顺利.特此开博客,记录在过程 ...

  8. Swoft 新手向教程 - 通过 Docker 搭建一个开发环境

    本系列文章将从使用层面介绍 Swoft 框架的使用及业务开发,面向初中级的 PHPer Swoft首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈组件化框架,内置协程网络服务器及常用的 ...

  9. linux搭建一个配置简单的nginx反向代理服务器 2个tomcat

    1.我们只要实现访问nginx服务器能跳转到不同的服务器即可,我本地测试是这样的, 在nginx服务器里面搭建了2个tomcat,2个tomcat端口分别是8080和8081,当我输入我nginx服务 ...

随机推荐

  1. SoapUI接口测试实战

    本次测试的是REST服务,使用的SoapUI破解版,如果担心开源版的会有功能差异,可以参照我之前的博文安装破解版. 博文地址:https://www.cnblogs.com/Sweettesting/ ...

  2. c#通过Redis实现轻量级消息组件

    最近在开发一个轻量级ASP.NET MVC开发框架,需要加入日志记录,邮件发送,短信发送等功能,为了保持模块的独立性,所以需要通过消息通信的方式进行处理,为了保持框架在部署,使用,二次开发过程中的简易 ...

  3. Kotlin学习系列(二)

    IF表达式 if在kotlin可以当做表达式使用跟java的三元操作符类似: var max = if( a > b ) a else b if分支可以使用代码块,最后一个表达式是返回值: va ...

  4. 移动端获取短信验证码java实现——阿里云短信服务

    需求:移动端输入手机号,获取验证码.点击登录,验证验证码是否输入错误.是否超时等情况,一旦校验通过,将用户数据保存到数据中(业务逻辑). 前提:注册阿里用户,开通短信服务,申请key.秘钥.签名.短信 ...

  5. thymeleaf 遍历使用案例

    1.语法: th:each属性用于迭代循环,语法:th:each="obj,iterStat:${objList}" 迭代对象可以是List,Map,数组等; 2.说明:iterS ...

  6. hadoop入门之海量Web日志分析 用Hadoop提取KPI统计指标

    转载自:http://blog.fens.me/hadoop-mapreduce-log-kpi/ 今天学习了这一篇博客,写得十分好,照着这篇博客敲了一遍. 发现几个问题, 一是这篇博客中采用的had ...

  7. 免费申请 HTTPS 证书,开启全站 HTTPS

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 HTTP 报文以明文形式传输,如果你的网站只支持 HTTP 协议,那么就有可能遭受到安 ...

  8. 那些初学python犯过的小白错误(学习笔记1)

    一.关于print函数 区别于c和py2,py3的print的正确形式如下:print("hello world") 错误语句:print"hello world&quo ...

  9. MongoDB系列(一):初步理解

    一.简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库 1.易用性 1)MongoDB是一款面向文档的数据库,而不是关系型数据库,因此而有着更好的扩展性. 2)通过在文档中嵌入文档和数组, ...

  10. Vue入门教程 第三篇 (条件与循环)

    v-if语法(条件) 符合条件时显示(渲染)某一元素. <div id="app"> <div v-if="ok"> <h1> ...