最近想在给blog挪个窝,于是想再安装一下nginx并配置下ssl. 我的服务器操作系统是CentOS 7.6 64bit,Docker版本Docker CE 19.03.9
开始安装nginx。 1、直接拉取最新的nginx镜像
docker pull nginx:1.22.0
2、新建一些目录,把nginx容器内的相关文件夹挂载到宿主机上,主要方便改写配置,其次是删除容器,这些文件不会丢失
mkdir -p /usr/local/nginx/{conf,html,logs,ssl}
3、启动一个nginx容器,用来cp一些文件,放到步骤2新建的文件夹里面
docker run --name nginx -p 80:80 -d nginx:1.22.0
4、把容器内的配置文件复制到宿主机内 可以简单看一下容器内文件夹详情,顺便说个题外话,直接使用wget安装nginx-1.22.x版本的话,nginx目录都是放在/usr/local/nginx下面的,但是docker安装的还是和老版本nginx一样的目录。
docker cp a25b9f301349:/etc/nginx/nginx.conf /usr/local/nginx/conf/
docker cp a25b9f301349:/etc/nginx/conf.d /usr/local/nginx/
5、停止当前nginx容器,并删除
docker stop a25b9f301349
docker rm a25b9f301349
6、生成证书并放到宿主机ssl目录下面
关于证书怎么生成,可以看一下https://console.dnspod.cn/dns/springboothub.com/record?source=cloud
7、修改配置文件
可以看到配置文件有两个,现在只需要修改default.conf文件就可以了。原因嘛可以看下图:
vim nginx.conf
就是说不管叫不叫default.conf,只要在conf.d目录下面,都会被加载
vim conf.d/default.conf
upstream springboothub.com {
server 101.xx.xxx.xxx:port(公网ip和应用端口) weight=1;
}
server {
listen 80;
listen [::]:80;
server_name springboothub.com *.springboothub.com;
rewrite ^(.*) https://$server_name$1 permanent;
#access_log /var/log/nginx/host.access.log main;
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass https://springboothub.com;
proxy_redirect default;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 443 ssl;
server_name www.springboothub.com;
ssl_certificate /etc/nginx/ssl/Nginx/springboothub.com_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/Nginx/springboothub.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
#root /usr/share/nginx/html;
#index index.html index.htm;
proxy_pass http://springboothub.com;
proxy_redirect default;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
8、启动新的nginx容器
docker run --name nginx -p 443:443 -p 80:80 \
-v /usr/local/nginx/logs:/var/log/nginx \
-v /usr/local/nginx/html:/usr/share/nginx/html \
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /usr/local/nginx/conf.d:/etc/nginx/conf.d \
-v /usr/local/nginx/ssl:/etc/nginx/ssl/ \
--privileged=true -d --restart=always nginx:1.22.0
简单解释一下:
- -v:挂载宿主机的目录,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录;
- -d:后台运行;
- --restart=always:重启docker时,自动重启改容器;
说到这里,有一个点需要注意一下,就是上面的defaul.conf文件中,出现的绝对路径都是容器内的路径,而不是宿主机的,比如说配置ssl时:
ssl_certificate /etc/nginx/ssl/Nginx/springboothub.com_bundle.crt;
ssl_certificate_key /etc/nginx/ssl/Nginx/springboothub.com.key;
只不过在run时,-v /usr/local/nginx/ssl:/etc/nginx/ssl/,把目录挂载起来了,让容器可以读到证书,如果说改成这样的配置:
ssl_certificate /usr/local/nginx/ssl/Nginx/springboothub.com_bundle.crt;
nginx是无法启动的,会报错找不到文件。
好了,nginx启动成功加上https验证访问下
ok没问题,今天就先到这里
更新
今天发现证书过期了,需要更换新的ssl证书,很简单,用sftp工具登录上去后,cd至/usr/local/nginx/ssl/Nginx,直接从本地将下载好的最新ssl证书拖至服务器替换
最后执行以下命令:
#验证配置文件问题
docker exec nginx_1.22.0(容器名) nginx -t(nginx容器外执行,容器内执行nginx -t)
#验证没问题,重新加载新配置,Nginx可以hot-reload配置而不重新启动
docker exec nginx_1.22.0(容器名) nginx -s reload(nginx容器外执行,容器内执行nginx -s reload)
等待5分钟就生效了。
ps:关于Nginx 服务器 SSL 证书安装部署可以参考下这里https://cloud.tencent.com/document/product/400/35244
---------------完-----------------
注意:本文归作者所有,未经作者允许,不得转载