一文教您如何經過 Docker 搭建反向代理 Ngnix,並配置 Https SSL 證書

歡迎關注我的微信公衆號: 小哈學Java, 每日推送 Java 領域乾貨文章,關注即免費無套路附送 100G 海量學習、面試資源喲!!

我的網站: https://www.exception.site/docker/how-to-config-ssl-with-docker-nginxhtml

1、背景

小哈最近收到阿里雲短信,提示個站 www.exception.site 的雲盾 SSL 證書(Https 證書)即將到期,須要趕快續費,否則沒法繼續使用 Https 協議來訪問網站!前端

這個 SSL 證書當時用的是阿里雲免費型的,有效期爲 1 年,到期後, 若是想繼續使用這個證書,就得續費,並且費用還不低!nginx

其實,要想繼續使用 Https 協議,咱們能夠在阿里雲上再次申請一張 SSL 證書就能夠了,時間一年,嗨呀,又能免費用一年。面試

本文小哈就主要介紹如何在 Ngnix 上配置 SSL 證書,從而讓咱們的網站可以使用 Https 來訪問,另外再附帶說一下如何配置反向代理。docker

2、Docker 快速安裝&搭建 Ngnix 環境

小哈的個站 Ngnix 搭建在容器當中,也就順便說一下如何經過 Docker 快速安裝&搭建 Ngnix 環境。安全

2.1 下載 Nginx 鏡像

docker pull nginx:alpine
PS:我這裏用的是 alipne 輕量級的鏡像.

下載完成後,經過 docker images 命令檢查一下鏡像是否下載成功:bash

檢查ngnix鏡像是否下載成功

2.2 先以簡單的方式運行鏡像

docker run -d -p 80:80 --name nginx nginx:alpine
  • -p 80:80: 將容器的 80 端口映射到宿主機的 80 端口上;
  • -d: 之後臺方式運行鏡像;
  • --name: 指定容器的名稱爲 nginx;

命令執行完成後,經過 docker ps命令確認一下容器是否啓動成功。確認成功後,再訪問一下 80 端口,看看 nginx 服務是否啓動成功:服務器

nginx訪問成功

2.3 複製相關配置文件至宿主機

複製運行中 nginx 相關配置文件到宿主機的指定路徑下:微信

# 複製名稱爲 nginx 容器中 /etc/nginx/nginx.conf 文件夾到宿主機的 /docker/nginx 路徑下
docker cp nginx:/etc/nginx/nginx.conf /docker/nginx
# 複製名稱爲 nginx 容器中 /etc/nginx/conf.d 文件到宿主機的 /docker/nginx 路徑下
docker cp nginx:/etc/nginx/conf.d /docker/nginx

複製完成後,查看指定路徑的配置文件,以下:session

3、配置 SSL

3.1 免費獲取 SSL 證書

訪問連接 https://common-buy.aliyun.com/?spm=5176.2020520163.cas.3.4bf91BFD1BFDcm&commodityCode=cas#/buy

PS: 注意,未註冊阿里雲帳號的童鞋,須要先註冊一個帳號喲~

選擇免費 DV SSL 證書 -> 當即購買,完成後,進入阿里雲後臺查看:

這裏須要申請簽發,填寫相關信息後,等待簽發經過便可。

簽發經過後,咱們下載證書:

這裏我選擇的是 Ngnix, 固然了,你也能夠選擇 Tomcat、Apache、IIS 等。

3.2 解壓上傳到服務器

下載下來後,解壓,咱們能夠看到包含兩個文件:

接下來,咱們先在容器的掛載目錄下建立 cert 證書目錄:

將解壓後的兩個文件上傳至該目錄中。

3.3 配置 Ngnix SSL

這裏須要說一下,小哈運行在 docker 容器中的 nginx 版本,信息以下:

由於個人 nginx 相對版本較高,可能和你們的配置文件目錄有些不一樣,但總體的沒啥大的問題,該怎麼配置,仍是怎麼配置:

首先建立 ssl.conf 配置文件,專門用來配置 ssl 相關參數:

server {
    listen 443 ssl http2;
    server_name  exception.site www.exception.site;

    client_max_body_size 4M;
    #charset koi8-r;
    #access_log  /var/log/nginx/host.access.log  main;

    ssl on;
    root html;
    index index.html index.htm;
    ssl_certificate /etc/nginx/cert/2256161_www.exception.site.pem;
    ssl_certificate_key  /etc/nginx/cert/2256161_www.exception.site.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

   location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        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://172.17.0.1:8090;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

根據阿里雲的文檔說明加上 ssl 相關參數,如 ssl 證書的兩個文件目錄,另外同時監聽 443 端口。

再貼下 defaut.conf 配置文件內容:

server {
    listen       80;
    server_name  exception.site www.exception.site;
    return 301 https://$host$request_uri;
}

能夠看到,主要對 http 80 端口主要作了一下 301 重定向,也就是說,若是前端使用的 http 訪問,這裏會重定向到 https 協議

4、配置反向代理

再來講說如何配置反向代理,先經過命令 ifconfig 命令獲取 docker0網卡的 ip 地址:

PS: 由於我須要反向代理的服務部署在本機的 Docker 容器中,因此用的這個 IP,若是你用的外網其餘地址,可自行修改。

因爲上面咱們已經新建了一個 ssl.conf 配置文件,這裏就直接將反向代理的配置寫在裏面:

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://172.17.0.1:8090;

經過配置,咱們反向代理到了 8090 端口的 Spring Boot 服務。

5、重啓 Nginx 容器

先刪除以前啓動的 nginx 容器:

docker rm -f nginx

成功後,回到配置文件的主目錄,執行:

docker run -d \ 
-p 80:80 -p 443:443 \ 
--name nginx \
-v /docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /docker/nginx/conf.d:/etc/nginx/conf.d \
-v /docker/nginx/logs:/var/log/nginx \
-v /docker/nginx/cert:/etc/nginx/cert \
nginx:alpine

參數說明:

  • -p 80:80 -p 443:443:將容器的 80、443 端口映射到主機的 80、443 端口;
  • -v /docker/nginx/nginx.conf:/etc/nginx/nginx.conf:將容器中的 /etc/nginx/nginx.conf 文件掛載到宿主機中的 /docker/nginx/nginx.conf 文件;
  • -v /docker/nginx/conf.d:/etc/nginx/conf.d:將容器中 /etc/nginx/conf.d 目錄掛載到宿主機中的 conf.d 目錄下;
  • -v /docker/nginx/logs:/var/log/nginx:將容器中的 /var/log/nginx 目錄掛載到宿主機中的 /docker/nginx/logs 目錄下, 用以查看 Nginx 日誌;
  • -v /docker/nginx/cert:/etc/nginx/cert: 將容器中的 /etc/nginx/cert 證書目錄掛載到宿主機中的 /docker/nginx/cert 證書目錄下;
注意:由於我使用的阿里雲服務器,同時還須要將 443 端口加入到安全組中,才能保證外界的正常訪問 https 端口

運行命令成功後,經過 https 協議來訪問咱們的網站域名 www.exception.site,看看是否可以正常訪問,而且方向代理到 8090 端口的 Spring Boot 服務上:

OK! 大工告成。

六 、最後

本文中,咱們學習瞭如何經過 Docker 快速搭建 Nginx 環境,並對其配置 SSL 證書和反向代理,讓網站可以以 Https 協議來訪問。但願童鞋們看完本文可以有所收穫,下期見~

免費分享 | 面試&學習福利資源

最近在網上發現一個不錯的 PDF 資源《Java 核心知識&面試.pdf》分享給你們,不光是面試,學習,你都值得擁有!!!

獲取方式: 關注公衆號: 小哈學Java, 後臺回覆資源,既可免費無套路獲取資源連接,下面是目錄以及部分截圖:

關注微信公衆號【小哈學Java】,回覆【資源】,便可免費無套路領取資源連接哦

關注微信公衆號【小哈學Java】,回覆【資源】,便可免費無套路領取資源連接哦

關注微信公衆號【小哈學Java】,回覆【資源】,便可免費無套路領取資源連接哦

關注微信公衆號【小哈學Java】,回覆【資源】,便可免費無套路領取資源連接哦

關注微信公衆號【小哈學Java】,回覆【資源】,便可免費無套路領取資源連接哦

關注微信公衆號【小哈學Java】,回覆【資源】,便可免費無套路領取資源連接哦

重要的事情說兩遍,關注公衆號: 小哈學Java, 後臺回覆資源,既可免費無套路獲取資源連接 !!!

歡迎關注微信公衆號: 小哈學Java

關注微信公衆號【小哈學Java】,回覆【資源】,便可免費無套路領取資源連接哦

相關文章
相關標籤/搜索