docker+nginx+https | 实现通过域名访问服务器资源

前言

先看看效果:

配置ssl域名证书

这个步骤开始之前,你需要有一个已备案好的域名,并拿到相应的ssl证书。

我采用的方案是使用本站的域名chenxuefan.cn去申请了一个二级域名,名字就长这样:api.chenxuefan.cn

我使用的是阿里云的云服务,域名、云服务器都通过阿里云购入,因此申请域名、域名解析、为域名申请ssl证书这些动作都在阿里云平台实现。

1. 获取一些nginx配置文件

考虑到后期需要方便配置与管理nginx容器,因此采用挂载数据盘的方式,把宿主机的目录跟nginx容器里的目录绑定一下。

首先我们需要准备一些nginx配置文件到宿主机的目录,操作如下

拉取一个最新的nginx镜像

docker pull nginx

新建几个目录用于存放nginx相关的文件

mkdir /home/nginx && cd $_ && mkdir -p {ssl,config,logs}

ssl放域名对应证书;config放nginx配置文件;logs放nginx日志

启动一个nginx容器用于cp容器中的一些文件到刚刚创建的三个目录下,用于后续挂载使用

docker run -itd --name my_nginx nginx
docker cp my_nginx:/etc/nginx/nginx.conf /home/nginx/config/
docker cp my_nginx:/etc/nginx/conf.d /home/nginx
docker cp my_nginx:/usr/share/nginx/html /home/nginx

cp结束后,可以删掉此容器了

docker stop my_nginx && docker rm my_nginx

2. 拷贝ssl证书至宿主机目录

在前几步的时候准备好的ssl证书文件,这时候需要派上用场了

image-20221109152005096

这两个文件(.key文件和.pem文件),把它们拷贝到服务器上的路径:/home/nginx/ssl

拷贝结束之后,证书的保存路径就相当于是:/home/nginx/ssl/api.chenxuefan.cn.key

而在后续通过挂载,宿主机上的/home/nginx/ssl目录映射到容器上的目录为/etc/nginx/ssl

因此经过挂载,证书在容器中的保存路径就相当于是:/etc/nginx/ssl/api.chenxuefan.cn.key

3. 编写nginx.conf文件

宿主机文件/home/nginx/config/nginx.conf挂载到了容器中的/etc/nginx/nginx.conf

因此需要在/home/nginx/config/nginx.conf按照如下格式修改nginx.conf 配置文件,80端口会自动转给443端口,这样就强制使用SSL证书加密了。访问http的时候会自动跳转到https上面。

证书的目录必须在ssl目录下面,其他目录启动可能会报找不到证书的错误。

user  nginx;
worker_processes  auto;
 
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
 
http {
    client_max_body_size 100m;
  include mime.types;
 
  server {
                listen 80;
                server_name api.chenxuefan.cn;  # 填写绑定证书的域名
                rewrite ^(.*) https://$server_name$1 permanent;
        }

  server {
        listen 443 ssl;  # 1.1版本后这样写
                server_name api.chenxuefan.cn;  # 填写绑定证书的域名

                ssl_certificate /etc/nginx/ssl/api.chenxuefan.cn.pem;  # 指定证书在容器中的位置,绝对路径
                ssl_certificate_key /etc/nginx/ssl/api.chenxuefan.cn.key;  # 绝对路径,同上

          ssl_session_timeout 5m;
                ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
                ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
                ssl_prefer_server_ciphers on;

        ssl_session_cache shared:SSL:1m;
 
                fastcgi_param  HTTPS        on;
                fastcgi_param  HTTP_SCHEME     https;



        location / {
                proxy_set_header   X-Real-IP         $remote_addr;
                proxy_set_header   Host              $http_host;
                proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
                root   /usr/share/nginx/html;
                try_files $uri $uri/ /index.html;
        }
    		
    		# 设置网页图标,favicon.ico文件存放地址:/usr/share/nginx/html
    		location = /favicon.ico {
       					root  /usr/share/nginx/html;
  			}
  }
 
    # 引入扩展配置(可以细分服务nginx)
    include /etc/nginx/conf.d/*.conf;
}

docker启动一个nginx容器

在上一步骤把所需的所有配置文件、证书文件都准备好之后,就可以启动一个nginx容器了,命令如下

docker run \
			--name nginx \
			-p 443:443 \
			-p 80:80 \
			-v /home/nginx/html:/usr/share/nginx/html:rw \
			-v /home/nginx/config/nginx.conf:/etc/nginx/nginx.conf:rw \
			-v /home/nginx/logs:/var/log/nginx:rw \
			-v /home/nginx/ssl:/etc/nginx/ssl:rw \
			--privileged=true \
			-d --restart=always \
			nginx 
  • --name nginx
  • -p 443:443 映射端口443,用于https请求
  • -p 80:80 映射端口80,用于http请求
  • -v /home/nginx/html:/usr/share/nginx/html nginx的默认首页html的存放目录映射到host盘的目录
  • -v /home/nginx/config/nginx.conf:/etc/nginx/nginx.conf/
  • -v /home/nginx/logs:/var/log/nginx/
  • -v /home/nginx/ssl:/etc/nginx/ssl/
  • --privileged=true
  • -d --restart=always

docker ps看一下成功了没

image-20221110000522868

成功映射了端口,再docker logs nginx看下日志

image-20221110000730384

也没报啥错误,再试一试curl一下

image-20221110000935130

成功访问:https://api.chenxuefan.cn

/home/nginx/html里丢一张图片main.jpg ,再试试访问这个图片资源地址

https://api.chenxuefan.cn/api/main.jpg


1526 字