docker部署nginx并实现https

发布于:2024-05-05 ⋅ 阅读:(31) ⋅ 点赞:(0)

docker部署nginx并实现https

1、服务器环境

[root@liuyanfen12 ~]#systemctl stop firewalld
[root@liuyanfen12 ~]#setenforce 0
#关闭防火墙和核心防护

image-20240503185711101

2、安装docker

[root@liuyanfen12 ~]#yum install -y yum-utils device-mapper-persistent-data lvm2
#安装依赖包
[root@liuyanfen12 ~]#yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#设置阿里云镜像源
[root@liuyanfen12 ~]#yum install -y docker-ce docker-ce-cli containerd.io
#安装Docker-CE(社区版)
[root@liuyanfen12 ~]#systemctl enable --now docker.service
#开机自启并立即启动
[root@liuyanfen12 ~]#systemctl status docker.service
#查看状态

image-20240503185922419

image-20240503190029727

image-20240503190127810

3、准备证书

[root@liuyanfen12 ~]#mkdir /opt/nginx -p
#创建目录
[root@liuyanfen12 ~]#cd /opt/nginx/
#切换
[root@liuyanfen12 nginx]#ls
[root@liuyanfen12 nginx]#vim certificate.sh
#编辑证书脚本
CA_SUBJECT="/O=luck/CN=ca.luck.com"
SUBJECT="/C=CN/ST=js/L=nj/O=luck/CN=www.luck.com"
SERIAL=34
EXPIRE=202002
FILE=luck.com

openssl req  -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crt

openssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key  -subj $SUBJECT -out ${FILE}.csr

openssl x509 -req -in ${FILE}.csr  -CA ca.crt -CAkey ca.key -set_serial $SERIAL  -days $EXPIRE -out ${FILE}.crt

chmod 600 ${FILE}.key ca.key
--------------------------------------------------------------------------------------------------------
#openssl req  -x509 -newkey rsa:2048 -subj $CA_SUBJECT -keyout ca.key -nodes -days 202002 -out ca.crt
-x509: 生成自签名的证书,而不是生成 CSR(证书签名请求)。
-newkey rsa:2048: 使用 RSA 算法生成一个新的密钥对,密钥长度为2048位。
-subj $CA_SUBJECT: 指定证书的主体信息,这里是定义的 CA 主体信息。
-keyout ca.key: 指定生成的私钥文件名为 ca.key。
-nodes: 创建的私钥不加密,即没有密码保护。
-days $EXPIRE: 设置证书有效期,这里是到2020年2月。
-out ca.crt: 指定生成的自签名CA证书文件名为 ca.crt
--------------------------------------------------------------------------------------------------------
#openssl req -newkey rsa:2048 -nodes -keyout ${FILE}.key  -subj $SUBJECT -out ${FILE}.csr
-newkey rsa:2048: 同上,创建一个新的RSA密钥对。
-keyout ${FILE}.key: 生成的服务器私钥文件名为 ${FILE}.key,此处为 kgc.com.key。
-subj $SUBJECT: 指定服务器证书的主体信息。
-out ${FILE}.csr: 生成的证书签名请求文件名为 ${FILE}.csr,此处为 kgc.com.csr。
--------------------------------------------------------------------------------------------------------
#openssl x509 -req -in ${FILE}.csr  -CA ca.crt -CAkey ca.key -set_serial $SERIAL  -days $EXPIRE -out
-req: 表明接下来的操作是基于一个证书请求文件。
-in ${FILE}.csr: 指定要使用的证书请求文件,即之前生成的 kgc.com.csr。
-CA ca.crt: 指定签发证书的CA证书文件,即第一步生成的 ca.crt。
-CAkey ca.key: 指定CA的私钥文件,用于签署新的证书。
-set_serial $SERIAL: 指定新证书的序列号。
-days $EXPIRE: 设置服务器证书的有效期。
-out ${FILE}.crt: 生成的服务器证书文件名为 ${FILE}.crt,此处为 kgc.com.crt。
--------------------------------------------------------------------------------------------------------
#chmod 600 ${FILE}.key ca.key
chmod 600: 改变文件权限,使其只有所有者有读写权限,增强安全性。
${FILE}.key 和 ca.key: 分别指服务器私钥和CA私钥文件,确保它们的访问权限受限
--------------------------------------------------------------------------------------------------------

[root@liuyanfen12 nginx]#chmod +x certificate.sh
#添加权限
[root@liuyanfen12 nginx]#./certificate.sh
#运行
Generating a 2048 bit RSA private key
..........................................................................................................+++
.................+++
writing new private key to 'ca.key'
-----
Generating a 2048 bit RSA private key
.....................+++
..+++
writing new private key to 'luck.com.key'
-----
Signature ok
subject=/C=CN/ST=js/L=nj/O=luck/CN=www.luck.com
Getting CA Private Key

[root@liuyanfen12 nginx]#ls
ca.crt  ca.key  certificate.sh  luck.com.crt  luck.com.csr  luck.com.key
[root@liuyanfen12 nginx]#cat luck.com.crt ca.crt > www.luck.com.crt
#使用cat命令将luck.com.crt和ca.crt两个文件的内容合并到一个新文件www.luck.com.crt中,这样做的目的是为了组合服务器证书和CA证书,使得Nginx或任何其他Web服务器能够通过单一文件提供完整的证书链给客户端,以便正确验证服务器证书
[root@liuyanfen12 nginx]#mv luck.com.key www.luck.com.key
#使用 mv 命令重命名luck.com.key为www.luck.com.key 为了与上面合并后的证书文件保持名称一致性,或者准备为www.dlsockerng.com子域名服务使用同一密钥对
[root@liuyanfen12 nginx]#ls
ca.crt  ca.key  certificate.sh  luck.com.crt  luck.com.csr  www.luck.com.crt  www.luck.com.key

image-20240503195855051

image-20240503200039116

4、准备nginx配置文件和dockerfile文件

[root@liuyanfen12 nginx]#ls
#上传nginx安装包,准备nginx.conf和Dockerfile文件
ca.crt  certificate.sh  luck.com.crt  nginx-1.12.0.tar.gz  www.luck.com.crt
ca.key  Dockerfile      luck.com.csr  nginx.conf           www.luck.com.key

#编辑dockerfile脚本
[root@liuyanfen12 nginx]#vim Dockerfile
FROM centos:7
MAINTAINER this is nginx image <nginx>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make openssl openssl-devel
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
#加载ngx_http_ssl_module模块,该模块是处理SSL/TLS连接所必需的
--with-http_stub_status_module;make -j4 && make install
ENV PATH /usr/local/nginx/sbin:$PATH
ADD nginx.conf /usr/local/nginx/conf/nginx.conf
ADD www.luck.com.crt /usr/local/nginx/conf/
ADD www.luck.com.key /usr/local/nginx/conf/
EXPOSE 80
EXPOSE 443
CMD [ "/usr/local/nginx/sbin/nginx","-g","daemon off;" ]

[root@liuyanfen12 nginx]#vim nginx.conf
#修改nginx.conf配置文件,在server模块中添加配置(35行-42行)
      server {
        listen       80;
        listen 443 ssl;
        ssl_certificate /usr/local/nginx/conf/www.luck.com.crt;
        ssl_certificate_key /usr/local/nginx/conf/www.luck.com.key;
        ssl_session_cache shared:sslcache:20m;
        ssl_session_timeout 10m;
        server_name  localhost;
--------------------------------------------------------------------------------------------------------
listen 443 ssl;
#这行指定Nginx监听443端口,并启用SSL支持。Web浏览器默认通过443端口建立HTTPS连接
ssl_certificate /usr/local/nginx/conf/www.dockerng.com.crt;
#指定SSL证书文件的路径,这个路径指向合并了服务器证书和CA证书链的文件(如果适用),以
#便客户端在验证服务器身份时使用。
ssl_certificate_key /usr/local/nginx/conf/www.dockerng.com.key;
#指定与上述证书匹配的私钥文件路径。此私钥用于加密和解密服务器与客户端之间的通信内容
ssl_session_cache shared:sslcache:20m;
#配置一个共享的SSL会话缓存,大小为20MB。该缓存可以提高性能,通过复用已存在的SSL会话
#信息来减少重新协商和加密操作的开销
ssl_session_timeout 10m;
#设置SSL会话超时时间为10分钟。这意味着,在无活动期间达到这个时间长度后,客户端必须与
#服务器重新建立新的SSL会话或者恢复先前的会话(如果仍然有效)。这个值可以根据实际需求调
#整以平衡安全性与性能。
--------------------------------------------------------------------------------------------------------

image-20240503195321818

image-20240503195114699

image-20240503194954794

5、创建nginx镜像与容器

[root@liuyanfen12 ~]#docker pull centos:7
#拉取基础镜像centos:7
[root@liuyanfen12 ~]#docker images
#查看基础镜像信息
[root@liuyanfen12 nginx]#docker  build -t nginx:centos .
#生成镜像
[root@liuyanfen12 nginx]#docker images
#显示镜像信息
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        centos    c3f56b07162d   25 seconds ago   592MB
centos       7         eeb6ee3f44bd   2 years ago      204MB
[root@liuyanfen12 nginx]#docker run -d --name nginx -p 80:80 -p 443:443 nginx:centos
#创建容器并指定映射端口
618a521cf19a57ada8db2769b38fafcd2b09ff0065c2aa879ca7aed5c3fdd779
[root@liuyanfen12 nginx]#docker ps -a
#显示所有容器信息
CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS         PORTS                                                                      NAMES
618a521cf19a   nginx:centos   "/usr/local/nginx/sb…"   4 seconds ago   Up 3 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   nginx

image-20240503191325193

image-20240503194658647

image-20240503192941835

6、验证访问

https://192.168.10.12/
#使用浏览器访问验证

image-20240503185215549