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证书文件,这时候需要派上用场了
这两个文件(.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
看一下成功了没
成功映射了端口,再docker logs nginx
看下日志
也没报啥错误,再试一试curl一下
成功访问:https://api.chenxuefan.cn
往/home/nginx/html
里丢一张图片main.jpg
,再试试访问这个图片资源地址