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自動申請和續期證書。

這種方式看起來挺牛逼的,可以對多個容器進行代理,省去了一個一個配置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的配置應該是這樣的

端口映射
卷映射

容器配置

為了讓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'

最后,看看效果圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM