2018-03-20

好久没有搞站点,是协助建立3Dslicer中国站点的过程中,对wordpress和discourse产生了兴趣,进而着迷于docker的学习和使用。

本来想用docker镜像来建立webproxy,但是配置了最为流行的glype,使用起来不满意。遂着手使用nginx进行反向代理,跨过多个大坑,终于搞定配置。

主要是proxy_pass不直接支持参数,需要配置resolver域名解析。以下为配置模板,具体命令意义查询网络。

内网穿透访问外网,直接在内网将域名解析到外网服务器地址(网闸放过),nginx.conf配置里面去除proxy.yakeworld.top,测试可行。

server_name设置匹配通用域名,还可以搞成透明穿透代理。

server {
listen       80 ;
server_name "~^(?.+)\.proxy\.yakeworld\.top$";
resolver 8.8.8.8;
location  /  {
subs_filter_types text/css text/xml;
subs_filter //([^/'":]+)/  //$1.proxy.yakeworld.top/ irg;
proxy_set_header Accept-Encoding "";
proxy_pass http://$name;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Cookie $http_cookie;
proxy_redirect http://$name/ http://$name.proxy.yakeworld.top/;
proxy_redirect http://$name:80/ http://$name.proxy.yakeworld.top/;
}
}

为了一劳永逸解决医院内网访问外网文献数据库问题,利用nginx来作为反向代理,使用ngx_http_substitutions_filter_module来进行网址替换,增加SSL访问支持。

首先确保80端口和443端口没有被占用,关闭有关容器。

docker run --rm -p 80:80 -p 443:443 \
-v /var/nginx/letsencrypt:/etc/letsencrypt \
quay.io/letsencrypt/letsencrypt auth \
--standalone -m someone@email.com --agree-tos \
-d your.domain1.com -d your.domain2.com

--rm选项表示容器运行结束后自动删除;两个-p选项表示映射主机的两个端口,因为certbot需要通过这两个端口来做验证,这里需要注意的是,我的nginx容器已经占用了这两个端口,因此在申请证书之前,需要先停止nginx容器;-v选项表示映射磁盘数据卷,因为certbot会将所有信息保存在/etc/letsencrypt目录中,我们需要让这个目录的内容持久化并可以从主机以及其他容器(主要是nginx容器)访问它。

证书签发之后,会存放到/etc/letsencrypt目录中,刚才我们映射了数据卷,因此可以直接从宿主机中看到这个目录中的内容,其中证书位于/etc/letsencrypt/live/your.domain1.com中。接下来需要让nginx容器也能够读取这些证书,方法放简单,把这个目录映射给nginx容器就可以了:

docker run --name nginx-cnki -p 80:80 -p 443:443 \
-v /var/nginx/conf.d:/usr/local/nginx/conf.d \
-v /var/nginx/letsencrypt/archive:/usr/local/nginx/external \
yakeworld/nginx-cnki

第一个-v是存放nginx配置文件的目录,第二个-v就是存放证书的目录,接下来我们在网站的配置文件里把证书配上去

server {
listen 443 ssl;
server_name www.google.co.uk.proxy.yakeworld.top;
resolver 8.8.8.8;
ssl_certificate /usr/local/nginx/external/www.youtube.com.proxy.yakeworld.top/fullchain.pem;
ssl_certificate_key /usr/local/nginx/external/www.youtube.com.proxy.yakeworld.top/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
location / {
subs_filter_types text/css text/xml;
subs_filter //([^/'"]+) //$1.proxy.yakeworld.top irg;
proxy_set_header Accept-Encoding "";
proxy_pass https://www.google.co.uk;
proxy_redirect https://www.google.co.uk/ https://www.google.co.uk.proxy.yakeworld.top/;
}
}

配置文件主要就是ssl_certificate和ssl_certificate_key两行,第一行是提供给客户端的公钥(证书),第二行是服务器用来解密客户端消息的私钥(私钥不会,也不应该在网络上传输)。后面第二个server块是将直接用HTTP的访问重定向到HTTPS连接上。

修改好配置文件之后重启nginx容器,顺利的话网站就可以通过HTTPS访问了,可以通过浏览器看一下证书信息,颁发者是Let's Encrypt Authority X3,它的根CA是DST,即IdenTrust,这是一个为银行和金融提供证书的可信CA,通过和IdenTrust交叉验证,Let's Encrypt的证书可以在各种浏览器上确保可信。不过Let's Encrypt签发的证书是短效证书,有效期只有3个月,但没关系,我们可以通过一个简单的命令对证书进行更新,同样是通过docker容器来运行:

docker run --rm -p 80:80 -p 443:443 \
-v /var/nginx/letsencrypt:/etc/letsencrypt \
quay.io/letsencrypt/letsencrypt renew \
--standalone

运行这个命令时,certbot会自动检查确认证书有效期,如果过期时间在一个月之内,就会自动更新。在CoreOS中,由于没有Cron,我们需要通过systemd的timer来做定时调度,比如每个月运行一次这个renew任务就可以了,不过记得运行之前先停止nginx容器,运行之后再启动nginx容器。

除了standalone方式验证之外,还可以使用wwwroot方式来做验证,但在我的环境中,nginx容器只是反向代理,本身没有wwwroot,因此standalone方式比较简单,当然缺点是每次签发和更新证书都要先停止nginx容器,这会造成网站服务中断。如果需要保证服务不中断,可以为nginx容器单独配一个验证用的wwwroot。

配置参考文章:http://www.ituring.com.cn/article/217692

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • SharedPreference的使用SharedPreference的功能是记住你想要记住的内容记忆内容使用方法...
    安多人阅读 108评论 0 0
  • 鹧鸪天·代人赋 ——辛弃疾 晚日寒鸦一片愁,柳塘新绿却温柔。 ...
    我是小小生阅读 511评论 0 0
  • 跑了快7年,从来没想过会分开。 也许对爱情来说,7年真的是个魔咒。上次几个人一起打火锅时,师姐还戏谑着说 第7年,...
    Candyee阅读 373评论 0 2
  • 夏季的夜晚,月亮挂在天上,周围的云儿一丝丝一朵朵全看得见。月光从葡萄叶的缝隙里倾洒下来。奶奶坐在葡萄藤下,摇着一把...
    长亭外的夏小乔阅读 1,012评论 143 128