最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

為docker中的nginx配置https的方法步驟

 更新時間:2019年01月04日 10:15:23   作者:sparkdev  
這篇文章主要介紹了為docker中的nginx配置https的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

沒有 https 加持的網(wǎng)站會逐漸地被瀏覽器標(biāo)記為不安全的,所以為網(wǎng)站添加 https 已經(jīng)變得刻不容緩。對于商業(yè)網(wǎng)站來說,花錢購買 SSL/TLS 證書并不是什么問題。但對于個人用戶來說,如果能有免費(fèi)的 SSL/TLS 證書可用將會是非常幸福的事情! 就是一個提供免費(fèi) SSL/TLS 證書的網(wǎng)站,由于其證書期限只有三個月,所以需要我們用自動化的方式去更新證書。本文將介紹如何為通過 docker 運(yùn)行的 nginx 中的站點(diǎn)添加 https 支持,并自動完成證書的更新。本文的演示環(huán)境為:運(yùn)行在 Azure 上的 Ubuntu 16.04 主機(jī)(此圖來自互聯(lián)網(wǎng)):

準(zhǔn)備環(huán)境

在 Azure 上創(chuàng)建 Ubuntu 類型的虛機(jī)事件非常容易的事情,安裝 docker 也無須贅言。比較容易忽略的是配置合適的網(wǎng)絡(luò)安全組規(guī)則,比如打開 80 和 443 端口:

還有就是配置 DNS:

創(chuàng)建一個普通的 http 站點(diǎn)

簡單起見,直接使用一個鏡像中的 nodejs 應(yīng)用作為 web 站點(diǎn):

$ docker pull ljfpower/nodedemo
$ docker network create -d bridge webnet
$ docker run -d --restart=always --expose=3000 \
   --network=webnet --name=myweb \
   ljfpower/nodedemo

在用戶的家目錄下創(chuàng)建 nginx 目錄及其子目錄 conf.d、conf.crt 和 html,創(chuàng)建 logs 目錄及其子目錄 nginx 和 letsencrypt:

$ mkdir -p nginx/{conf.d,conf.crt,html}
$ mkdir -p logs/{nginx,letsencrypt}

說明,本文演示的示例中需要我們手動創(chuàng)建的文件和目錄結(jié)構(gòu)如下:

創(chuàng)建 nginx/nginx.conf 文件,內(nèi)容如下:

user nginx;
worker_processes auto;

error_log /var/log/nginx/error.log warn;
pid  /var/run/nginx.pid;

events {
 worker_connections 2048;
}

http {
 include  /etc/nginx/mime.types;
 default_type application/octet-stream;

 sendfile  on;
 keepalive_timeout 65;
 client_max_body_size 10M;

 include /etc/nginx/conf.d/*.conf;
}

然后創(chuàng)建 nginx/conf.d/default.conf 文件,內(nèi)容如下:

upstream web{
 server myweb:3000;
}
server {
 listen  80;
 listen  [::]:80;
 server_name filterinto.com www.filterinto.com;

 location ^~ /.well-known/acme-challenge/ {
  default_type "text/plain";
  root /usr/share/nginx/html;
 }
 location = /.well-known/acme-challenge/ {
  return 404;
 }
 location / {
  proxy_pass http://web;
 }
}

其中 /.well-known/acme-challenge/ 目錄是 certbot 工具在生成證書時創(chuàng)建的。接下來創(chuàng)建文件 nginx/html/index.html 文件,內(nèi)容如下:

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8" />
 <title>Let's Encrypt First Time Cert Issue Site</title>
</head>
<body>
 <h1>Hello HTTPS!</h1>
 <p>
  Just used for the very first time SSL certificates are issued by Let's Encrypt's
  certbot.
 </p>
</body>
</html>

這個頁面也是 certbot 在生成證書時需要用到的。最后讓我們啟動容器(在用戶的家目錄下執(zhí)行下面的命令):

$ docker run -d \
 -p 80:80 \
 -v $(pwd)/nginx/conf.d:/etc/nginx/conf.d:ro \
 -v $(pwd)/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
 -v $(pwd)/logs/nginx:/var/log/nginx \
 -v $(pwd)/nginx/html:/usr/share/nginx/html \
 --restart=always \
 --name=gateway \
 --network=webnet \
 nginx:1.14

注意:這時沒有映射 443 端口,也沒有掛載存放證書的目錄。只能以 http 協(xié)議訪問訪問我們的站點(diǎn):

為站點(diǎn)生成 SSL/TLS 證書

是一個提供免費(fèi) SSL/TLS 證書的網(wǎng)站,它為用戶提供了 certbot 工具用來生成 SSL/TLS 證書。方便起見,我們把 certbot 簡單的封裝到容器中。在用戶的家目錄下創(chuàng)建 certbot 目錄,進(jìn)入 certbot 目錄并把下面的內(nèi)容保存到 Dockerfile 文件中:

FROM alpine:3.4
RUN apk add --update bash certbot
VOLUME ["/etc/letsencrypt"]

然后執(zhí)行下面的命令創(chuàng)建 certbot 鏡像:

$ docker build -t certbot:1.0 .

然后在 certbot 目錄下創(chuàng)建自動更新證書的腳本 renew_cert.sh,內(nèi)容如下:

#!/bin/bash
WEBDIR="$1"
LIST=('filterinto.com' 'www.filterinto.com')
LED_LIST=()
WWW_ROOT=/usr/share/nginx/html
for domain in ${LIST[@]};do
 docker run \
  --rm \
  -v ${WEBDIR}/nginx/conf.crt:/etc/letsencrypt \
  -v ${WEBDIR}/logs/letsencrypt:/var/log/letsencrypt \
  -v ${WEBDIR}/nginx/html:${WWW_ROOT} \
  certbot:1.0 \
  certbot certonly --verbose --noninteractive --quiet --agree-tos \
  --webroot -w ${WWW_ROOT} \
  --email="nick.li@grapecity.com" \
  -d "$domain"
 CODE=$?
 if [ $CODE -ne 0 ]; then
  FAILED_LIST+=($domain)
 fi
done

# output failed domains
if [ ${#FAILED_LIST[@]} -ne 0 ];then
 echo 'failed domain:'
 for (( i=0; i<${#FAILED_LIST[@]}; i++ ));
 do
  echo ${FAILED_LIST[$i]}
 done
fi

在用戶的家目錄中執(zhí)行 ./renew_cert.sh /home/nick 命令就可以生成新的證書(/home/nick 為當(dāng)前用戶的家目錄)。生成的證書被保存在 /home/nick/nginx/conf.crt/live 目錄下,以域名命名的目錄下保存著該域名的證書:

然后去檢查下 nginx/html 目錄,發(fā)現(xiàn)多了一個隱藏的 .well-known 目錄,這個目錄就是在生成證書時創(chuàng)建的:

有了 SSL/TLS 證書,接下來我們就可以配置 https 站點(diǎn)了。

為站點(diǎn)配置 SSL/TLS 證書

有了 SSL/TLS 證書,接下來更新 nginx 的配置文件就可以了,更新 nginx/conf.d/default.conf 的內(nèi)容如下:

upstream web{
 server myweb:3000;
}

server {
 listen  80;
 listen  [::]:80;
 server_name filterinto.com www.filterinto.com;

 location ^~ /.well-known/acme-challenge/ {
  default_type "text/plain";
  root /usr/share/nginx/html;
 }
 location = /.well-known/acme-challenge/ {
  return 404;
 }
 return 301 https://$server_name$request_uri;
}
server {
 listen  443;
 listen  [::]:443;
 server_name filterinto.com;

 # enable ssl
 ssl      on;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;
 ssl_ciphers    "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

 # config ssl certificate
 ssl_certificate   conf.crt/live/filterinto.com/fullchain.pem;
 ssl_certificate_key  conf.crt/live/filterinto.com/privkey.pem;

 location ^~ /.well-known/acme-challenge/ {
  default_type "text/plain";
  root /usr/share/nginx/html;
 }
 location = /.well-known/acme-challenge/ {
   return 404;
 }
 location / {
  proxy_pass http://web;
 }
}
server {
 listen  443;
 listen  [::]:443;
 server_name www.filterinto.com;

 # enable ssl
 ssl      on;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;
 ssl_ciphers    "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";

 # config ssl certificate
 ssl_certificate   conf.crt/live/www.filterinto.com/fullchain.pem;
 ssl_certificate_key  conf.crt/live/www.filterinto.com/privkey.pem;

 location ^~ /.well-known/acme-challenge/ {
  default_type "text/plain";
  root /usr/share/nginx/html;
 }
 location = /.well-known/acme-challenge/ {
   return 404;
 }
 location / {
  proxy_pass http://web;
 }
}

然后刪除容器 gateway 并用下面的腳本重新創(chuàng)建:

$ docker run -d \
 -p 80:80 \
 -p 443:443 \
 -v $(pwd)/nginx/conf.d:/etc/nginx/conf.d:ro \
 -v $(pwd)/nginx/conf.crt:/etc/nginx/conf.crt:ro \
 -v $(pwd)/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
 -v $(pwd)/logs/nginx:/var/log/nginx \
 -v $(pwd)/nginx/html:/usr/share/nginx/html \
 --restart=always \
 --name=gateway \
 --network=webnet \
 nginx:1.14

現(xiàn)在就只能通過 https 來訪問站點(diǎn)了:

自動更新證書

Let's Encrypt 提供的 SSL/TLS 證書期限只有三個月,每過三個月要手動更新一次證書也夠嗆的,下面我們介紹自動更新證書的方法。

其實(shí)我們的配置已經(jīng)為自動化更新證書提供了最大的便利(其實(shí)是使用 docker 帶來的便利),在定時任務(wù)中添加下面兩條記錄就可以了:

0 0 1 * * /home/nick/certbot/renew_cert.sh /home/nick >> /home/nick/logs/cert.log 2>> /home/nick/logs/cert.error.log
0 1 1 * * docker exec gateway nginx -s reload

每月 1 號的 0 點(diǎn)更新證書,一個小時后 reload nginx 的配置。

總結(jié)

Let's Encrypt 是一個非常棒的網(wǎng)站,對于初學(xué)者和個人來說,能夠幫助我們輕松的實(shí)現(xiàn) HTTPS 站點(diǎn)(還是免費(fèi)的)!在方便的同時,其隱患也是顯而易見的:既然誰都可以無門檻的獲得 SSL/TLS 證書,那么非法網(wǎng)站也可以通過它把自己偽裝成看上去合法的站點(diǎn)。 所以千萬不要片面的認(rèn)為 HTTPS 站點(diǎn)就是安全的!

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Docker如何給Springboot項(xiàng)目動態(tài)傳參的實(shí)現(xiàn)方法

    Docker如何給Springboot項(xiàng)目動態(tài)傳參的實(shí)現(xiàn)方法

    這篇文章主要介紹了Docker如何給Springboot項(xiàng)目動態(tài)傳參的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 詳解docker容器分配靜態(tài)IP

    詳解docker容器分配靜態(tài)IP

    這篇文章主要介紹了詳解docker容器分配靜態(tài)IP,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • docker中Dockerfile方式建立鏡像HelloWorld

    docker中Dockerfile方式建立鏡像HelloWorld

    這篇文章主要介紹了docker中Dockerfile方式建立鏡像HelloWorld,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Docker使用Prune命令清理none鏡像

    Docker使用Prune命令清理none鏡像

    本文主要介紹了Docker使用Prune命令清理none鏡像,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Docker 容器編排利器Compose(起步篇)

    Docker 容器編排利器Compose(起步篇)

    這篇文章主要介紹了Docker 容器編排利器Compose(起步篇),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • docker?pull拉取鏡像報錯問題及解決

    docker?pull拉取鏡像報錯問題及解決

    這篇文章主要介紹了docker?pull拉取鏡像報錯問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • Docker容器鏡像相關(guān)命令基本介紹與使用

    Docker容器鏡像相關(guān)命令基本介紹與使用

    這篇文章主要為大家介紹了Docker容器鏡像相關(guān)命令的基本介紹與使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問題小結(jié)

    基于Docker部署Tomcat集群、 Nginx負(fù)載均衡的問題小結(jié)

    這篇文章主要介紹了基于Docker部署 Tomcat集群、 Nginx負(fù)載均衡,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • docker容器的創(chuàng)建及常用操作命令詳解

    docker容器的創(chuàng)建及常用操作命令詳解

    這篇文章主要為大家介紹了docker容器的創(chuàng)建及常用操作命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • docker?創(chuàng)建容器時指定容器ip的實(shí)現(xiàn)示例

    docker?創(chuàng)建容器時指定容器ip的實(shí)現(xiàn)示例

    在實(shí)際部署中,我們需要指定容器ip,本文主要介紹了docker?創(chuàng)建容器時指定容器ip,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評論

东台市| 平安县| 永年县| 巨野县| 巫溪县| 连州市| 攀枝花市| 腾冲县| 长宁县| 若尔盖县| 嘉义市| 荣昌县| 江津市| 木兰县| 息烽县| 宜昌市| 赤城县| 佛山市| 广平县| 上虞市| 阳城县| 浏阳市| 岫岩| 安陆市| 海兴县| 芜湖市| 礼泉县| 阳原县| 峡江县| 雷州市| 山东省| 随州市| 昭通市| 廉江市| 监利县| 武功县| 密山市| 涿州市| 咸丰县| 沙雅县| 丽水市|