使用Nginx+Docker配置HTTPS负载均衡

Docker是一个golang编写的开源轻量级的、可移植的、自给自足的容器,Docker主要应用在以下场景:

web应用的自动化打包和发布;

自动化测试和持续集成、发布;

在服务型环境中部署和调整数据库或其他的后台应用;

从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。

Docker系统有两个程序:docker服务端和docker客户端。其中docker服务端是一个服务进程,管理着所有的容器。docker客户端则扮演着docker服务端的远程控制器,可以用来控制docker的服务端进程。大部分情况下,docker服务端和客户端运行在一台机器上。

镜像:一个镜像相当于一个root文件系统,包含运行需要的文件、库、资源、配置

容器:容器是镜像的实例化操作,容器有自己独立的文件系统、网络配置、进程空间,每个容器是独立的运行机制,容器是无状态的,数据应保存在数据卷中。

仓库:管理docker镜像的发布

docker安装及配置

CentOS系列系统中可直接使用yum命令进行搜索安装,安装完毕后可运行docker version查看安装的版本,docker包含了很有公用的镜像,可使用docker search进行搜索安装。

yum install docker -y
docker pull nginx
# 运行4个docker镜像,网站目录在./ningx/html/下,日志文件在 ./nginx/logs/下
docker run -it -p 8081:80 --name nginx1 -v `pwd`/nginx/html1/:/usr/share/nginx/html/ -v `pwd`/nginx/logs1/:/var/log/nginx/  -d nginx
docker run -it -p 8082:80 --name nginx2 -v `pwd`/nginx/html2/:/usr/share/nginx/html/ -v `pwd`/nginx/logs2/:/var/log/nginx/ -d nginx
docker run -it -p 8083:80 --name nginx3 -v `pwd`/nginx/html3/:/usr/share/nginx/html/ -v `pwd`/nginx/logs3/:/var/log/nginx/ -d nginx
docker run -it -p 8084:80 --name nginx4 -v `pwd`/nginx/html4/:/usr/share/nginx/html/ -v `pwd`/nginx/logs4/:/var/log/nginx/ -d nginx

安装docker php-fpm

docker pull php:7.1-fpm
docker run -p 9000:9000 --name php-fpm1 -d -v /opt/app/docker/nginx/app1/:/var/www/html:ro php:7.1-fpm
docker run --name nginx1 -p 8081:80 -d -v /opt/app/docker/nginx/html1:/usr/share/nginx/html:ro -v /opt/app/docker/nginx/conf1:/etc/nginx/conf.d:ro -v /opt/app/docker/nginx/logs1:/var/log/nginx --link php-fpm1:php nginx
echo "<?php phpinfo();" > /opt/app/docker/nginx/app1/index.php

推荐《Docker从入门到实践》,具体可打开 https://www.linuxidc.com/Linux/2016-02/128290.htm

nginx配置

nginx的安装就不再描述了,最简单快捷的可使用yum进行安装,可可以自行去官网进行下载编译安装,以下是我的nginx负载均衡https到docker的配置文件:

注:我的运行环境在aws上,你可以将docker和nginx安装在一台机器上,也可以将docker部署在1台或4台机器,nginx部署在一台机器,再结合keepalived做高可用就可实现高可用双机热备的https负载均衡啦~

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    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;
    tcp_nodelay        on;
    keepalive_timeout  65;
    types_hash_max_size 2048;
   
    include            /etc/nginx/mime.types;
    default_type        application/octet-stream;
       
    index  index.html index.htm;
   
    upstream docker_nginx {
        ip_hash; #同一个ip一定时间内负载到一台机器
        server 172.31.0.155:8081; # docker虚拟的第1台nginx机器
        server 172.31.0.155:8082; # docker虚拟的第2台nginx机器
        server 172.31.0.155:8083; # docker虚拟的第3台nginx机器
        server 172.31.0.155:8084; # docker虚拟的第4台nginx机器
    }
   
    server {
        # 使用openssl自建的rsa证书
        ssl_certificate /opt/ssl/nginx.ipp365.com.crt;
        ssl_certificate_key /opt/ssl/nginx.ipp365.com.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;
   
        listen 443;
        ssl on;
        server_name nginx.ipp365.com;
       
        location / {
                # 代理到真实机器,如果真实机器也安装了https则使用https
                # 一般代理集群对流量进行了https后,真实机器可不再使用https
                proxy_pass ;
        }
    }
}

创建ssl自建的证书

线上证书一般去ca申请的,测试的话可以使用openssl自己创建两个证书,创建命令如下:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c90dad8edda729c73f8a84ce680648f1.html