Docker使用nginx

Stella981
• 阅读 675

安装完Nextcloud之后,下一步就是启用https了。在不使用Docker的时候,一般都是去服务器(如apache)里面启用https功能并添加证书,但是我在 https://hub.docker.com/_/nextcloud 下面的介绍里面并没有发现相关的说明,相反那儿却给出了使用  nginx-proxy 和docker-letsencrypt-nginx-proxy-companion 进行反向代理的方式。这种方式使用nginx-proxy建立一个代理服务器,自动查询docker内部的容器并转发请求,而且配合letsencrypt自动申请和续期证书。

这种方式看起来挺牛逼的,可以对多个容器进行代理,省去了一个一个配置https的麻烦,这么好的东西,开干啊!

当然事情不可能那么顺利,前面有坑在等着呢。

https://github.com/nextcloud/docker/tree/master/.examples 上面说要用docker-compose来安装,那么就安装吧。安装方法有很多种,有到github上面下载的,有用python安装pip后在安装的。其实,用ubuntu的话,直接通过下面一条命令就可以了。

sudo apt install docker-compose

顺便查了下docker-compose,其实是用来管理多个镜像的,把原来需要一个个需要手动启动配置的容器操作简化了。然后看了下 jwilder/nginx-proxy 和jrcs/docker-letsencrypt-nginx-proxy-companion。前面的一大堆说明都还好,操作起来应该没问题,但是后面的一看就有问题了,

Requirements:

  • Your host must be publicly reachable on both port 80 and 443.

需要公网80和443端口,这就坑爹了,看来免费的ssl证书没法用了。(有公网IP的可以按照文档继续试试,反正到这步我就停了)

之前在阿里云买了个域名,可以申请一个免费证书,但是只是二级域名的,那就使用这个证书看看能不能在nginx-proxy中使用。

如果可以申请多个二级证书或者*.domain.com类型的证书,可以实现https://a.domain.com,https://a.domain.com这样的访问,域名和容器一一对应;如果只有一个二级证书,那么只能实现https://a.domain.com,但是可以在后面添加路径,然后借助nginx-proxy代理到不同的容器上面,即https://a.domain.com/nextcloud,https://a.domain.com/wordpress。

nginx-proxy

既然无法使用let's encrypt申请证书,那么就只能直接使用nginx-proxy来进行代理了。拉取镜像启动容器,直接用portainer或者命令行就行了,没必要用docker-compose了。

jwilder/nginx-proxy
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

这样仅仅是启动了http代理,并没有启动https,启动https需要另外进行以下操作,

  • 映射443端口

  • 添加证书路径到/etc/nginx/certs,这个可以直接映射主机证书路径

  • 证书按照foo.bar.com.crt 和foo.bar.com.key的格式命名,阿里云下载的证书需要手动把pem后缀改为crt后缀。

接下来进行代理配置,修改nginx的配置文件,映射自定义的proxy.conf到/etc/nginx/proxy.conf,配置里面主要是添加https支持,以及主机映射。

# HTTP 1.1 support
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $proxy_connection;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;
proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;

# Mitigate httpoxy attack (see README for details)
proxy_set_header Proxy "";

server {
    server_name foo.bar.com;
    listen 443 ssl http2 ;
    access_log /var/log/nginx/access.log vhost;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    ssl_session_timeout 5m;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    ssl_certificate /etc/nginx/certs/foo.bar.com.crt;
    ssl_certificate_key /etc/nginx/certs/foo.bar.com.key;
    add_header Strict-Transport-Security "max-age=31536000" always;
    location /nextcloud/ {
        proxy_pass http://nextcloud.bar.com/;
    }
}

所以,最终nginx-proxy的配置应该是这样的

Docker使用nginx端口映射

Docker使用nginx卷映射

容器配置

为了让nginx-proxy找到代理对象,需要在创建容器的时候添加环境变量,如VIRTUAL_HOST=nextcloud.bar.com,下面是nextcloud的配置。

Docker使用nginx

Nextcloud配置

经过上述配置,nginx-proxy应该已经可以正常进行https代理了,但是对于nextcloud还需要进行额外的设置。

编辑/nextcloud/config/config.php文件,

'trusted_domains' 中添加域名foo.bar.com

trusted_proxies 中添加代理地址

'overwriteprotocol' => 'https'

'overwritewebroot' => '/nextcloud'

最后,看看效果图

Docker使用nginx

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解
Opencv中Mat矩阵相乘——点乘、dot、mul运算详解2016年09月02日00:00:36 \牧野(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fme.csdn.net%2Fdcrmg) 阅读数:59593
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这