Docker教程三之基于Centos7的Nginx环境镜像以及简单负载均衡及SSL证书简单配置

8 篇文章 0 订阅
8 篇文章 0 订阅

上一章我完成了NodeJs镜像,NodeJs跑起了服务,那么这章,我们继续对该服务进行创建负载的Nginx镜像

 

因为负载均衡需要单独的服务器,当然,一个服务器也可以,但是就失去了多服务器的意义,所以,我还是决定单独创建一个基于CentOS 7 的 Nginx 环境镜像

 

我只需要对我的服务进行一个基础负载,之所以选择Nginx,就因为开源,免费,且高效,使用过程中并没有涉及到高级情况,所以就不多说Nginx的东西了(高级的我也没去看过,呵呵),自行百度即可

再此基础之上,我对Nginx配置又进行了SSL协议配置,简单的来说,就是对域名访问增加证书验证,https请求

SSL证书的使用,我采用阿里云SSL证书,具体操作步骤:SSL证书安装指南     Nginx 配置指南

 

直接上干货

 

之前找了很多资料,但是需要跑起来的话,还是有点坑的,然后对其整理得到下面的 dockerfile 内容

坑:

1,Nginx的启动问题,网上传了很多Nginx相关dockerfile的文件内容,文件中的过程都是大同小异的,但是在结尾的CMD [] 命令上有了分歧,这也是造成我自己踩坑的原因,网上流传大致以下几种方式

a) 不启用: #CMD[""]

b) 启动Nginx:CMD["nginx","-c","nginx.conf"]

c) 启动Shell: CMD["/bin/bash"]

d) 其他怪异的方式

以上方式我都尝试了,但是似乎不对我的胃口,我也不能说这些都是错的,可能是我的尝试方法不对吧

最后使用的方式请向下看内容

dockerfile 

FROM centos:7 
  
RUN rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
RUN yum -y install nginx && yum clean all 
  
EXPOSE 80 443
  
CMD ["nginx", "-g", "daemon off;"]


解释:

From 引用CentOS 7 的基础镜像(上一章编译而来)

 

RUN rpm -Uvh RPM更新Nginx源文件

 

RUN yum -y install nginx && yum clean all  执行安装Nginx并清理yum缓存



EXPOSE 80 443  开放端口,因为是负载,所以我就直接开通80 就好, 443 可以忽略

 

CMD ["nginx", "-g", "daemon off;"] 这句至关重要,这里牵扯到容器的进程问题,容器bash的pid为1,容器执行完毕后会自动退出该容器,所以启动的时候,容器会感觉启动不起来,实际上容器已经跑完了,所以这里设置nginx的daemon 关闭,不要以守护进程方式进行运行,这样就Ok了

 

 

最后的编译: docker build --no-cache --rm -t nginx:7.0 . 

 

对于dockerfile 中的指令,以及 Nginx 的参数配置, 具体在专业教程基础中去查看吧

 

再来说回 Nginx的基础配置

 

 

nginx.conf 文件内容,因为是yum安装,所以文件存放位置在 /etc/nginx/ 目录下

nginx.conf

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
   
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    upstream blog {  
            server 172.17.0.2:8888;  
            server 172.17.0.3:8888;  
            server 172.17.0.4:8888;          
    }
    upstream api {
        server 172.17.0.7:10000;
    }

    server {
        listen 80;
        server_name iuver.cn; 

        rewrite ^(.*)$  https://$host$1 permanent;  
    }

    server {
        listen 443 ssl;
        server_name iuver.cn;

        ssl on;    
        ssl_certificate  cert/1600551_www.iuver.cn.pem;
        ssl_certificate_key cert/1600551_www.iuver.cn.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;      

        location / {
            proxy_pass http://blog/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        location /api {
            proxy_pass   http://api/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        } 
    }
}

在 nginx.conf 的配置中, 我只设置了部分内容

upstream blog {  
       server 172.17.0.2:8888;     
}

这个配置是对本地的另一个 docker 容器进行负载,反代理配置,当然可以配置多个负载地址

 

server {
        listen 80;
        server_name iuver.cn; 

        rewrite ^(.*)$  https://$host$1 permanent;  
}

server {
        listen 443 ssl;
        server_name iuver.cn;

        ssl on;    
        ssl_certificate  cert/1600551_www.iuver.cn.pem;
        ssl_certificate_key cert/1600551_www.iuver.cn.key;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;      

        location / {
            proxy_pass http://blog/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        location /api {
            proxy_pass   http://api/;
            proxy_set_header   Host             $host;
            proxy_set_header   X-Real-IP        $remote_addr;
            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        } 
}

这个服务配置是关乎到 nginx 监听的服务,以及代理转接,注意 配置中,

第一个 server 监听 80 端口,此处是用来监听请求的

rewrite ^(.*)$  https://$host$1 permanent;  用于将 http 请求 转换为 https 请求

第二个 server 监听 443 端口,也就是监听 SSL 了

http:// 后面所跟着的为反代理配置的名称, 这样就将http 直接转换为 https 了

 

##include /etc/nginx/conf.d / *.conf;

注释掉了 nginx 默认显示站点的配置项

 

通过配置上节中我们的 web 项目地址到nginx中,我们就完成了一个简单的web负载

 

最后的启动

docker run -d -p 80:80 -p 443:443 -v /root/docker/nginx/nginx.conf:/etc/nginx/nginx.conf  -v /root/docker/nginx/cert:/etc/nginx/cert --name nginx nginx:7.0

-p: 端口映射,通过nginx 的80端口,重定向到我们的web的端口上去,

通过 443 端口,对http请求进行https转接

 

Nginx 下载地址:http://nginx.org/packages/centos/7/noarch/RPMS/

 

可以看我的码云:去码云看看

 

第三章,到此结束

 

 

 

 

 

 

 

 

 

 

EXPOSE 80 443  开放端口,因为是负载,所以我就直接开通80 就好, 443 可以忽略

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值