背景
1、Halo搭建网站后,访问需要url+port,比较麻烦
2、网站连接不安全
所以用nginx进行端口转发,配置SSL证书,提升网站安全性
不喜欢折腾的可以安装Nginx Proxy Manager
可以进行nginx便捷管理和SSL快速申请配置,参考文档为 与 Nginx Proxy Manager 配合使用:https://docs.halo.run/getting-started/install/other/nginxproxymanager
安装nginx
启动一个test_nginx容器
这一步主要为了查看下nginx容器的目录
docker run -p 7000:80 --name test_nginx -d nginx # 7000端口是可以任意没有被占用的端口,80是nginx容器内部端口
查看test_nginx容器目录
docker ps |grep test_nginx #查看容器进程是否存在
docker exec test_nginx ls -l /etc/nginx /etc/nginx/conf.d /var/log/nginx /usr/share/nginx/html #查看nginx容器的目录
创建nginx目录
mkdir -p /usr/local/software/nginx
cd /usr/local/software/nginx
mkdir -p conf/conf.d html logs # 创建本地nginx的文件,用于挂载
拷贝test_nginx容器内nginx.conf
配置文件,不用自己额外编写
docker cp test_nginx:/etc/nginx/nginx.conf /usr/local/software/nginx/conf/
停止并删除test_nginx容器目录
docker stop 183d40db113d && docker rm 183d40db113d #可以通过容器id或容器名删除
编写docker-compose.yml文件
在nginx目录新建docker-compose.yml
文件,并添加内容
cd /usr/local/software/nginx
vim docker-compose.yml
version: '3.9' #指定compose引擎版本
services: #服务根节点
web: #jenkins服务/其他服务(web服务/nginx服务等)
image: nginx #nginx镜像,如果镜像容器没有会去自动拉取,没写版本默认拉latest
container_name: babajaja-nginx #容器的名称
restart: always #跟随docker的启动而启动
volumes: #挂载卷命令
- /usr/local/software/nginx/conf/nginx.conf:/etc/nginx/nginx.conf #映射配置文件入口文件
- /usr/local/software/nginx/conf/conf.d/:/etc/nginx/conf.d #映射配置文件
- /usr/local/software/nginx/logs:/var/log/nginx #日志文件挂载
- /usr/local/software/nginx/html:/usr/share/nginx/html #静态资源根目录挂载
ports:
- "80:80" #端口映射
- "443:443"
运行nginx容器
docker-compose up -d
可以通过docker ps
和docker logs
查看容器进程和日志
docker ps
docker logs
配置端口转发
添加配置
到nginx配置文件目录下,创建配置文件halo.conf
cd /usr/local/software/nginx/conf/conf.d
vim halo.conf
添加内容
#80端口转发8090
server {
listen 80;
server_name babajaja.cn;
location / {
proxy_pass http://babajaja.cn:8090;
}
}
nginx重新加载配置
docker exec babajaja-nginx nginx -t
docker exec babajaja-nginx nginx -s reload
这样端口转发就配好了
配置SSL
SSL证书申请
我的域名是腾讯云上管理的,所以在腾讯云的SSL 证书控制台进行免费证书申请
下载SSL证书
正式申请成功后,就可以进行下载了,我们选择nginx类型进行下载
下载解压后你就会获得四个文件
上传SSl证书到nginx上
在下载的四个文件中,需要将*.crt证书文件和*.key私钥文件上传到nginx所在机器上
我这边放在/usr/local/software/nginx/conf/conf.d
目录下,目录的要求是需要有挂载到nginx容器上,上传的证书文件才会同步到容器里
添加SSL配置
修改halo.conf
文件,添加SSL配置内容
cd /usr/local/software/nginx/conf/conf.d
vim halo.conf
添加内容:
#443端口转发7018
server {
#listen 80;
listen 443 ssl;
#请填写绑定证书的域名
server_name babajaja.cn;
#请填写证书文件的相对路径或绝对路径
ssl_certificate /etc/nginx/conf.d/babajaja.cn_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /etc/nginx/conf.d/babajaja.cn.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://babajaja.cn:8090;
}
}
因为HTTPS 默认端口443
所以需要将端口80
监听改为端口443
端口监听。需保证Nginx 服务器上开启443
端口。
*.crt和*.key文件的路径是容器里的路径
nginx重新加载配置
docker exec babajaja-nginx nginx -t
docker exec babajaja-nginx nginx -s reload
到浏览器查看结果,连接已经是安全的了
问题记录
1、启动nginx容器并挂载容器中的nginx.conf文件报错
docker run -p 7000:80 --name test_nginx -v /tmp/test_nginx/nginx.conf:/etc/nginx/nginx.conf -d nginx
报错信息:
# docker run -p 7000:80 --name test_nginx -v /tmp/test_nginx/nginx.conf:/etc/nginx/nginx.conf -d nginx
9897d528bc6ce7e33b8aebaa15e023bbf1b3886bf62ef9ab9765401cc8a8580e
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/tmp/test_nginx/nginx.conf" to rootfs at "/etc/nginx/nginx.conf": mount /tmp/test_nginx/nginx.conf:/etc/nginx/nginx.conf (via /proc/self/fd/6), flags: 0x5000: not a directory: unknown: 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.conf
先从容器中复制 nginx.conf 出来
然后可以自行修改 nginx.conf,自定义配置项
创建正式使用的 nginx 容器
参考文档
docker-compose安装nginx:https://juejin.cn/post/7312035956189364233
Docker - 解决创建 nginx 容器尝试挂载 nginx.conf 文件时报错:https://www.cnblogs.com/poloyy/p/15488899.html
Nginx 服务器 SSL 证书安装部署(Linux):https://cloud.tencent.com/document/product/400/35244
评论区