docker配置nginx并安装ssl证书
今日终于为我的个人网站 blackcardriver.cn 配置了ssl证书,虽然只是很简单的事情,但是由于对nginx的配置不够了解,
浪费了很多不该花的时间,经过这趟旅程,更加学会了解原理的重要性。。。
1. docker 中配置 nginx
想要配置nginx,首先要了解 nginx 的目录结构以及配置文件的位置,各个语句代表的含义。
nginx中有几个比较重要的配置文件:nginx.conf, default.conf …和一些比较重要的目录,例如日志的
输出目录。详情可以到这里看:nginx配置文件目录笔记
nginx.conf是最主要的配置文件,里面其中一些语句便指定了其他目录的一些配置文件,其中边包括了 default.conf.
刚安装好的nginx目录里的default.conf 去掉注释后是这样的 (注释占文件的大部分) :
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
我们在这里可以修改nginx 工作时监听的端口,还有你做好的网站放置的目录,还有指定找不到资源时返回的网页等。
一下是我的配置,仅供参考:
server {
listen 80; #监听端口
server_name l blackcardriver.cn; #站点名称
location / {
root /www; #首页所在的文件夹
index index.html index.htm; #首页位置
}
#指定若发生错误返回什么页面
error_page 500 502 503 503 404 /50x.html;
location = /50.html {
root /www;
}
}
如果你是直接在服务器中部署,可以直接修改default.conf。
下面谈谈在docker中配置nginx的方法。
docker中有几个特别重要的概率,其中有:
端口映射
目录挂载
因为docker容器是与主机隔绝的,若容器里的程序监听80端口,那么这个端口跟容器所在的主机端口没有
联系,除非你特别指明它。挂载也是同样的道理。nginx 容器里有很多跟宿主机目录相同的路径,需要区分
对待,除非你特别指明它,否则他们是相互隔离的。
一下是我的运行nginx的脚本:run-nginx.sh
sudo docker run --name nginx --rm -p 80:80 \
-v /home/ubuntu/DockerWorkPlace/Nginx/config:/etc/nginx/conf.d \
-v /home/ubuntu/DockerWorkPlace/Nginx/logs:/var/log/nginx \
-v /home/ubuntu/DockerWorkPlace/Nginx/www:/www \
nginx:latest
稍作解释:
-p 80:81 是指将本机的80端口分配给容器的81端口,想象一下,如果你是在主机中直接安装nginx,
那么想同时运行几个nginx服务是十分困难的,因为一个端口只能让一个程序占用。docker给这种情况
极大的遍历,你不需要修改代码甚至是配置,只需要将启动命令中前面的80改成其他就可以了,爽。
还有-v是挂载目录,我将配置文件的目录,还有放置网站的目录,以及查看日志的目录挂载出来了,
通过这样的方式来与容器进行交互。
2. 安装ssl证书
如果你的网站还是用http连接,那么在某些浏览器(例如火狐)中看网页是可能会被提示或警告连接不安全,
特别是在登录等页面,给用户带来十分不佳的体验。这时最好给服务器安装一个ssl证书。然后稍作配置,
这样下次就可以用https来进行连接。
获取证书的方法有很多,我申请不到半天就收到了申请成功的回复以下是证书的样子,blackcardriver.cn便是
申请证书的网站,注意申请时不要乱填。
然后在default.conf中稍作配置,加上在443端口监听的serve,注意http连接默认是80端口,https默认是443。
server{
listen 443 ssl;
#ssl on;
ssl_certificate /certificate/1_www.blackcardriver.cn_bundle.crt;
ssl_certificate_key /certificate/2_www.blackcardriver.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;
location / {
root /www;
index index.html;
}
error_page 500 502 503 503 404 /404x.html;
location = /404x.html {
root /emptypage;
}
}
注意,ssl_certificate后面跟的是证书的目录,自行设置。因为我的证书将放在容器外面,所以在启动的命令中还要将这个目录
挂载出去。不要忘记还要映射443端口。最后我的启动脚本是长这个样的:
最后,如果你想通过配置nginx来重定向http的请求到https,可以在监听80端口的那个serve中
加上:rewrite ^(.*) https://$host$1 permanent;
到此为止,本人菜鸟一只,若发现错漏之处望指出。