Docker部署nginx(进阶)

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实现反向代理一般有以下几种情况:

  1. 将server_name对应的域名与对应的服务建立映射(类比修改host)。
  2. 将localtion对应的资源定位符与对应的服务建立映射(类比修改URI)。
  3. 二者混合使用。

新增配置文件

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(基础),若转载请注明来源,侵删。

你可能感兴趣的:(Docker部署nginx(进阶))