docker安装nginx并配置https访问

1.在dockerhub上查询是否有本身须要的nginx版本html

#docker search nginxnginx

2.拉取仓库nginx镜像,不加版本号默认拉取最新的版本docker

#docker pull nginx浏览器

3.启动nginx容器 安全

# docker run --detach \
        --name wx-nginx \
        -p 443:443\
        -p 80:80 \
        -v /home/evan/workspace/wxserver/nginx/data:/usr/share/nginx/html:rw\
        -v /home/evan/workspace/wxserver/nginx/config/nginx.conf:/etc/nginx/nginx.conf/:rw\
        -v /home/evan/workspace/wxserver/nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf:rw\
        -v /home/evan/workspace/wxserver/nginx/logs:/var/log/nginx/:rw\
        -v /home/evan/workspace/wxserver/nginx/ssl:/ssl/:rw\
        -d nginx

备注运行上述命令后可能或报错:Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type. 由于宿主机若是nginx配置文件与容器nginx不一致没法挂载,上述命令的/home/evan/workspace/wxserver/nginx/config/nginx.conf,/home/evan/workspace/wxserver/nginx/config/conf.d/default.conf中的nginx.conf,default.conf在该路径下是文件夹不能与容器内部文件造成映射;服务器

解决:到宿主机上/home/evan/workspace/wxserver/nginx/config/删除nginx.conf文件夹,建立对应的nginx.conf文件,到宿主机/home/evan/workspace/wxserver/nginx/config/conf.d/下删除default.conf文件夹,建立default.conf文件,这是刚刚启动的容器没有启动成功能够先删除刚刚没有启动成功的nginx容器,session

1).查询全部容器 #docker ps -a 并发

2) 删除刚刚没启动成功的nginx容器 # docker rm 你的nginx容器IDapp

3)从新执行负载均衡

# docker run --detach \
        --name wx-nginx \
        -p 443:443\
        -p 80:80 \
        -v /home/evan/workspace/wxserver/nginx/data:/usr/share/nginx/html:rw\
        -v /home/evan/workspace/wxserver/nginx/config/nginx.conf:/etc/nginx/nginx.conf/:rw\
        -v /home/evan/workspace/wxserver/nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf:rw\
        -v /home/evan/workspace/wxserver/nginx/logs:/var/log/nginx/:rw\
        -v /home/evan/workspace/wxserver/nginx/ssl:/ssl/:rw\
        -d nginx

4.文件准备

  • nginx的默认首页html的存放目录映射到host盘的目录, /home/evan/workspace/wxserver/nginx/data
  • nginx的配置文件映射到host盘的文件,/home/evan/workspace/wxserver/nginx/config/nginx.conf

1)在上述/home/evan/workspace/wxserver/nginx/config/夹下本身建立的nginx.conf添加默认配置

#运行nginx的用户
user  nginx;
#启动进程设置成和CPU数量相等
worker_processes  1;

#全局错误日志及PID文件的位置
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

#工做模式及链接数上限
events {
        #单个后台work进程最大并发数设置为1024
    worker_connections  1024;
}


http {
        #设定mime类型
    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压缩
    #gzip  on;

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

2)在上述/home/evan/workspace/wxserver/nginx/config/conf.d/夹下本身建立的default.conf添加默认配置

server {
    listen    80;       #侦听80端口,若是强制全部的访问都必须是HTTPs的,这行须要注销掉
    server_name  www.buagengen.com;             #域名

    charset utf-8;
    #access_log  /var/log/nginx/host.access.log  main;

        # 定义首页索引目录和名称
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    #定义错误提示页面
    #error_page  404              /404.html;

    #重定向错误页面到 /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

3) 在/home/evan/workspace/wxserver/nginx/data:/usr/share/nginx/html/文件夹下随便建立一个index.html文件,任意的均可以。

这个时候直接经过IP地址就能够访问nginx定义的这个html文件了。可是这个时候的访问只是http的,https的访问仍是不行的,须要添加证书到nginx服务器。

----------------------------------------------------------------------------------------------------------

5.经过openssl生成证书配置https 

进入上述路径/home/evan/workspace/wxserver/nginx/ssl/ 文件夹下执行以下操做:

1)设置server.key,这里须要设置两遍密码:

#openssl genrsa -des3 -out server.key 1024

2)参数设置,首先这里须要输入以前设置的密码,而后须要输入以下的信息,大概填一下就能够了,反正是测试用的:

#openssl req -new -key server.key -out server.csr

3) 写RSA秘钥(这里也要求输入以前设置的密码):

#openssl rsa -in server.key -out server_nopwd.key

4)获取私钥:

#openssl x509 -req -days 365 -in server.csr -signkey server_nopwd.key -out server.crt

完成这一步以后就获得了咱们须要的证书文件和私钥了

6 .添加配置nginx ssl配置

1)修改/home/evan/workspace/wxserver/nginx/config/conf.d/文件夹下的配置文件default.conf

server {
    listen    80;       #侦听80端口,若是强制全部的访问都必须是HTTPs的,这行须要注销掉
    listen    443 ssl;
    server_name  www.buagengen.com;             #域名

    # 增长ssl
    #ssl on;        #若是强制HTTPs访问,这行要打开
    ssl_certificate /ssl/server.crt;
    ssl_certificate_key /ssl/server_nopwd.key;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

     # 指定密码为openssl支持的格式
     ssl_protocols  SSLv2 SSLv3 TLSv1.2;

     ssl_ciphers  HIGH:!aNULL:!MD5;  # 密码加密方式
     ssl_prefer_server_ciphers  on;   # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码

     # 定义首页索引目录和名称
     location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
     }

    #重定向错误页面到 /50x.html
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

重启nginx容器,如今就能够经过https:// ip 来访问nginx的服务器了

备注:若是出现EM_do_header:bad password read error:140B0009:SSL 错误,由于nginx启动的时候须要输入证书密码,解决办法是能够使用私钥来生成解密后的key来代替,效果是同样的(就跟ssh链接差很少),达到免密码重启的效果,在上述配置中

server_nopwd.key就是解密的key,server.key就是加密的key,刚刚我配置的就是解密的key.

附录:nginx的负载均衡配置:

,因为证书是属于自签发的因此浏览器不认可(不认识)会弹出不安全的连接提示,因此正式上线须要申请正规的证书,在当前状况下线设置浏览器忽略该提示,而后  浏览器会请求时会发送预检机制发送OPTIONS请求,去判断是不是成功安全的,nginx对应的配置以下

upstream hsdfas {
  #least_conn;  #least_conn请求分配到链接数最少的server;ip_hash按照访问ip的hash值分配,这样同一客户端连续的Web请求都会被分发到同一server进行处理;
  #server 192.168.1.79:8092 weight=1 max_fails=3; #down表示单前的server暂时不参与负载,非backup机器down或者忙的时候,请求backup机器

server{
   listen   80;       #侦听80端口,若是强制全部的访问都必须是HTTPs的,这行须要注销掉
   listen 443 ssl;    
   server_name 192.168.1.79;
   
   #开启  若是把ssl on;这行去掉,ssl写在443端口后面。这样http和https的连接均可以用
   #ssl on;       #若是强制HTTPs访问,这行要打开
   ssl_certificate /ssl/hsdfas.crt; 
   ssl_certificate_key /ssl/hsdfas_unsecure.key;
   
   ssl_session_cache    shared:SSL:1m;
   ssl_session_timeout  5m;
   
   # 指定密码为openssl支持的格式
   ssl_protocols  SSLv2 SSLv3 TLSv1.2;
   
    ssl_ciphers  HIGH:!aNULL:!MD5;  # 密码加密方式
    ssl_prefer_server_ciphers  on;   # 依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码
    
   location / {
        proxy_pass   http://hsdfas;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_ignore_client_abort  on;

       // 排除浏览器的预检机制         if ($request_method = 'OPTIONS') {          add_header Access-Control-Allow-Origin $http_origin;          add_header Access-Control-Allow-Headers Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,X-Data-Type,X-Requested-With;          add_header Access-Control-Allow-Methods GET,POST,OPTIONS,HEAD,PUT;           add_header Access-Control-Allow-Credentials true;           add_header Access-Control-Allow-Headers X-Data-Type,X-Auth-Token;            return 204;        }            client_max_body_size    16m;         client_body_buffer_size 512k;         proxy_connect_timeout   300;         proxy_send_timeout      300;         proxy_read_timeout      300;         proxy_buffer_size       512k;         proxy_buffers        16 512k;         proxy_busy_buffers_size 1024k;         proxy_temp_file_write_size 1024k;         add_header Access-Control-Allow-Origin *;         index index.jsp index.html index.htm;     }             #重定向错误页面到 /50x.html     error_page   500 502 503 504  /50x.html;     location = /50x.html {         root   /usr/share/nginx/html;     }    }