Docker使用nginx-proxy对Nextcloud进行https反向代理

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

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

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

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





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

Requirements:

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

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

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

若是能够申请多个二级证书或者*.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。apache

nginx-proxy

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





这样仅仅是启动了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支持,以及主机映射。





因此,最终nginx-proxy的配置应该是这样的

端口映射 卷映射

容器配置

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

Nextcloud配置

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

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

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

trusted_proxies 中添加代理地址

'overwriteprotocol' => 'https'

'overwritewebroot' => '/nextcloud'

最后,看看效果图

sudo apt install docker-compose80443jwilder/nginx-proxy docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy# 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/; } }
相关文章
相关标签/搜索