Keywords: docker, nginx, 反向代理, ssl证书
前言: 本篇记录自己为nginx配置ssl证书,以及开启其反向代理服务。
若还未部署nginx,可以参考我写的上一篇Docker部署nginx(基础)
Docker部署nginx(进阶)
申请阿里云免费DV证书并下载
参考阿里云帮助文档:
- 申请免费DV证书
- 下载证书
- 在nginx上安装证书(这篇不看问题不大)
上传证书到服务器
假设:
- SSl证书上传至
/home
目录 - 压缩包名为
4389002_www.domain.com_nginx.zip
- 正在运行的容器名为nginx
# 若没有zip和unzip软件,执行以下指令
yum install -y zip unzip
# 解压
unzip 4389002_www.domain.com_nginx.zip
# 将会得到4389002_www.domain.com_nginx.pem
# 和 4389002_www.domain.com_nginx.key,
# 其中pem使公钥,key使密钥
# 将zip文件移走,然后该目录仅保留pem和key文件
mv 4389002_www.domain.com_nginx.zip ../
进入nginx容器
# 进入nginx容器
# i表示交互,t表示开启终端,bash表示操作终端指令的shell
docker exec -it nginx bash
# 进入/etc/nginx,创建cert目录然后退出
cd /etc/nginx
mkdir cert
exit
将SSl证书复制进容器
# 当前目录仅有key和pem文件
docker cp * nginx:/etc/nginx/cert
配置本地挂载nginx配置文件
- 进入
nginx-data/conf.d
目录 - 新增一个ssl.conf文件,并新增如下内容
server {
listen 443 ssl;
server_name www.domain.com;
ssl_certificate /etc/nginx/cert/4389002_www.domain.com.pem;
ssl_certificate_key /etc/nginx/cert/4389002_www.domain.com.key;
ssl_session_timeout 2m;
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 /usr/share/nginx/html;
index index.html index.htm;
}
}
注意: server_name对应的域名必须和证书保持一致,因为此证书是免费DV证书,仅支持一个证书对应一个单域名。
检查配置并重写加载:
# 检查配置文件
docker exec nginx /etc/init.d/nginx configtest
# 重写加载配置文件
docker exec nginx /etc/init.d/nginx reload
测试
测试前检查
-
检查容器是否暴露443端口
-
检查防火墙和安全组是否放行443端口
测试网站
- 在服务器上可以执行指令
curl https://localhost
- 在个人电脑浏览器上输入
https://www.domain.com
访问网站内容
开启反向代理服务
假设:
- 6666端口运行主网站服务
- 6667端口运行博客服务
- 6668端口运行提供API的后台应用服务
- 仅开启80端口的代理服务(其它类比即可)
须知
nginx是基于http协议实现的一个软件,其功能是符合http协议标准的,nginx实现反向代理是通过host(主机名)或URI(资源定位符)实现的。因此,nginx实现反向代理一般有以下几种情况:
- 将server_name对应的域名与对应的服务建立映射(类比修改host)。
- 将localtion对应的资源定位符与对应的服务建立映射(类比修改URI)。
- 二者混合使用。
新增配置文件
在conf/conf.d
目录下新增proxy.conf文件
示例
# 1.仅修改server_name字段
server
{
listen 80;
server_name www.domain.com;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://138.159.246.111:6666;
}
}
# 2.仅修改localtion字段
server
{
listen 80;
server_name www.domain.com;
location /blog {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://138.159.246.111:6667;
}
}
# 3.混合使用
server
{
listen 80;
server_name help.domain.com;
location /docs/api {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://138.159.246.111:6668;
}
}
注意:上面仅参考示例,必要时可能需要新增字段,例如443端口可能还需要配置ssl证书,部分API可能要限制Method等。
转载申明
本文转载自智小约的Docker部署nginx(基础),若转载请注明来源,侵删。
网友评论